rawsql-ts 0.16.0 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +161 -875
- package/dist/esm/index.d.ts +7 -0
- package/dist/esm/index.js +7 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.min.js +22 -20
- package/dist/esm/index.min.js.map +4 -4
- package/dist/esm/models/Clause.d.ts +15 -3
- package/dist/esm/models/Clause.js +2 -1
- package/dist/esm/models/Clause.js.map +1 -1
- package/dist/esm/models/CreateTableQuery.d.ts +3 -0
- package/dist/esm/models/CreateTableQuery.js +5 -4
- package/dist/esm/models/CreateTableQuery.js.map +1 -1
- package/dist/esm/models/DDLStatements.d.ts +71 -0
- package/dist/esm/models/DDLStatements.js +63 -0
- package/dist/esm/models/DDLStatements.js.map +1 -1
- package/dist/esm/models/KeywordTrie.d.ts +2 -3
- package/dist/esm/models/KeywordTrie.js +26 -27
- package/dist/esm/models/KeywordTrie.js.map +1 -1
- package/dist/esm/models/SqlPrintToken.d.ts +1 -0
- package/dist/esm/models/SqlPrintToken.js +1 -0
- package/dist/esm/models/SqlPrintToken.js.map +1 -1
- package/dist/esm/parsers/CheckpointStatementParser.d.ts +8 -0
- package/dist/esm/parsers/CheckpointStatementParser.js +14 -0
- package/dist/esm/parsers/CheckpointStatementParser.js.map +1 -0
- package/dist/esm/parsers/ClusterStatementParser.d.ts +8 -0
- package/dist/esm/parsers/ClusterStatementParser.js +14 -0
- package/dist/esm/parsers/ClusterStatementParser.js.map +1 -0
- package/dist/esm/parsers/CommandExpressionParser.js.map +1 -1
- package/dist/esm/parsers/CommentOnParser.d.ts +23 -0
- package/dist/esm/parsers/CommentOnParser.js +61 -0
- package/dist/esm/parsers/CommentOnParser.js.map +1 -0
- package/dist/esm/parsers/CommonTableParser.d.ts +5 -1
- package/dist/esm/parsers/CommonTableParser.js +94 -16
- package/dist/esm/parsers/CommonTableParser.js.map +1 -1
- package/dist/esm/parsers/CreateIndexParser.js +12 -6
- package/dist/esm/parsers/CreateIndexParser.js.map +1 -1
- package/dist/esm/parsers/CreateTableParser.d.ts +2 -0
- package/dist/esm/parsers/CreateTableParser.js +11 -2
- package/dist/esm/parsers/CreateTableParser.js.map +1 -1
- package/dist/esm/parsers/ExplainStatementParser.js.map +1 -1
- package/dist/esm/parsers/FullNameParser.js +35 -3
- package/dist/esm/parsers/FullNameParser.js.map +1 -1
- package/dist/esm/parsers/OrderByClauseParser.js.map +1 -1
- package/dist/esm/parsers/ReindexStatementParser.d.ts +8 -0
- package/dist/esm/parsers/ReindexStatementParser.js +14 -0
- package/dist/esm/parsers/ReindexStatementParser.js.map +1 -0
- package/dist/esm/parsers/SelectQueryParser.js.map +1 -1
- package/dist/esm/parsers/SourceParser.js +6 -1
- package/dist/esm/parsers/SourceParser.js.map +1 -1
- package/dist/esm/parsers/SqlParser.d.ts +12 -2
- package/dist/esm/parsers/SqlParser.js +117 -251
- package/dist/esm/parsers/SqlParser.js.map +1 -1
- package/dist/esm/parsers/SqlPrintTokenParser.d.ts +1 -0
- package/dist/esm/parsers/SqlPrintTokenParser.js +32 -4
- package/dist/esm/parsers/SqlPrintTokenParser.js.map +1 -1
- package/dist/esm/parsers/SqlTokenizer.d.ts +5 -0
- package/dist/esm/parsers/SqlTokenizer.js +181 -67
- package/dist/esm/parsers/SqlTokenizer.js.map +1 -1
- package/dist/esm/parsers/UsingClauseParser.js.map +1 -1
- package/dist/esm/parsers/VacuumStatementParser.d.ts +8 -0
- package/dist/esm/parsers/VacuumStatementParser.js +14 -0
- package/dist/esm/parsers/VacuumStatementParser.js.map +1 -0
- package/dist/esm/tokenReaders/CommandTokenReader.js +22 -4
- package/dist/esm/tokenReaders/CommandTokenReader.js.map +1 -1
- package/dist/esm/tokenReaders/StringSpecifierTokenReader.d.ts +2 -0
- package/dist/esm/tokenReaders/StringSpecifierTokenReader.js +30 -13
- package/dist/esm/tokenReaders/StringSpecifierTokenReader.js.map +1 -1
- package/dist/esm/tokenReaders/TokenReaderManager.d.ts +0 -7
- package/dist/esm/tokenReaders/TokenReaderManager.js +16 -48
- package/dist/esm/tokenReaders/TokenReaderManager.js.map +1 -1
- package/dist/esm/transformers/AliasRenamer.d.ts +1 -0
- package/dist/esm/transformers/AliasRenamer.js +7 -1
- package/dist/esm/transformers/AliasRenamer.js.map +1 -1
- package/dist/esm/transformers/CTECollector.d.ts +5 -2
- package/dist/esm/transformers/CTECollector.js +49 -0
- package/dist/esm/transformers/CTECollector.js.map +1 -1
- package/dist/esm/transformers/CTEDependencyTracer.d.ts +6 -1
- package/dist/esm/transformers/CTEDependencyTracer.js +44 -2
- package/dist/esm/transformers/CTEDependencyTracer.js.map +1 -1
- package/dist/esm/transformers/CTEDisabler.d.ts +6 -0
- package/dist/esm/transformers/CTEDisabler.js +19 -0
- package/dist/esm/transformers/CTEDisabler.js.map +1 -1
- package/dist/esm/transformers/CTERenamer.js +5 -2
- package/dist/esm/transformers/CTERenamer.js.map +1 -1
- package/dist/esm/transformers/ColumnReferenceCollector.d.ts +4 -0
- package/dist/esm/transformers/ColumnReferenceCollector.js +69 -1
- package/dist/esm/transformers/ColumnReferenceCollector.js.map +1 -1
- package/dist/esm/transformers/DeleteResultSelectConverter.js.map +1 -1
- package/dist/esm/transformers/DynamicQueryBuilder.d.ts +87 -11
- package/dist/esm/transformers/DynamicQueryBuilder.js +237 -9
- package/dist/esm/transformers/DynamicQueryBuilder.js.map +1 -1
- package/dist/esm/transformers/ExistsPredicateInjector.d.ts +33 -0
- package/dist/esm/transformers/ExistsPredicateInjector.js +294 -0
- package/dist/esm/transformers/ExistsPredicateInjector.js.map +1 -0
- package/dist/esm/transformers/FixtureCteBuilder.js +5 -2
- package/dist/esm/transformers/FixtureCteBuilder.js.map +1 -1
- package/dist/esm/transformers/InsertResultSelectConverter.d.ts +1 -0
- package/dist/esm/transformers/InsertResultSelectConverter.js +28 -7
- package/dist/esm/transformers/InsertResultSelectConverter.js.map +1 -1
- package/dist/esm/transformers/LinePrinter.d.ts +4 -2
- package/dist/esm/transformers/LinePrinter.js +93 -22
- package/dist/esm/transformers/LinePrinter.js.map +1 -1
- package/dist/esm/transformers/MergeResultSelectConverter.js.map +1 -1
- package/dist/esm/transformers/OptimizeUnusedLeftJoins.d.ts +33 -0
- package/dist/esm/transformers/OptimizeUnusedLeftJoins.js +333 -0
- package/dist/esm/transformers/OptimizeUnusedLeftJoins.js.map +1 -0
- package/dist/esm/transformers/PruneOptionalConditionBranches.d.ts +10 -0
- package/dist/esm/transformers/PruneOptionalConditionBranches.js +197 -0
- package/dist/esm/transformers/PruneOptionalConditionBranches.js.map +1 -0
- package/dist/esm/transformers/SchemaCollector.d.ts +3 -0
- package/dist/esm/transformers/SchemaCollector.js +37 -1
- package/dist/esm/transformers/SchemaCollector.js.map +1 -1
- package/dist/esm/transformers/SelectValueCollector.d.ts +5 -0
- package/dist/esm/transformers/SelectValueCollector.js +44 -2
- package/dist/esm/transformers/SelectValueCollector.js.map +1 -1
- package/dist/esm/transformers/SqlParamInjector.d.ts +5 -1
- package/dist/esm/transformers/SqlParamInjector.js +47 -11
- package/dist/esm/transformers/SqlParamInjector.js.map +1 -1
- package/dist/esm/transformers/SqlPrinter.js +8 -2
- package/dist/esm/transformers/SqlPrinter.js.map +1 -1
- package/dist/esm/transformers/TableSourceCollector.d.ts +9 -1
- package/dist/esm/transformers/TableSourceCollector.js +72 -5
- package/dist/esm/transformers/TableSourceCollector.js.map +1 -1
- package/dist/esm/transformers/UpdateResultSelectConverter.js.map +1 -1
- package/dist/esm/transformers/UpstreamSelectQueryFinder.d.ts +5 -0
- package/dist/esm/transformers/UpstreamSelectQueryFinder.js +46 -1
- package/dist/esm/transformers/UpstreamSelectQueryFinder.js.map +1 -1
- package/dist/esm/utils/CommentUtils.d.ts +1 -0
- package/dist/esm/utils/CommentUtils.js +14 -4
- package/dist/esm/utils/CommentUtils.js.map +1 -1
- package/dist/esm/utils/MultiQuerySplitter.d.ts +7 -11
- package/dist/esm/utils/MultiQuerySplitter.js +105 -66
- package/dist/esm/utils/MultiQuerySplitter.js.map +1 -1
- package/dist/esm/utils/ParameterRemover.d.ts +4 -0
- package/dist/esm/utils/ParameterRemover.js +23 -0
- package/dist/esm/utils/ParameterRemover.js.map +1 -1
- package/dist/esm/utils/ScopeResolver.d.ts +5 -2
- package/dist/esm/utils/ScopeResolver.js +37 -18
- package/dist/esm/utils/ScopeResolver.js.map +1 -1
- package/dist/esm/utils/charLookupTable.d.ts +6 -0
- package/dist/esm/utils/charLookupTable.js +9 -1
- package/dist/esm/utils/charLookupTable.js.map +1 -1
- package/dist/esm/utils/serialTypeNormalization.d.ts +15 -0
- package/dist/esm/utils/serialTypeNormalization.js +55 -0
- package/dist/esm/utils/serialTypeNormalization.js.map +1 -0
- package/dist/esm/utils/stringUtils.js +51 -26
- package/dist/esm/utils/stringUtils.js.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +21 -19
- package/dist/index.min.js.map +4 -4
- package/dist/models/CreateTableQuery.js +5 -4
- package/dist/models/CreateTableQuery.js.map +1 -1
- package/dist/models/DDLStatements.js +14 -1
- package/dist/models/DDLStatements.js.map +1 -1
- package/dist/models/KeywordTrie.js +26 -27
- package/dist/models/KeywordTrie.js.map +1 -1
- package/dist/models/SqlPrintToken.js +1 -0
- package/dist/models/SqlPrintToken.js.map +1 -1
- package/dist/parsers/CommentOnParser.js +65 -0
- package/dist/parsers/CommentOnParser.js.map +1 -0
- package/dist/parsers/CreateIndexParser.js +12 -6
- package/dist/parsers/CreateIndexParser.js.map +1 -1
- package/dist/parsers/CreateTableParser.js +6 -1
- package/dist/parsers/CreateTableParser.js.map +1 -1
- package/dist/parsers/FullNameParser.js +35 -3
- package/dist/parsers/FullNameParser.js.map +1 -1
- package/dist/parsers/SqlParser.js +93 -307
- package/dist/parsers/SqlParser.js.map +1 -1
- package/dist/parsers/SqlPrintTokenParser.js +27 -3
- package/dist/parsers/SqlPrintTokenParser.js.map +1 -1
- package/dist/parsers/SqlTokenizer.js +176 -67
- package/dist/parsers/SqlTokenizer.js.map +1 -1
- package/dist/src/index.d.ts +2 -0
- package/dist/src/models/CreateTableQuery.d.ts +3 -0
- package/dist/src/models/DDLStatements.d.ts +15 -0
- package/dist/src/models/KeywordTrie.d.ts +2 -3
- package/dist/src/models/SqlPrintToken.d.ts +1 -0
- package/dist/src/parsers/CommentOnParser.d.ts +23 -0
- package/dist/src/parsers/CreateTableParser.d.ts +1 -0
- package/dist/src/parsers/SqlParser.d.ts +8 -2
- package/dist/src/parsers/SqlPrintTokenParser.d.ts +1 -0
- package/dist/src/parsers/SqlTokenizer.d.ts +5 -0
- package/dist/src/tokenReaders/StringSpecifierTokenReader.d.ts +2 -0
- package/dist/src/tokenReaders/TokenReaderManager.d.ts +0 -7
- package/dist/src/transformers/DynamicQueryBuilder.d.ts +12 -0
- package/dist/src/transformers/LinePrinter.d.ts +4 -2
- package/dist/src/transformers/PruneOptionalConditionBranches.d.ts +10 -0
- package/dist/src/utils/CommentUtils.d.ts +1 -0
- package/dist/src/utils/MultiQuerySplitter.d.ts +7 -11
- package/dist/tokenReaders/CommandTokenReader.js +21 -4
- package/dist/tokenReaders/CommandTokenReader.js.map +1 -1
- package/dist/tokenReaders/StringSpecifierTokenReader.js +30 -13
- package/dist/tokenReaders/StringSpecifierTokenReader.js.map +1 -1
- package/dist/tokenReaders/TokenReaderManager.js +16 -48
- package/dist/tokenReaders/TokenReaderManager.js.map +1 -1
- package/dist/transformers/DynamicQueryBuilder.js +24 -2
- package/dist/transformers/DynamicQueryBuilder.js.map +1 -1
- package/dist/transformers/LinePrinter.js +93 -22
- package/dist/transformers/LinePrinter.js.map +1 -1
- package/dist/transformers/PruneOptionalConditionBranches.js +201 -0
- package/dist/transformers/PruneOptionalConditionBranches.js.map +1 -0
- package/dist/tsconfig.browser.tsbuildinfo +1 -1
- package/dist/utils/CommentUtils.js +14 -4
- package/dist/utils/CommentUtils.js.map +1 -1
- package/dist/utils/MultiQuerySplitter.js +105 -66
- package/dist/utils/MultiQuerySplitter.js.map +1 -1
- package/dist/utils/stringUtils.js +42 -23
- package/dist/utils/stringUtils.js.map +1 -1
- package/package.json +65 -64
- package/LICENSE +0 -21
|
@@ -4,6 +4,26 @@ exports.FullNameParser = void 0;
|
|
|
4
4
|
const Lexeme_1 = require("../models/Lexeme");
|
|
5
5
|
const ValueComponent_1 = require("../models/ValueComponent");
|
|
6
6
|
const SqlTokenizer_1 = require("./SqlTokenizer");
|
|
7
|
+
/**
|
|
8
|
+
* PostgreSQL non-reserved keywords that may appear as Command tokens,
|
|
9
|
+
* but should still be accepted when parsing identifier positions.
|
|
10
|
+
* This set is intentionally limited to identifier contexts in FullNameParser.
|
|
11
|
+
*/
|
|
12
|
+
const POSTGRESQL_COMMAND_KEYWORDS_ALLOWED_AS_IDENTIFIER = new Set([
|
|
13
|
+
'groups', // window frame type: GROUPS BETWEEN ...
|
|
14
|
+
'rows', // window frame type: ROWS BETWEEN ...
|
|
15
|
+
'range', // window frame type: RANGE BETWEEN ...
|
|
16
|
+
'window', // window clause: WINDOW w AS (...)
|
|
17
|
+
'over', // window function: func() OVER (...)
|
|
18
|
+
'following', // window frame bound: n FOLLOWING
|
|
19
|
+
'preceding', // window frame bound: n PRECEDING
|
|
20
|
+
'within', // ordered-set aggregate: WITHIN GROUP (...)
|
|
21
|
+
'ordinality', // table function: WITH ORDINALITY
|
|
22
|
+
'lateral', // lateral join/subquery
|
|
23
|
+
'recursive', // CTE: WITH RECURSIVE
|
|
24
|
+
'materialized', // CTE: AS MATERIALIZED / AS NOT MATERIALIZED
|
|
25
|
+
'partition', // partitioning / window PARTITION BY
|
|
26
|
+
]);
|
|
7
27
|
/**
|
|
8
28
|
* Utility class for parsing fully qualified names (e.g. db.schema.table or db.schema.table.column_name)
|
|
9
29
|
* This can be used for both table and column references.
|
|
@@ -21,10 +41,15 @@ class FullNameParser {
|
|
|
21
41
|
if (newIndex > index) {
|
|
22
42
|
const lastLexeme = lexemes[newIndex - 1];
|
|
23
43
|
if (lastLexeme.positionedComments && lastLexeme.positionedComments.length > 0) {
|
|
24
|
-
identifierString.positionedComments = lastLexeme.positionedComments;
|
|
44
|
+
identifierString.positionedComments = [...lastLexeme.positionedComments];
|
|
25
45
|
}
|
|
26
|
-
|
|
27
|
-
|
|
46
|
+
// Preserve legacy comments when positioned comments are absent.
|
|
47
|
+
// This keeps backward-compatible comment transfer behavior for callers
|
|
48
|
+
// that still read from the `comments` field.
|
|
49
|
+
if ((!identifierString.positionedComments || identifierString.positionedComments.length === 0) &&
|
|
50
|
+
lastLexeme.comments &&
|
|
51
|
+
lastLexeme.comments.length > 0) {
|
|
52
|
+
identifierString.comments = [...lastLexeme.comments];
|
|
28
53
|
}
|
|
29
54
|
}
|
|
30
55
|
// Returns the type of the last token in the identifier sequence
|
|
@@ -77,6 +102,13 @@ class FullNameParser {
|
|
|
77
102
|
identifiers.push(lexemes[idx].value);
|
|
78
103
|
idx++;
|
|
79
104
|
}
|
|
105
|
+
else if ((lexemes[idx].type & Lexeme_1.TokenType.Command) &&
|
|
106
|
+
POSTGRESQL_COMMAND_KEYWORDS_ALLOWED_AS_IDENTIFIER.has(lexemes[idx].value.toLowerCase())) {
|
|
107
|
+
// Accept selected PostgreSQL non-reserved keywords only when this parser
|
|
108
|
+
// is reading an identifier position (e.g. schema.table or table.column).
|
|
109
|
+
identifiers.push(lexemes[idx].value);
|
|
110
|
+
idx++;
|
|
111
|
+
}
|
|
80
112
|
else if (lexemes[idx].value === "*") {
|
|
81
113
|
// The wildcard '*' is always treated as the terminal part of a qualified name in SQL (e.g., db.schema.* or [db].[schema].*).
|
|
82
114
|
// No valid SQL syntax allows a wildcard in the middle of a multi-part name.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FullNameParser.js","sourceRoot":"","sources":["../../src/parsers/FullNameParser.ts"],"names":[],"mappings":";;;AAAA,6CAAqD;AACrD,6DAA4D;AAC5D,iDAA8C;AAE9C;;;GAGG;AACH,MAAa,cAAc;IACvB;;OAEG;IACI,MAAM,CAAC,eAAe,CAAC,OAAiB,EAAE,KAAa;QAC1D,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC,qCAAqC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACvG,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC,wBAAwB,CAAC,WAAW,CAAC,CAAC;QAElF,8EAA8E;QAC9E,MAAM,gBAAgB,GAAG,IAAI,iCAAgB,CAAC,IAAI,CAAC,CAAC;QAEpD,0FAA0F;QAC1F,IAAI,QAAQ,GAAG,KAAK,EAAE,CAAC;YACnB,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;YACzC,IAAI,UAAU,CAAC,kBAAkB,IAAI,UAAU,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5E,gBAAgB,CAAC,kBAAkB,GAAG,UAAU,CAAC,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"FullNameParser.js","sourceRoot":"","sources":["../../src/parsers/FullNameParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,6 +23,7 @@ const VacuumStatementParser_1 = require("./VacuumStatementParser");
|
|
|
23
23
|
const ReindexStatementParser_1 = require("./ReindexStatementParser");
|
|
24
24
|
const ClusterStatementParser_1 = require("./ClusterStatementParser");
|
|
25
25
|
const CheckpointStatementParser_1 = require("./CheckpointStatementParser");
|
|
26
|
+
const CommentOnParser_1 = require("./CommentOnParser");
|
|
26
27
|
/**
|
|
27
28
|
* Canonical entry point for SQL parsing.
|
|
28
29
|
* Delegates to dedicated parsers for SELECT, INSERT, UPDATE, and DELETE statements, and is designed to embrace additional statement types next.
|
|
@@ -33,6 +34,19 @@ class SqlParser {
|
|
|
33
34
|
const skipEmpty = (_a = options.skipEmptyStatements) !== null && _a !== void 0 ? _a : true;
|
|
34
35
|
const mode = (_b = options.mode) !== null && _b !== void 0 ? _b : 'single';
|
|
35
36
|
const tokenizer = new SqlTokenizer_1.SqlTokenizer(sql);
|
|
37
|
+
// Fast path for the common single-statement parse used by benchmarks and most callers.
|
|
38
|
+
if (mode === 'single' && skipEmpty) {
|
|
39
|
+
const first = this.readNextMeaningfulStatement(tokenizer, 0);
|
|
40
|
+
if (!first) {
|
|
41
|
+
throw new Error('[SqlParser] No SQL statements found in input.');
|
|
42
|
+
}
|
|
43
|
+
const parsed = this.dispatchParse(first, 1);
|
|
44
|
+
const remainder = this.readNextMeaningfulStatement(tokenizer, first.nextPosition);
|
|
45
|
+
if (remainder) {
|
|
46
|
+
throw new Error('[SqlParser] Unexpected additional statement detected at index 2. Use parseMany or set mode to "multiple" to allow multiple statements.');
|
|
47
|
+
}
|
|
48
|
+
return parsed;
|
|
49
|
+
}
|
|
36
50
|
// Acquire the first meaningful statement so future dispatching can inspect its leading keyword.
|
|
37
51
|
const first = this.consumeNextStatement(tokenizer, 0, skipEmpty);
|
|
38
52
|
if (!first) {
|
|
@@ -110,6 +124,7 @@ class SqlParser {
|
|
|
110
124
|
return this.parseDeleteStatement(segment, statementIndex);
|
|
111
125
|
case 'create table':
|
|
112
126
|
case 'create temporary table':
|
|
127
|
+
case 'create unlogged table':
|
|
113
128
|
return this.parseCreateTableStatement(segment, statementIndex);
|
|
114
129
|
case 'merge into':
|
|
115
130
|
return this.parseMergeStatement(segment, statementIndex);
|
|
@@ -134,6 +149,9 @@ class SqlParser {
|
|
|
134
149
|
return this.parseAlterSequenceStatement(segment, statementIndex);
|
|
135
150
|
case 'drop constraint':
|
|
136
151
|
return this.parseDropConstraintStatement(segment, statementIndex);
|
|
152
|
+
case 'comment on table':
|
|
153
|
+
case 'comment on column':
|
|
154
|
+
return this.parseCommentOnStatement(segment, statementIndex);
|
|
137
155
|
case 'analyze':
|
|
138
156
|
return this.parseAnalyzeStatement(segment, statementIndex);
|
|
139
157
|
case 'explain':
|
|
@@ -155,360 +173,110 @@ class SqlParser {
|
|
|
155
173
|
}
|
|
156
174
|
}
|
|
157
175
|
static parseSelectStatement(segment, statementIndex) {
|
|
158
|
-
|
|
159
|
-
try {
|
|
160
|
-
const result = SelectQueryParser_1.SelectQueryParser.parseFromLexeme(segment.lexemes, 0);
|
|
161
|
-
if (result.newIndex < segment.lexemes.length) {
|
|
162
|
-
const unexpected = segment.lexemes[result.newIndex];
|
|
163
|
-
const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
|
|
164
|
-
throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in statement ${statementIndex} at character ${position}.`);
|
|
165
|
-
}
|
|
166
|
-
return result.value;
|
|
167
|
-
}
|
|
168
|
-
catch (error) {
|
|
169
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
170
|
-
throw new Error(`[SqlParser] Failed to parse SELECT statement ${statementIndex}: ${message}`);
|
|
171
|
-
}
|
|
176
|
+
return this.parseStatementWithParser(segment, statementIndex, 'SELECT', (lexemes, startIndex) => SelectQueryParser_1.SelectQueryParser.parseFromLexeme(lexemes, startIndex));
|
|
172
177
|
}
|
|
173
178
|
static parseExplainStatement(segment, statementIndex) {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
if (nestedStart >= lexemes.length) {
|
|
178
|
-
throw new Error("[ExplainStatementParser] Missing statement after EXPLAIN options.");
|
|
179
|
-
}
|
|
180
|
-
const nestedSegment = {
|
|
181
|
-
lexemes: lexemes.slice(nestedStart),
|
|
182
|
-
statementStart: segment.statementStart,
|
|
183
|
-
statementEnd: segment.statementEnd,
|
|
184
|
-
nextPosition: segment.nextPosition,
|
|
185
|
-
rawText: segment.rawText,
|
|
186
|
-
leadingComments: segment.leadingComments,
|
|
187
|
-
};
|
|
188
|
-
const statement = this.dispatchParse(nestedSegment, statementIndex);
|
|
189
|
-
return { value: statement, newIndex: lexemes.length };
|
|
190
|
-
});
|
|
191
|
-
if (result.newIndex < segment.lexemes.length) {
|
|
192
|
-
const unexpected = segment.lexemes[result.newIndex];
|
|
193
|
-
const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
|
|
194
|
-
throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in EXPLAIN statement ${statementIndex} at character ${position}.`);
|
|
179
|
+
return this.parseStatementWithCallback(segment, statementIndex, 'EXPLAIN', () => ExplainStatementParser_1.ExplainStatementParser.parseFromLexeme(segment.lexemes, 0, (lexemes, nestedStart) => {
|
|
180
|
+
if (nestedStart >= lexemes.length) {
|
|
181
|
+
throw new Error("[ExplainStatementParser] Missing statement after EXPLAIN options.");
|
|
195
182
|
}
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
183
|
+
const nestedSegment = {
|
|
184
|
+
lexemes: lexemes.slice(nestedStart),
|
|
185
|
+
statementStart: segment.statementStart,
|
|
186
|
+
statementEnd: segment.statementEnd,
|
|
187
|
+
nextPosition: segment.nextPosition,
|
|
188
|
+
rawText: segment.rawText,
|
|
189
|
+
leadingComments: segment.leadingComments,
|
|
190
|
+
};
|
|
191
|
+
const statement = this.dispatchParse(nestedSegment, statementIndex);
|
|
192
|
+
return { value: statement, newIndex: lexemes.length };
|
|
193
|
+
}), `EXPLAIN statement ${statementIndex}`);
|
|
202
194
|
}
|
|
203
195
|
static parseVacuumStatement(segment, statementIndex) {
|
|
204
|
-
|
|
205
|
-
try {
|
|
206
|
-
const result = VacuumStatementParser_1.VacuumStatementParser.parseFromLexeme(segment.lexemes, 0);
|
|
207
|
-
if (result.newIndex < segment.lexemes.length) {
|
|
208
|
-
const unexpected = segment.lexemes[result.newIndex];
|
|
209
|
-
const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
|
|
210
|
-
throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in VACUUM statement ${statementIndex} at character ${position}.`);
|
|
211
|
-
}
|
|
212
|
-
return result.value;
|
|
213
|
-
}
|
|
214
|
-
catch (error) {
|
|
215
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
216
|
-
throw new Error(`[SqlParser] Failed to parse VACUUM statement ${statementIndex}: ${message}`);
|
|
217
|
-
}
|
|
196
|
+
return this.parseStatementWithParser(segment, statementIndex, 'VACUUM', (lexemes, startIndex) => VacuumStatementParser_1.VacuumStatementParser.parseFromLexeme(lexemes, startIndex), `VACUUM statement ${statementIndex}`);
|
|
218
197
|
}
|
|
219
198
|
static parseReindexStatement(segment, statementIndex) {
|
|
220
|
-
|
|
221
|
-
try {
|
|
222
|
-
const result = ReindexStatementParser_1.ReindexStatementParser.parseFromLexeme(segment.lexemes, 0);
|
|
223
|
-
if (result.newIndex < segment.lexemes.length) {
|
|
224
|
-
const unexpected = segment.lexemes[result.newIndex];
|
|
225
|
-
const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
|
|
226
|
-
throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in REINDEX statement ${statementIndex} at character ${position}.`);
|
|
227
|
-
}
|
|
228
|
-
return result.value;
|
|
229
|
-
}
|
|
230
|
-
catch (error) {
|
|
231
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
232
|
-
throw new Error(`[SqlParser] Failed to parse REINDEX statement ${statementIndex}: ${message}`);
|
|
233
|
-
}
|
|
199
|
+
return this.parseStatementWithParser(segment, statementIndex, 'REINDEX', (lexemes, startIndex) => ReindexStatementParser_1.ReindexStatementParser.parseFromLexeme(lexemes, startIndex), `REINDEX statement ${statementIndex}`);
|
|
234
200
|
}
|
|
235
201
|
static parseClusterStatement(segment, statementIndex) {
|
|
236
|
-
|
|
237
|
-
try {
|
|
238
|
-
const result = ClusterStatementParser_1.ClusterStatementParser.parseFromLexeme(segment.lexemes, 0);
|
|
239
|
-
if (result.newIndex < segment.lexemes.length) {
|
|
240
|
-
const unexpected = segment.lexemes[result.newIndex];
|
|
241
|
-
const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
|
|
242
|
-
throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in CLUSTER statement ${statementIndex} at character ${position}.`);
|
|
243
|
-
}
|
|
244
|
-
return result.value;
|
|
245
|
-
}
|
|
246
|
-
catch (error) {
|
|
247
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
248
|
-
throw new Error(`[SqlParser] Failed to parse CLUSTER statement ${statementIndex}: ${message}`);
|
|
249
|
-
}
|
|
202
|
+
return this.parseStatementWithParser(segment, statementIndex, 'CLUSTER', (lexemes, startIndex) => ClusterStatementParser_1.ClusterStatementParser.parseFromLexeme(lexemes, startIndex), `CLUSTER statement ${statementIndex}`);
|
|
250
203
|
}
|
|
251
204
|
static parseCheckpointStatement(segment, statementIndex) {
|
|
252
|
-
|
|
253
|
-
try {
|
|
254
|
-
const result = CheckpointStatementParser_1.CheckpointStatementParser.parseFromLexeme(segment.lexemes, 0);
|
|
255
|
-
if (result.newIndex < segment.lexemes.length) {
|
|
256
|
-
const unexpected = segment.lexemes[result.newIndex];
|
|
257
|
-
const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
|
|
258
|
-
throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in CHECKPOINT statement ${statementIndex} at character ${position}.`);
|
|
259
|
-
}
|
|
260
|
-
return result.value;
|
|
261
|
-
}
|
|
262
|
-
catch (error) {
|
|
263
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
264
|
-
throw new Error(`[SqlParser] Failed to parse CHECKPOINT statement ${statementIndex}: ${message}`);
|
|
265
|
-
}
|
|
205
|
+
return this.parseStatementWithParser(segment, statementIndex, 'CHECKPOINT', (lexemes, startIndex) => CheckpointStatementParser_1.CheckpointStatementParser.parseFromLexeme(lexemes, startIndex), `CHECKPOINT statement ${statementIndex}`);
|
|
266
206
|
}
|
|
267
207
|
static parseInsertStatement(segment, statementIndex) {
|
|
268
|
-
|
|
269
|
-
try {
|
|
270
|
-
const result = InsertQueryParser_1.InsertQueryParser.parseFromLexeme(segment.lexemes, 0);
|
|
271
|
-
if (result.newIndex < segment.lexemes.length) {
|
|
272
|
-
const unexpected = segment.lexemes[result.newIndex];
|
|
273
|
-
const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
|
|
274
|
-
throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in statement ${statementIndex} at character ${position}.`);
|
|
275
|
-
}
|
|
276
|
-
return result.value;
|
|
277
|
-
}
|
|
278
|
-
catch (error) {
|
|
279
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
280
|
-
throw new Error(`[SqlParser] Failed to parse INSERT statement ${statementIndex}: ${message}`);
|
|
281
|
-
}
|
|
208
|
+
return this.parseStatementWithParser(segment, statementIndex, 'INSERT', (lexemes, startIndex) => InsertQueryParser_1.InsertQueryParser.parseFromLexeme(lexemes, startIndex));
|
|
282
209
|
}
|
|
283
210
|
static parseUpdateStatement(segment, statementIndex) {
|
|
284
|
-
|
|
285
|
-
try {
|
|
286
|
-
const result = UpdateQueryParser_1.UpdateQueryParser.parseFromLexeme(segment.lexemes, 0);
|
|
287
|
-
if (result.newIndex < segment.lexemes.length) {
|
|
288
|
-
const unexpected = segment.lexemes[result.newIndex];
|
|
289
|
-
const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
|
|
290
|
-
throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in statement ${statementIndex} at character ${position}.`);
|
|
291
|
-
}
|
|
292
|
-
return result.value;
|
|
293
|
-
}
|
|
294
|
-
catch (error) {
|
|
295
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
296
|
-
throw new Error(`[SqlParser] Failed to parse UPDATE statement ${statementIndex}: ${message}`);
|
|
297
|
-
}
|
|
211
|
+
return this.parseStatementWithParser(segment, statementIndex, 'UPDATE', (lexemes, startIndex) => UpdateQueryParser_1.UpdateQueryParser.parseFromLexeme(lexemes, startIndex));
|
|
298
212
|
}
|
|
299
213
|
static parseDeleteStatement(segment, statementIndex) {
|
|
300
|
-
|
|
301
|
-
try {
|
|
302
|
-
const result = DeleteQueryParser_1.DeleteQueryParser.parseFromLexeme(segment.lexemes, 0);
|
|
303
|
-
// Guard against trailing tokens that would indicate multiple statements in DELETE parsing.
|
|
304
|
-
if (result.newIndex < segment.lexemes.length) {
|
|
305
|
-
const unexpected = segment.lexemes[result.newIndex];
|
|
306
|
-
const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
|
|
307
|
-
throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in statement ${statementIndex} at character ${position}.`);
|
|
308
|
-
}
|
|
309
|
-
return result.value;
|
|
310
|
-
}
|
|
311
|
-
catch (error) {
|
|
312
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
313
|
-
throw new Error(`[SqlParser] Failed to parse DELETE statement ${statementIndex}: ${message}`);
|
|
314
|
-
}
|
|
214
|
+
return this.parseStatementWithParser(segment, statementIndex, 'DELETE', (lexemes, startIndex) => DeleteQueryParser_1.DeleteQueryParser.parseFromLexeme(lexemes, startIndex));
|
|
315
215
|
}
|
|
316
216
|
static parseCreateTableStatement(segment, statementIndex) {
|
|
317
|
-
|
|
318
|
-
try {
|
|
319
|
-
const result = CreateTableParser_1.CreateTableParser.parseFromLexeme(segment.lexemes, 0);
|
|
320
|
-
if (result.newIndex < segment.lexemes.length) {
|
|
321
|
-
const unexpected = segment.lexemes[result.newIndex];
|
|
322
|
-
const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
|
|
323
|
-
throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in statement ${statementIndex} at character ${position}.`);
|
|
324
|
-
}
|
|
325
|
-
return result.value;
|
|
326
|
-
}
|
|
327
|
-
catch (error) {
|
|
328
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
329
|
-
throw new Error(`[SqlParser] Failed to parse CREATE TABLE statement ${statementIndex}: ${message}`);
|
|
330
|
-
}
|
|
217
|
+
return this.parseStatementWithParser(segment, statementIndex, 'CREATE TABLE', (lexemes, startIndex) => CreateTableParser_1.CreateTableParser.parseFromLexeme(lexemes, startIndex));
|
|
331
218
|
}
|
|
332
219
|
static parseDropTableStatement(segment, statementIndex) {
|
|
333
|
-
|
|
334
|
-
try {
|
|
335
|
-
const result = DropTableParser_1.DropTableParser.parseFromLexeme(segment.lexemes, 0);
|
|
336
|
-
if (result.newIndex < segment.lexemes.length) {
|
|
337
|
-
const unexpected = segment.lexemes[result.newIndex];
|
|
338
|
-
const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
|
|
339
|
-
throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in statement ${statementIndex} at character ${position}.`);
|
|
340
|
-
}
|
|
341
|
-
return result.value;
|
|
342
|
-
}
|
|
343
|
-
catch (error) {
|
|
344
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
345
|
-
throw new Error(`[SqlParser] Failed to parse DROP TABLE statement ${statementIndex}: ${message}`);
|
|
346
|
-
}
|
|
220
|
+
return this.parseStatementWithParser(segment, statementIndex, 'DROP TABLE', (lexemes, startIndex) => DropTableParser_1.DropTableParser.parseFromLexeme(lexemes, startIndex));
|
|
347
221
|
}
|
|
348
222
|
static parseDropSchemaStatement(segment, statementIndex) {
|
|
349
|
-
|
|
350
|
-
try {
|
|
351
|
-
const result = DropSchemaParser_1.DropSchemaParser.parseFromLexeme(segment.lexemes, 0);
|
|
352
|
-
if (result.newIndex < segment.lexemes.length) {
|
|
353
|
-
const unexpected = segment.lexemes[result.newIndex];
|
|
354
|
-
const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
|
|
355
|
-
throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in statement ${statementIndex} at character ${position}.`);
|
|
356
|
-
}
|
|
357
|
-
return result.value;
|
|
358
|
-
}
|
|
359
|
-
catch (error) {
|
|
360
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
361
|
-
throw new Error(`[SqlParser] Failed to parse DROP SCHEMA statement ${statementIndex}: ${message}`);
|
|
362
|
-
}
|
|
223
|
+
return this.parseStatementWithParser(segment, statementIndex, 'DROP SCHEMA', (lexemes, startIndex) => DropSchemaParser_1.DropSchemaParser.parseFromLexeme(lexemes, startIndex));
|
|
363
224
|
}
|
|
364
225
|
static parseDropIndexStatement(segment, statementIndex) {
|
|
365
|
-
|
|
366
|
-
try {
|
|
367
|
-
const result = DropIndexParser_1.DropIndexParser.parseFromLexeme(segment.lexemes, 0);
|
|
368
|
-
if (result.newIndex < segment.lexemes.length) {
|
|
369
|
-
const unexpected = segment.lexemes[result.newIndex];
|
|
370
|
-
const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
|
|
371
|
-
throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in statement ${statementIndex} at character ${position}.`);
|
|
372
|
-
}
|
|
373
|
-
return result.value;
|
|
374
|
-
}
|
|
375
|
-
catch (error) {
|
|
376
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
377
|
-
throw new Error(`[SqlParser] Failed to parse DROP INDEX statement ${statementIndex}: ${message}`);
|
|
378
|
-
}
|
|
226
|
+
return this.parseStatementWithParser(segment, statementIndex, 'DROP INDEX', (lexemes, startIndex) => DropIndexParser_1.DropIndexParser.parseFromLexeme(lexemes, startIndex));
|
|
379
227
|
}
|
|
380
228
|
static parseCreateIndexStatement(segment, statementIndex) {
|
|
381
|
-
|
|
382
|
-
try {
|
|
383
|
-
const result = CreateIndexParser_1.CreateIndexParser.parseFromLexeme(segment.lexemes, 0);
|
|
384
|
-
if (result.newIndex < segment.lexemes.length) {
|
|
385
|
-
const unexpected = segment.lexemes[result.newIndex];
|
|
386
|
-
const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
|
|
387
|
-
throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in statement ${statementIndex} at character ${position}.`);
|
|
388
|
-
}
|
|
389
|
-
return result.value;
|
|
390
|
-
}
|
|
391
|
-
catch (error) {
|
|
392
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
393
|
-
throw new Error(`[SqlParser] Failed to parse CREATE INDEX statement ${statementIndex}: ${message}`);
|
|
394
|
-
}
|
|
229
|
+
return this.parseStatementWithParser(segment, statementIndex, 'CREATE INDEX', (lexemes, startIndex) => CreateIndexParser_1.CreateIndexParser.parseFromLexeme(lexemes, startIndex));
|
|
395
230
|
}
|
|
396
231
|
static parseCreateSchemaStatement(segment, statementIndex) {
|
|
397
|
-
|
|
398
|
-
try {
|
|
399
|
-
const result = CreateSchemaParser_1.CreateSchemaParser.parseFromLexeme(segment.lexemes, 0);
|
|
400
|
-
if (result.newIndex < segment.lexemes.length) {
|
|
401
|
-
const unexpected = segment.lexemes[result.newIndex];
|
|
402
|
-
const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
|
|
403
|
-
throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in statement ${statementIndex} at character ${position}.`);
|
|
404
|
-
}
|
|
405
|
-
return result.value;
|
|
406
|
-
}
|
|
407
|
-
catch (error) {
|
|
408
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
409
|
-
throw new Error(`[SqlParser] Failed to parse CREATE SCHEMA statement ${statementIndex}: ${message}`);
|
|
410
|
-
}
|
|
232
|
+
return this.parseStatementWithParser(segment, statementIndex, 'CREATE SCHEMA', (lexemes, startIndex) => CreateSchemaParser_1.CreateSchemaParser.parseFromLexeme(lexemes, startIndex));
|
|
411
233
|
}
|
|
412
234
|
static parseCreateSequenceStatement(segment, statementIndex) {
|
|
413
|
-
|
|
414
|
-
try {
|
|
415
|
-
const result = SequenceParser_1.CreateSequenceParser.parseFromLexeme(segment.lexemes, 0);
|
|
416
|
-
// Ensure no trailing lexemes remain after the CREATE SEQUENCE clause.
|
|
417
|
-
if (result.newIndex < segment.lexemes.length) {
|
|
418
|
-
const unexpected = segment.lexemes[result.newIndex];
|
|
419
|
-
const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
|
|
420
|
-
throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in statement ${statementIndex} at character ${position}.`);
|
|
421
|
-
}
|
|
422
|
-
return result.value;
|
|
423
|
-
}
|
|
424
|
-
catch (error) {
|
|
425
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
426
|
-
throw new Error(`[SqlParser] Failed to parse CREATE SEQUENCE statement ${statementIndex}: ${message}`);
|
|
427
|
-
}
|
|
235
|
+
return this.parseStatementWithParser(segment, statementIndex, 'CREATE SEQUENCE', (lexemes, startIndex) => SequenceParser_1.CreateSequenceParser.parseFromLexeme(lexemes, startIndex));
|
|
428
236
|
}
|
|
429
237
|
static parseAlterSequenceStatement(segment, statementIndex) {
|
|
430
|
-
|
|
431
|
-
try {
|
|
432
|
-
const result = SequenceParser_1.AlterSequenceParser.parseFromLexeme(segment.lexemes, 0);
|
|
433
|
-
// Validate that the ALTER SEQUENCE statement consumed all available tokens.
|
|
434
|
-
if (result.newIndex < segment.lexemes.length) {
|
|
435
|
-
const unexpected = segment.lexemes[result.newIndex];
|
|
436
|
-
const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
|
|
437
|
-
throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in statement ${statementIndex} at character ${position}.`);
|
|
438
|
-
}
|
|
439
|
-
return result.value;
|
|
440
|
-
}
|
|
441
|
-
catch (error) {
|
|
442
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
443
|
-
throw new Error(`[SqlParser] Failed to parse ALTER SEQUENCE statement ${statementIndex}: ${message}`);
|
|
444
|
-
}
|
|
238
|
+
return this.parseStatementWithParser(segment, statementIndex, 'ALTER SEQUENCE', (lexemes, startIndex) => SequenceParser_1.AlterSequenceParser.parseFromLexeme(lexemes, startIndex));
|
|
445
239
|
}
|
|
446
240
|
static parseAlterTableStatement(segment, statementIndex) {
|
|
447
|
-
|
|
448
|
-
try {
|
|
449
|
-
const result = AlterTableParser_1.AlterTableParser.parseFromLexeme(segment.lexemes, 0);
|
|
450
|
-
if (result.newIndex < segment.lexemes.length) {
|
|
451
|
-
const unexpected = segment.lexemes[result.newIndex];
|
|
452
|
-
const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
|
|
453
|
-
throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in statement ${statementIndex} at character ${position}.`);
|
|
454
|
-
}
|
|
455
|
-
return result.value;
|
|
456
|
-
}
|
|
457
|
-
catch (error) {
|
|
458
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
459
|
-
throw new Error(`[SqlParser] Failed to parse ALTER TABLE statement ${statementIndex}: ${message}`);
|
|
460
|
-
}
|
|
241
|
+
return this.parseStatementWithParser(segment, statementIndex, 'ALTER TABLE', (lexemes, startIndex) => AlterTableParser_1.AlterTableParser.parseFromLexeme(lexemes, startIndex));
|
|
461
242
|
}
|
|
462
243
|
static parseDropConstraintStatement(segment, statementIndex) {
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
const unexpected = segment.lexemes[result.newIndex];
|
|
468
|
-
const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
|
|
469
|
-
throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in statement ${statementIndex} at character ${position}.`);
|
|
470
|
-
}
|
|
471
|
-
return result.value;
|
|
472
|
-
}
|
|
473
|
-
catch (error) {
|
|
474
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
475
|
-
throw new Error(`[SqlParser] Failed to parse DROP CONSTRAINT statement ${statementIndex}: ${message}`);
|
|
476
|
-
}
|
|
244
|
+
return this.parseStatementWithParser(segment, statementIndex, 'DROP CONSTRAINT', (lexemes, startIndex) => DropConstraintParser_1.DropConstraintParser.parseFromLexeme(lexemes, startIndex));
|
|
245
|
+
}
|
|
246
|
+
static parseCommentOnStatement(segment, statementIndex) {
|
|
247
|
+
return this.parseStatementWithParser(segment, statementIndex, 'COMMENT ON', (lexemes, startIndex) => CommentOnParser_1.CommentOnParser.parseFromLexeme(lexemes, startIndex));
|
|
477
248
|
}
|
|
478
249
|
static parseAnalyzeStatement(segment, statementIndex) {
|
|
479
|
-
|
|
250
|
+
return this.parseStatementWithParser(segment, statementIndex, 'ANALYZE', (lexemes, startIndex) => AnalyzeStatementParser_1.AnalyzeStatementParser.parseFromLexeme(lexemes, startIndex));
|
|
251
|
+
}
|
|
252
|
+
static parseMergeStatement(segment, statementIndex) {
|
|
253
|
+
return this.parseStatementWithParser(segment, statementIndex, 'MERGE', (lexemes, startIndex) => MergeQueryParser_1.MergeQueryParser.parseFromLexeme(lexemes, startIndex));
|
|
254
|
+
}
|
|
255
|
+
static parseStatementWithParser(segment, statementIndex, statementLabel, parser, trailingContext = `statement ${statementIndex}`) {
|
|
256
|
+
return this.parseStatementWithCallback(segment, statementIndex, statementLabel, () => parser(segment.lexemes, 0), trailingContext);
|
|
257
|
+
}
|
|
258
|
+
static parseStatementWithCallback(segment, statementIndex, statementLabel, parse, trailingContext = `statement ${statementIndex}`) {
|
|
480
259
|
try {
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
if (result.newIndex < segment.lexemes.length) {
|
|
485
|
-
const unexpected = segment.lexemes[result.newIndex];
|
|
486
|
-
const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
|
|
487
|
-
throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in statement ${statementIndex} at character ${position}.`);
|
|
488
|
-
}
|
|
260
|
+
const result = parse();
|
|
261
|
+
// Keep trailing-token validation centralized so every statement parser reports the same shape of error.
|
|
262
|
+
this.assertFullyConsumed(segment, result.newIndex, trailingContext);
|
|
489
263
|
return result.value;
|
|
490
264
|
}
|
|
491
265
|
catch (error) {
|
|
492
|
-
|
|
493
|
-
throw new Error(`[SqlParser] Failed to parse ANALYZE statement ${statementIndex}: ${message}`);
|
|
266
|
+
throw new Error(`[SqlParser] Failed to parse ${statementLabel} statement ${statementIndex}: ${this.errorMessage(error)}`);
|
|
494
267
|
}
|
|
495
268
|
}
|
|
496
|
-
static
|
|
269
|
+
static assertFullyConsumed(segment, newIndex, trailingContext) {
|
|
497
270
|
var _a, _b;
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
if (result.newIndex < segment.lexemes.length) {
|
|
501
|
-
// Guard against trailing tokens that would indicate parsing stopped prematurely.
|
|
502
|
-
const unexpected = segment.lexemes[result.newIndex];
|
|
503
|
-
const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
|
|
504
|
-
throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in statement ${statementIndex} at character ${position}.`);
|
|
505
|
-
}
|
|
506
|
-
return result.value;
|
|
507
|
-
}
|
|
508
|
-
catch (error) {
|
|
509
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
510
|
-
throw new Error(`[SqlParser] Failed to parse MERGE statement ${statementIndex}: ${message}`);
|
|
271
|
+
if (newIndex >= segment.lexemes.length) {
|
|
272
|
+
return;
|
|
511
273
|
}
|
|
274
|
+
const unexpected = segment.lexemes[newIndex];
|
|
275
|
+
const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
|
|
276
|
+
throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in ${trailingContext} at character ${position}.`);
|
|
277
|
+
}
|
|
278
|
+
static errorMessage(error) {
|
|
279
|
+
return error instanceof Error ? error.message : String(error);
|
|
512
280
|
}
|
|
513
281
|
static getCommandAfterWith(lexemes) {
|
|
514
282
|
var _a;
|
|
@@ -521,6 +289,24 @@ class SqlParser {
|
|
|
521
289
|
return null;
|
|
522
290
|
}
|
|
523
291
|
}
|
|
292
|
+
static readNextMeaningfulStatement(tokenizer, cursor) {
|
|
293
|
+
let localCursor = cursor;
|
|
294
|
+
let carry = null;
|
|
295
|
+
while (true) {
|
|
296
|
+
const segment = tokenizer.readNextStatement(localCursor, carry);
|
|
297
|
+
carry = null;
|
|
298
|
+
if (!segment) {
|
|
299
|
+
return null;
|
|
300
|
+
}
|
|
301
|
+
if (segment.lexemes.length > 0) {
|
|
302
|
+
return segment;
|
|
303
|
+
}
|
|
304
|
+
localCursor = segment.nextPosition;
|
|
305
|
+
if (segment.leadingComments && segment.leadingComments.length > 0) {
|
|
306
|
+
carry = segment.leadingComments;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
524
310
|
static consumeNextStatement(tokenizer, cursor, skipEmpty) {
|
|
525
311
|
let localCursor = cursor;
|
|
526
312
|
let carry = null;
|