{"about":{"site":"https://codewithpapers.app","non_affiliation":"Code with Papers and Syntology are not affiliated with, endorsed by, or sponsored by Papers with Code, Meta, or the pwc-archive mirror.","licence":"CC BY-SA 4.0","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","attribution":"https://codewithpapers.app/attribution","modified":"archive material modified by Syntology; see the attribution page"},"url":"/paper/arxiv-2605-02815","title":"FlexSQL: Flexible Exploration and Execution Make Better Text-to-SQL Agents","arxiv_id":"2605.02815","date":"2026-05-04","proceeding":null,"authors":["Quang Hieu Pham","Yang He","Ping Nie","Canwen Xu","Davood Rafiei","Yuepeng Wang","Xi Ye","Jocelyn Qiaochu Chen"],"abstract":"Text-to-SQL over large analytical databases requires navigating complex schemas, resolving ambiguous queries, and grounding decisions in actual data. Most current systems follow a fixed pipeline where schema elements are retrieved once upfront and the database is only revisited for post-hoc repair, limiting recovery from early mistakes. We present FlexSQL, a text-to-SQL agent whose core design principle is flexible database interaction: the agent can explore schema structure, inspect data values, and run verification queries at any point during reasoning. FlexSQL generates diverse execution plans to cover multiple query interpretations, implements each plan in either SQL or Python depending on the task, and uses a two-tiered repair mechanism that can backtrack from code-level errors to plan-level revisions. On Spider2-Snow, using gpt-oss-120b, FlexSQL achieves a 65.4\\% score, outperforming strong open-source baselines that use stronger, larger models such as gpt-o3 and DeepSeek-R1. When integrated into a general-purpose coding agent (as skills in Claude Code), our approach yields over 10\\% relative improvement on Spider2-Snow. Further analysis shows that flexible exploration and flexible execution jointly contribute to the effectiveness of our approach, highlighting flexibility as a key design principle. Our code is available at: https://github.com/StringNLPLAB/FlexSQL","url_abs":"https://arxiv.org/abs/2605.02815","url_pdf":"https://arxiv.org/pdf/2605.02815","source":{"archive":null,"snapshot":"2025-07-28","note":"not in the Papers with Code archive (frozen at the snapshot)","row_kind":"graph","title_abstract_authors_date":"arXiv metadata, CC0 1.0 (https://info.arxiv.org/help/license)"},"code_links":[],"tasks":[],"methods":[],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"syntology_url":"https://syntology.ai/paper/2605.02815","atlas_url":"https://app.syntology.ai/?focus=2605.02815","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2605.02815"}},"developers":"https://syntology.ai/developers","read_at":"2026-09-25T09:33:49+00:00","read_at_is":"when the build read Syntology's graph, not when any sample ran","claim":"Per-sample execution status on synthesized fixtures; not a correctness claim about the paper. Samples come from repositories linked to the paper, official or community; repo_kind says which.","repos":[{"mentioned_in_github":null,"is_official":null,"provenance":"deterministic:regex_extraction","mentioned_in_paper":null,"url":"https://github.com/StringNLPLAB/FlexSQL","reach":null}],"summary":{"ran_draft_wrong":9,"ran_honours":1,"unverified":3},"by_repo_kind":{"found_in_text":{"samples":13,"ran":10,"repositories":1}},"repo_kind_vocabulary":{"official":"The archive marks this repository official for the paper","named_in_paper":"The archive records that the paper mentions this repository; it is not marked official","listed":"In the archive's code links for this paper, not marked official and not recorded as mentioned in the paper","found_in_text":"Syntology found this repository in the paper's own text; whether it is the authors' implementation is not asserted","community":"Not in the archive's code links for this paper; a community repository Syntology harvested"},"n_pointer_only_for_licence":13,"samples":[{"code_sha256_prefix":"4ef61e098f5d60f5","entry":"_get_table_overview_str","repo":"StringNLPLAB/FlexSQL","repo_kind":"found_in_text","path":"src/planning.py","file_url":"https://github.com/StringNLPLAB/FlexSQL/blob/HEAD/src/planning.py","link_basis":"first_harvest_node","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"OUTPUT_MISDECLARED","metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"4ef61e098f5d60f5"}},{"code_sha256_prefix":"0fc76891da04e4c3","entry":"_parse_plan_candidates","repo":"StringNLPLAB/FlexSQL","repo_kind":"found_in_text","path":"src/planning.py","file_url":"https://github.com/StringNLPLAB/FlexSQL/blob/HEAD/src/planning.py","link_basis":"first_harvest_node","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"OUTPUT_MISDECLARED","metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"0fc76891da04e4c3"}},{"code_sha256_prefix":"d410095619068f37","entry":"_revise_plans_with_invalid_tables","repo":"StringNLPLAB/FlexSQL","repo_kind":"found_in_text","path":"src/planning.py","file_url":"https://github.com/StringNLPLAB/FlexSQL/blob/HEAD/src/planning.py","link_basis":"first_harvest_node","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"OUTPUT_MISDECLARED","metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"d410095619068f37"}},{"code_sha256_prefix":"dad5543700af9460","entry":"check_json_structure","repo":"StringNLPLAB/FlexSQL","repo_kind":"found_in_text","path":"src/planning.py","file_url":"https://github.com/StringNLPLAB/FlexSQL/blob/HEAD/src/planning.py","link_basis":"first_harvest_node","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"OUTPUT_MISDECLARED","metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"dad5543700af9460"}},{"code_sha256_prefix":"41bd9ffcd8abc270","entry":"extract_all_blocks","repo":"StringNLPLAB/FlexSQL","repo_kind":"found_in_text","path":"src/planning.py","file_url":"https://github.com/StringNLPLAB/FlexSQL/blob/HEAD/src/planning.py","link_basis":"first_harvest_node","language":"python","status":"ran_honours","verification_level":1,"contract_check":"HONOURS","metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"41bd9ffcd8abc270"}},{"code_sha256_prefix":"d4d75181a4cb0cfb","entry":"extract_json_from_text","repo":"StringNLPLAB/FlexSQL","repo_kind":"found_in_text","path":"src/planning.py","file_url":"https://github.com/StringNLPLAB/FlexSQL/blob/HEAD/src/planning.py","link_basis":"first_harvest_node","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"OUTPUT_MISDECLARED","metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"d4d75181a4cb0cfb"}},{"code_sha256_prefix":"a7f24773e28eaab3","entry":"get_db_id","repo":"StringNLPLAB/FlexSQL","repo_kind":"found_in_text","path":"src/planning.py","file_url":"https://github.com/StringNLPLAB/FlexSQL/blob/HEAD/src/planning.py","link_basis":"first_harvest_node","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"OUTPUT_MISDECLARED","metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"a7f24773e28eaab3"}},{"code_sha256_prefix":"081caf427ea760f5","entry":"get_question_str","repo":"StringNLPLAB/FlexSQL","repo_kind":"found_in_text","path":"src/planning.py","file_url":"https://github.com/StringNLPLAB/FlexSQL/blob/HEAD/src/planning.py","link_basis":"first_harvest_node","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"OUTPUT_MISDECLARED","metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"081caf427ea760f5"}},{"code_sha256_prefix":"db843b4aebb143e3","entry":"load_table_similarities","repo":"StringNLPLAB/FlexSQL","repo_kind":"found_in_text","path":"src/planning.py","file_url":"https://github.com/StringNLPLAB/FlexSQL/blob/HEAD/src/planning.py","link_basis":"first_harvest_node","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"OUTPUT_MISDECLARED","metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"db843b4aebb143e3"}},{"code_sha256_prefix":"bb85c39aaf8da193","entry":"match_table_name_flexible","repo":"StringNLPLAB/FlexSQL","repo_kind":"found_in_text","path":"src/planning.py","file_url":"https://github.com/StringNLPLAB/FlexSQL/blob/HEAD/src/planning.py","link_basis":"first_harvest_node","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"OUTPUT_MISDECLARED","metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"bb85c39aaf8da193"}},{"code_sha256_prefix":"d776a01edd7a0dbe","entry":"BaseChat","repo":"StringNLPLAB/FlexSQL","repo_kind":"found_in_text","path":"src/planning.py","file_url":"https://github.com/StringNLPLAB/FlexSQL/blob/HEAD/src/planning.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"d776a01edd7a0dbe"}},{"code_sha256_prefix":"8bdf1845842d90ce","entry":"Chat","repo":"StringNLPLAB/FlexSQL","repo_kind":"found_in_text","path":"src/planning.py","file_url":"https://github.com/StringNLPLAB/FlexSQL/blob/HEAD/src/planning.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"8bdf1845842d90ce"}},{"code_sha256_prefix":"574b38a4223b9bc4","entry":"planning_batch_generate","repo":"StringNLPLAB/FlexSQL","repo_kind":"found_in_text","path":"src/planning.py","file_url":"https://github.com/StringNLPLAB/FlexSQL/blob/HEAD/src/planning.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"574b38a4223b9bc4"}}]},"arxiv_metadata":{"licence":"arXiv metadata, CC0 1.0 (https://info.arxiv.org/help/license)","fields":["title","abstract","authors","date"],"primary_category":"cs.CL","source":"arxiv_2026.jsonl"},"syntology_extracted_results":{"kind":"leaderboard_placements","source":"Syntology's leaderboard-shaped extractor over the paper's own arXiv-HTML tables: a model pointed at a cell, the number was read from that cell and checked against the board's metric, dataset, split and scale, and an independent check accepted the entry; not reviewed by the paper's authors or the archive's editors","extractor_model":"global.anthropic.claude-sonnet-4-5-20250929-v1:0","verifier_model":null,"prompt_sha":"fa63d4bb9d755694","coverage":{"sentence":"Syntology has checked 7,081 of the 9,623 papers on this site that are newer than the archive; results from the others appear after they are checked.","papers_newer_than_archive":9623,"papers_checked":7081},"entries":[],"not_placed":{"boards":0,"rejected_by_independent_check":0,"refused_by_a_rule":0,"check_did_not_answer":0,"proposed_without_a_cell":0,"declined_by_site":0}}}