import { expect, test } from "vitest" import { splitMultiStatementsSql } from "#Source/database/sql/index.ts" test("splits plain SQL statements by semicolon", () => { expect(splitMultiStatementsSql("select 1; select 2;")).toEqual(["select 1", "select 2"]) }) test("does not split semicolons inside quoted strings", () => { expect(splitMultiStatementsSql("select ';' as semicolon; select \"a;b\"; select `c;d`;")).toEqual( ["select ';' as semicolon", 'select "a;b"', "select `c;d`"], ) }) test("preserves comments while ignoring semicolons inside comments", () => { const sql = ["select 1 /* keep; this; comment */;", "-- leading; comment", "select 2;"].join("\n") expect(splitMultiStatementsSql(sql)).toEqual([ "select 1 /* keep; this; comment */", "-- leading; comment\nselect 2", ]) }) test("ignores comment-only fragments between semicolons", () => { const sql = ["select 1;", "-- only comment", ";", "/* another comment */", ";", "select 2;"].join( "\n", ) expect(splitMultiStatementsSql(sql)).toEqual(["select 1", "select 2"]) }) test("does not split semicolons inside PostgreSQL dollar-quoted blocks", () => { const sql = ["do $$", "begin", " perform 1;", " perform 2;", "end", "$$;", "select 3;"].join( "\n", ) expect(splitMultiStatementsSql(sql)).toEqual([ "do $$\nbegin\n perform 1;\n perform 2;\nend\n$$", "select 3", ]) })