rawsql-ts 0.11.42-beta → 0.11.44-beta
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 +12 -13
- package/dist/esm/index.js +18 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.min.js +23 -18
- package/dist/esm/index.min.js.map +4 -4
- package/dist/esm/src/index.d.ts +18 -0
- package/dist/esm/src/index.js +18 -0
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/models/BinarySelectQuery.d.ts +25 -1
- package/dist/esm/src/models/BinarySelectQuery.js +28 -0
- package/dist/esm/src/models/BinarySelectQuery.js.map +1 -1
- package/dist/esm/src/models/Clause.d.ts +14 -2
- package/dist/esm/src/models/Clause.js +26 -1
- package/dist/esm/src/models/Clause.js.map +1 -1
- package/dist/esm/src/models/CreateTableQuery.d.ts +99 -5
- package/dist/esm/src/models/CreateTableQuery.js +85 -10
- package/dist/esm/src/models/CreateTableQuery.js.map +1 -1
- package/dist/esm/src/models/DDLStatements.d.ts +157 -0
- package/dist/esm/src/models/DDLStatements.js +141 -0
- package/dist/esm/src/models/DDLStatements.js.map +1 -0
- package/dist/esm/src/models/DeleteQuery.d.ts +17 -0
- package/dist/esm/src/models/DeleteQuery.js +16 -0
- package/dist/esm/src/models/DeleteQuery.js.map +1 -0
- package/dist/esm/src/models/InsertQuery.d.ts +7 -1
- package/dist/esm/src/models/InsertQuery.js +6 -2
- package/dist/esm/src/models/InsertQuery.js.map +1 -1
- package/dist/esm/src/models/MergeQuery.d.ts +63 -0
- package/dist/esm/src/models/MergeQuery.js +94 -0
- package/dist/esm/src/models/MergeQuery.js.map +1 -0
- package/dist/esm/src/models/SelectQuery.d.ts +37 -1
- package/dist/esm/src/models/SelectQuery.js +4 -1
- package/dist/esm/src/models/SelectQuery.js.map +1 -1
- package/dist/esm/src/models/SimpleSelectQuery.d.ts +29 -1
- package/dist/esm/src/models/SimpleSelectQuery.js +32 -0
- package/dist/esm/src/models/SimpleSelectQuery.js.map +1 -1
- package/dist/esm/src/models/SqlComponent.d.ts +2 -1
- package/dist/esm/src/models/SqlComponent.js +1 -1
- package/dist/esm/src/models/SqlComponent.js.map +1 -1
- package/dist/esm/src/models/SqlPrintToken.d.ts +33 -0
- package/dist/esm/src/models/SqlPrintToken.js +32 -0
- package/dist/esm/src/models/SqlPrintToken.js.map +1 -1
- package/dist/esm/src/models/ValuesQuery.d.ts +25 -1
- package/dist/esm/src/models/ValuesQuery.js +28 -0
- package/dist/esm/src/models/ValuesQuery.js.map +1 -1
- package/dist/esm/src/parsers/AlterTableParser.d.ts +25 -0
- package/dist/esm/src/parsers/AlterTableParser.js +428 -0
- package/dist/esm/src/parsers/AlterTableParser.js.map +1 -0
- package/dist/esm/src/parsers/CreateIndexParser.d.ts +16 -0
- package/dist/esm/src/parsers/CreateIndexParser.js +237 -0
- package/dist/esm/src/parsers/CreateIndexParser.js.map +1 -0
- package/dist/esm/src/parsers/CreateTableParser.d.ts +41 -0
- package/dist/esm/src/parsers/CreateTableParser.js +734 -0
- package/dist/esm/src/parsers/CreateTableParser.js.map +1 -0
- package/dist/esm/src/parsers/DeleteClauseParser.d.ts +11 -0
- package/dist/esm/src/parsers/DeleteClauseParser.js +33 -0
- package/dist/esm/src/parsers/DeleteClauseParser.js.map +1 -0
- package/dist/esm/src/parsers/DeleteQueryParser.d.ts +16 -0
- package/dist/esm/src/parsers/DeleteQueryParser.js +73 -0
- package/dist/esm/src/parsers/DeleteQueryParser.js.map +1 -0
- package/dist/esm/src/parsers/DropConstraintParser.d.ts +12 -0
- package/dist/esm/src/parsers/DropConstraintParser.js +47 -0
- package/dist/esm/src/parsers/DropConstraintParser.js.map +1 -0
- package/dist/esm/src/parsers/DropIndexParser.d.ts +12 -0
- package/dist/esm/src/parsers/DropIndexParser.js +69 -0
- package/dist/esm/src/parsers/DropIndexParser.js.map +1 -0
- package/dist/esm/src/parsers/DropTableParser.d.ts +12 -0
- package/dist/esm/src/parsers/DropTableParser.js +59 -0
- package/dist/esm/src/parsers/DropTableParser.js.map +1 -0
- package/dist/esm/src/parsers/FunctionExpressionParser.d.ts +4 -0
- package/dist/esm/src/parsers/FunctionExpressionParser.js +25 -8
- package/dist/esm/src/parsers/FunctionExpressionParser.js.map +1 -1
- package/dist/esm/src/parsers/InsertQueryParser.js +103 -31
- package/dist/esm/src/parsers/InsertQueryParser.js.map +1 -1
- package/dist/esm/src/parsers/MergeQueryParser.d.ts +26 -0
- package/dist/esm/src/parsers/MergeQueryParser.js +479 -0
- package/dist/esm/src/parsers/MergeQueryParser.js.map +1 -0
- package/dist/esm/src/parsers/ReturningClauseParser.js +50 -7
- package/dist/esm/src/parsers/ReturningClauseParser.js.map +1 -1
- package/dist/esm/src/parsers/SelectClauseParser.js +3 -3
- package/dist/esm/src/parsers/SelectClauseParser.js.map +1 -1
- package/dist/esm/src/parsers/SelectQueryParser.d.ts +4 -0
- package/dist/esm/src/parsers/SelectQueryParser.js +4 -0
- package/dist/esm/src/parsers/SelectQueryParser.js.map +1 -1
- package/dist/esm/src/parsers/SetClauseParser.js +97 -15
- package/dist/esm/src/parsers/SetClauseParser.js.map +1 -1
- package/dist/esm/src/parsers/SqlParser.d.ts +38 -0
- package/dist/esm/src/parsers/SqlParser.js +344 -0
- package/dist/esm/src/parsers/SqlParser.js.map +1 -0
- package/dist/esm/src/parsers/SqlPrintTokenParser.d.ts +68 -21
- package/dist/esm/src/parsers/SqlPrintTokenParser.js +1145 -254
- package/dist/esm/src/parsers/SqlPrintTokenParser.js.map +1 -1
- package/dist/esm/src/parsers/SqlTokenizer.d.ts +24 -2
- package/dist/esm/src/parsers/SqlTokenizer.js +135 -74
- package/dist/esm/src/parsers/SqlTokenizer.js.map +1 -1
- package/dist/esm/src/parsers/UpdateQueryParser.js +11 -1
- package/dist/esm/src/parsers/UpdateQueryParser.js.map +1 -1
- package/dist/esm/src/parsers/UsingClauseParser.d.ts +11 -0
- package/dist/esm/src/parsers/UsingClauseParser.js +29 -0
- package/dist/esm/src/parsers/UsingClauseParser.js.map +1 -0
- package/dist/esm/src/parsers/ValueParser.js +5 -1
- package/dist/esm/src/parsers/ValueParser.js.map +1 -1
- package/dist/esm/src/parsers/ValuesQueryParser.d.ts +0 -2
- package/dist/esm/src/parsers/ValuesQueryParser.js +5 -45
- package/dist/esm/src/parsers/ValuesQueryParser.js.map +1 -1
- package/dist/esm/src/parsers/utils/LexemeCommentUtils.d.ts +6 -0
- package/dist/esm/src/parsers/utils/LexemeCommentUtils.js +26 -0
- package/dist/esm/src/parsers/utils/LexemeCommentUtils.js.map +1 -0
- package/dist/esm/src/tokenReaders/CommandTokenReader.js +49 -2
- package/dist/esm/src/tokenReaders/CommandTokenReader.js.map +1 -1
- package/dist/esm/src/tokenReaders/LiteralTokenReader.js +8 -5
- package/dist/esm/src/tokenReaders/LiteralTokenReader.js.map +1 -1
- package/dist/esm/src/tokenReaders/OperatorTokenReader.js +10 -1
- package/dist/esm/src/tokenReaders/OperatorTokenReader.js.map +1 -1
- package/dist/esm/src/tokenReaders/TypeTokenReader.js +11 -1
- package/dist/esm/src/tokenReaders/TypeTokenReader.js.map +1 -1
- package/dist/esm/src/transformers/InsertQuerySelectValuesConverter.d.ts +18 -0
- package/dist/esm/src/transformers/InsertQuerySelectValuesConverter.js +118 -0
- package/dist/esm/src/transformers/InsertQuerySelectValuesConverter.js.map +1 -0
- package/dist/esm/src/transformers/LinePrinter.d.ts +2 -0
- package/dist/esm/src/transformers/LinePrinter.js +34 -1
- package/dist/esm/src/transformers/LinePrinter.js.map +1 -1
- package/dist/esm/src/transformers/OnelineFormattingHelper.d.ts +29 -0
- package/dist/esm/src/transformers/OnelineFormattingHelper.js +88 -0
- package/dist/esm/src/transformers/OnelineFormattingHelper.js.map +1 -0
- package/dist/esm/src/transformers/QueryBuilder.d.ts +47 -13
- package/dist/esm/src/transformers/QueryBuilder.js +424 -62
- package/dist/esm/src/transformers/QueryBuilder.js.map +1 -1
- package/dist/esm/src/transformers/SqlFormatter.d.ts +13 -3
- package/dist/esm/src/transformers/SqlFormatter.js +13 -4
- package/dist/esm/src/transformers/SqlFormatter.js.map +1 -1
- package/dist/esm/src/transformers/SqlPrinter.d.ts +63 -10
- package/dist/esm/src/transformers/SqlPrinter.js +954 -64
- package/dist/esm/src/transformers/SqlPrinter.js.map +1 -1
- package/dist/esm/src/types/Formatting.d.ts +8 -0
- package/dist/esm/src/types/Formatting.js +2 -0
- package/dist/esm/src/types/Formatting.js.map +1 -0
- package/dist/esm/src/utils/ParserStringUtils.d.ts +6 -0
- package/dist/esm/src/utils/ParserStringUtils.js +28 -0
- package/dist/esm/src/utils/ParserStringUtils.js.map +1 -0
- package/dist/esm/tsconfig.browser.tsbuildinfo +1 -1
- package/dist/index.min.js +22 -17
- package/dist/index.min.js.map +4 -4
- package/dist/src/index.d.ts +18 -0
- package/dist/src/index.js +18 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/models/BinarySelectQuery.d.ts +25 -1
- package/dist/src/models/BinarySelectQuery.js +28 -0
- package/dist/src/models/BinarySelectQuery.js.map +1 -1
- package/dist/src/models/Clause.d.ts +14 -2
- package/dist/src/models/Clause.js +29 -2
- package/dist/src/models/Clause.js.map +1 -1
- package/dist/src/models/CreateTableQuery.d.ts +99 -5
- package/dist/src/models/CreateTableQuery.js +90 -11
- package/dist/src/models/CreateTableQuery.js.map +1 -1
- package/dist/src/models/DDLStatements.d.ts +157 -0
- package/dist/src/models/DDLStatements.js +153 -0
- package/dist/src/models/DDLStatements.js.map +1 -0
- package/dist/src/models/DeleteQuery.d.ts +17 -0
- package/dist/src/models/DeleteQuery.js +20 -0
- package/dist/src/models/DeleteQuery.js.map +1 -0
- package/dist/src/models/InsertQuery.d.ts +7 -1
- package/dist/src/models/InsertQuery.js +6 -2
- package/dist/src/models/InsertQuery.js.map +1 -1
- package/dist/src/models/MergeQuery.d.ts +63 -0
- package/dist/src/models/MergeQuery.js +104 -0
- package/dist/src/models/MergeQuery.js.map +1 -0
- package/dist/src/models/SelectQuery.d.ts +37 -1
- package/dist/src/models/SelectQuery.js +7 -1
- package/dist/src/models/SelectQuery.js.map +1 -1
- package/dist/src/models/SimpleSelectQuery.d.ts +29 -1
- package/dist/src/models/SimpleSelectQuery.js +32 -0
- package/dist/src/models/SimpleSelectQuery.js.map +1 -1
- package/dist/src/models/SqlComponent.d.ts +2 -1
- package/dist/src/models/SqlComponent.js +1 -1
- package/dist/src/models/SqlComponent.js.map +1 -1
- package/dist/src/models/SqlPrintToken.d.ts +33 -0
- package/dist/src/models/SqlPrintToken.js +32 -0
- package/dist/src/models/SqlPrintToken.js.map +1 -1
- package/dist/src/models/ValuesQuery.d.ts +25 -1
- package/dist/src/models/ValuesQuery.js +28 -0
- package/dist/src/models/ValuesQuery.js.map +1 -1
- package/dist/src/parsers/AlterTableParser.d.ts +25 -0
- package/dist/src/parsers/AlterTableParser.js +432 -0
- package/dist/src/parsers/AlterTableParser.js.map +1 -0
- package/dist/src/parsers/CreateIndexParser.d.ts +16 -0
- package/dist/src/parsers/CreateIndexParser.js +241 -0
- package/dist/src/parsers/CreateIndexParser.js.map +1 -0
- package/dist/src/parsers/CreateTableParser.d.ts +41 -0
- package/dist/src/parsers/CreateTableParser.js +738 -0
- package/dist/src/parsers/CreateTableParser.js.map +1 -0
- package/dist/src/parsers/DeleteClauseParser.d.ts +11 -0
- package/dist/src/parsers/DeleteClauseParser.js +37 -0
- package/dist/src/parsers/DeleteClauseParser.js.map +1 -0
- package/dist/src/parsers/DeleteQueryParser.d.ts +16 -0
- package/dist/src/parsers/DeleteQueryParser.js +77 -0
- package/dist/src/parsers/DeleteQueryParser.js.map +1 -0
- package/dist/src/parsers/DropConstraintParser.d.ts +12 -0
- package/dist/src/parsers/DropConstraintParser.js +51 -0
- package/dist/src/parsers/DropConstraintParser.js.map +1 -0
- package/dist/src/parsers/DropIndexParser.d.ts +12 -0
- package/dist/src/parsers/DropIndexParser.js +73 -0
- package/dist/src/parsers/DropIndexParser.js.map +1 -0
- package/dist/src/parsers/DropTableParser.d.ts +12 -0
- package/dist/src/parsers/DropTableParser.js +63 -0
- package/dist/src/parsers/DropTableParser.js.map +1 -0
- package/dist/src/parsers/FunctionExpressionParser.d.ts +4 -0
- package/dist/src/parsers/FunctionExpressionParser.js +25 -8
- package/dist/src/parsers/FunctionExpressionParser.js.map +1 -1
- package/dist/src/parsers/InsertQueryParser.js +103 -31
- package/dist/src/parsers/InsertQueryParser.js.map +1 -1
- package/dist/src/parsers/MergeQueryParser.d.ts +26 -0
- package/dist/src/parsers/MergeQueryParser.js +483 -0
- package/dist/src/parsers/MergeQueryParser.js.map +1 -0
- package/dist/src/parsers/ReturningClauseParser.js +50 -7
- package/dist/src/parsers/ReturningClauseParser.js.map +1 -1
- package/dist/src/parsers/SelectClauseParser.js +2 -2
- package/dist/src/parsers/SelectClauseParser.js.map +1 -1
- package/dist/src/parsers/SelectQueryParser.d.ts +4 -0
- package/dist/src/parsers/SelectQueryParser.js +4 -0
- package/dist/src/parsers/SelectQueryParser.js.map +1 -1
- package/dist/src/parsers/SetClauseParser.js +97 -15
- package/dist/src/parsers/SetClauseParser.js.map +1 -1
- package/dist/src/parsers/SqlParser.d.ts +38 -0
- package/dist/src/parsers/SqlParser.js +353 -0
- package/dist/src/parsers/SqlParser.js.map +1 -0
- package/dist/src/parsers/SqlPrintTokenParser.d.ts +68 -21
- package/dist/src/parsers/SqlPrintTokenParser.js +1143 -252
- package/dist/src/parsers/SqlPrintTokenParser.js.map +1 -1
- package/dist/src/parsers/SqlTokenizer.d.ts +24 -2
- package/dist/src/parsers/SqlTokenizer.js +139 -74
- package/dist/src/parsers/SqlTokenizer.js.map +1 -1
- package/dist/src/parsers/UpdateQueryParser.js +11 -1
- package/dist/src/parsers/UpdateQueryParser.js.map +1 -1
- package/dist/src/parsers/UsingClauseParser.d.ts +11 -0
- package/dist/src/parsers/UsingClauseParser.js +33 -0
- package/dist/src/parsers/UsingClauseParser.js.map +1 -0
- package/dist/src/parsers/ValueParser.js +5 -1
- package/dist/src/parsers/ValueParser.js.map +1 -1
- package/dist/src/parsers/ValuesQueryParser.d.ts +0 -2
- package/dist/src/parsers/ValuesQueryParser.js +5 -45
- package/dist/src/parsers/ValuesQueryParser.js.map +1 -1
- package/dist/src/parsers/utils/LexemeCommentUtils.d.ts +6 -0
- package/dist/src/parsers/utils/LexemeCommentUtils.js +29 -0
- package/dist/src/parsers/utils/LexemeCommentUtils.js.map +1 -0
- package/dist/src/tokenReaders/CommandTokenReader.js +49 -2
- package/dist/src/tokenReaders/CommandTokenReader.js.map +1 -1
- package/dist/src/tokenReaders/LiteralTokenReader.js +8 -5
- package/dist/src/tokenReaders/LiteralTokenReader.js.map +1 -1
- package/dist/src/tokenReaders/OperatorTokenReader.js +10 -1
- package/dist/src/tokenReaders/OperatorTokenReader.js.map +1 -1
- package/dist/src/tokenReaders/TypeTokenReader.js +11 -1
- package/dist/src/tokenReaders/TypeTokenReader.js.map +1 -1
- package/dist/src/transformers/InsertQuerySelectValuesConverter.d.ts +18 -0
- package/dist/src/transformers/InsertQuerySelectValuesConverter.js +122 -0
- package/dist/src/transformers/InsertQuerySelectValuesConverter.js.map +1 -0
- package/dist/src/transformers/LinePrinter.d.ts +2 -0
- package/dist/src/transformers/LinePrinter.js +34 -1
- package/dist/src/transformers/LinePrinter.js.map +1 -1
- package/dist/src/transformers/OnelineFormattingHelper.d.ts +29 -0
- package/dist/src/transformers/OnelineFormattingHelper.js +92 -0
- package/dist/src/transformers/OnelineFormattingHelper.js.map +1 -0
- package/dist/src/transformers/QueryBuilder.d.ts +47 -13
- package/dist/src/transformers/QueryBuilder.js +433 -60
- package/dist/src/transformers/QueryBuilder.js.map +1 -1
- package/dist/src/transformers/SqlFormatter.d.ts +13 -3
- package/dist/src/transformers/SqlFormatter.js +20 -6
- package/dist/src/transformers/SqlFormatter.js.map +1 -1
- package/dist/src/transformers/SqlPrinter.d.ts +63 -10
- package/dist/src/transformers/SqlPrinter.js +954 -64
- package/dist/src/transformers/SqlPrinter.js.map +1 -1
- package/dist/src/types/Formatting.d.ts +8 -0
- package/dist/src/types/Formatting.js +3 -0
- package/dist/src/types/Formatting.js.map +1 -0
- package/dist/src/utils/ParserStringUtils.d.ts +6 -0
- package/dist/src/utils/ParserStringUtils.js +31 -0
- package/dist/src/utils/ParserStringUtils.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,738 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CreateTableParser = void 0;
|
|
4
|
+
const SqlTokenizer_1 = require("./SqlTokenizer");
|
|
5
|
+
const SelectQueryParser_1 = require("./SelectQueryParser");
|
|
6
|
+
const CreateTableQuery_1 = require("../models/CreateTableQuery");
|
|
7
|
+
const Lexeme_1 = require("../models/Lexeme");
|
|
8
|
+
const FullNameParser_1 = require("./FullNameParser");
|
|
9
|
+
const FunctionExpressionParser_1 = require("./FunctionExpressionParser");
|
|
10
|
+
const ValueParser_1 = require("./ValueParser");
|
|
11
|
+
const ValueComponent_1 = require("../models/ValueComponent");
|
|
12
|
+
const ParserStringUtils_1 = require("../utils/ParserStringUtils");
|
|
13
|
+
/**
|
|
14
|
+
* Parses CREATE TABLE statements (DDL or AS SELECT) into CreateTableQuery models.
|
|
15
|
+
*/
|
|
16
|
+
class CreateTableParser {
|
|
17
|
+
/**
|
|
18
|
+
* Parse SQL string to CreateTableQuery AST.
|
|
19
|
+
*/
|
|
20
|
+
static parse(query) {
|
|
21
|
+
const tokenizer = new SqlTokenizer_1.SqlTokenizer(query);
|
|
22
|
+
const lexemes = tokenizer.readLexemes();
|
|
23
|
+
const result = this.parseFromLexeme(lexemes, 0);
|
|
24
|
+
if (result.newIndex < lexemes.length) {
|
|
25
|
+
throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The CREATE TABLE statement is complete but there are additional tokens.`);
|
|
26
|
+
}
|
|
27
|
+
return result.value;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Parse from lexeme array (for internal use and tests).
|
|
31
|
+
*/
|
|
32
|
+
static parseFromLexeme(lexemes, index) {
|
|
33
|
+
var _a;
|
|
34
|
+
let idx = index;
|
|
35
|
+
// Guard against unexpected end of input before parsing begins.
|
|
36
|
+
if (idx >= lexemes.length) {
|
|
37
|
+
throw new Error(`[CreateTableParser] Unexpected end of input at position ${idx}.`);
|
|
38
|
+
}
|
|
39
|
+
const commandLexeme = lexemes[idx];
|
|
40
|
+
// Capture comments that precede the CREATE TABLE keyword so they can be re-applied later.
|
|
41
|
+
const leadingCreateComments = this.popLexemeComments(commandLexeme, 'before');
|
|
42
|
+
const commandToken = commandLexeme.value.toLowerCase();
|
|
43
|
+
const isTemporary = commandToken === "create temporary table";
|
|
44
|
+
if (commandToken !== "create table" && !isTemporary) {
|
|
45
|
+
throw new Error(`[CreateTableParser] Syntax error at position ${idx}: expected 'CREATE TABLE' but found '${lexemes[idx].value}'.`);
|
|
46
|
+
}
|
|
47
|
+
idx++;
|
|
48
|
+
// Handle optional IF NOT EXISTS clause.
|
|
49
|
+
const tokenAt = (offset) => { var _a; return (_a = lexemes[idx + offset]) === null || _a === void 0 ? void 0 : _a.value.toLowerCase(); };
|
|
50
|
+
let ifNotExists = false;
|
|
51
|
+
if (tokenAt(0) === "if not exists") {
|
|
52
|
+
idx++;
|
|
53
|
+
ifNotExists = true;
|
|
54
|
+
}
|
|
55
|
+
// Parse qualified table name.
|
|
56
|
+
const tableNameResult = this.parseQualifiedName(lexemes, idx);
|
|
57
|
+
idx = tableNameResult.newIndex;
|
|
58
|
+
const tableName = tableNameResult.name;
|
|
59
|
+
const tableNamespaces = tableNameResult.namespaces;
|
|
60
|
+
// Place captured comments from the identifier on the CreateTableQuery after instantiation.
|
|
61
|
+
const positionedComments = tableName.positionedComments ? [...tableName.positionedComments] : null;
|
|
62
|
+
const legacyComments = tableName.comments ? [...tableName.comments] : null;
|
|
63
|
+
let columns = [];
|
|
64
|
+
let tableConstraints = [];
|
|
65
|
+
let tableOptions = null;
|
|
66
|
+
let asSelectQuery;
|
|
67
|
+
let withDataOption = null;
|
|
68
|
+
// Parse DDL column definitions when present.
|
|
69
|
+
if (((_a = lexemes[idx]) === null || _a === void 0 ? void 0 : _a.type) === Lexeme_1.TokenType.OpenParen) {
|
|
70
|
+
({ columns, tableConstraints, newIndex: idx } = this.parseDefinitionList(lexemes, idx));
|
|
71
|
+
}
|
|
72
|
+
// Capture trailing table options that appear before an AS SELECT clause.
|
|
73
|
+
if (idx < lexemes.length) {
|
|
74
|
+
const nextValue = tokenAt(0);
|
|
75
|
+
if (!this.isSelectKeyword(nextValue, lexemes[idx + 1])) {
|
|
76
|
+
const optionsEnd = this.findClauseBoundary(lexemes, idx);
|
|
77
|
+
if (optionsEnd > idx) {
|
|
78
|
+
tableOptions = new ValueComponent_1.RawString((0, ParserStringUtils_1.joinLexemeValues)(lexemes, idx, optionsEnd));
|
|
79
|
+
idx = optionsEnd;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Parse optional AS SELECT / SELECT clause.
|
|
84
|
+
const nextToken = tokenAt(0);
|
|
85
|
+
if (nextToken === "as") {
|
|
86
|
+
idx++;
|
|
87
|
+
const selectResult = SelectQueryParser_1.SelectQueryParser.parseFromLexeme(lexemes, idx);
|
|
88
|
+
asSelectQuery = selectResult.value;
|
|
89
|
+
idx = selectResult.newIndex;
|
|
90
|
+
}
|
|
91
|
+
else if (nextToken === "select" || nextToken === "with" || nextToken === "values") {
|
|
92
|
+
const selectResult = SelectQueryParser_1.SelectQueryParser.parseFromLexeme(lexemes, idx);
|
|
93
|
+
asSelectQuery = selectResult.value;
|
|
94
|
+
idx = selectResult.newIndex;
|
|
95
|
+
}
|
|
96
|
+
if (asSelectQuery) {
|
|
97
|
+
// Allow optional PostgreSQL-style WITH [NO] DATA clause after AS SELECT bodies.
|
|
98
|
+
const withResult = this.parseWithDataOption(lexemes, idx);
|
|
99
|
+
if (withResult) {
|
|
100
|
+
withDataOption = withResult.value;
|
|
101
|
+
idx = withResult.newIndex;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const query = new CreateTableQuery_1.CreateTableQuery({
|
|
105
|
+
tableName: tableName.name,
|
|
106
|
+
namespaces: tableNamespaces,
|
|
107
|
+
isTemporary,
|
|
108
|
+
ifNotExists,
|
|
109
|
+
columns,
|
|
110
|
+
tableConstraints,
|
|
111
|
+
tableOptions,
|
|
112
|
+
asSelectQuery,
|
|
113
|
+
withDataOption
|
|
114
|
+
});
|
|
115
|
+
// Re-attach positioned comments captured on the identifier.
|
|
116
|
+
if (positionedComments) {
|
|
117
|
+
query.tableName.positionedComments = positionedComments.map(pc => ({
|
|
118
|
+
position: pc.position,
|
|
119
|
+
comments: [...pc.comments]
|
|
120
|
+
}));
|
|
121
|
+
}
|
|
122
|
+
if (legacyComments) {
|
|
123
|
+
query.tableName.comments = [...legacyComments];
|
|
124
|
+
}
|
|
125
|
+
if (leadingCreateComments.length > 0) {
|
|
126
|
+
// Keep top-level comments aligned with the CREATE TABLE statement.
|
|
127
|
+
query.addPositionedComments('before', leadingCreateComments);
|
|
128
|
+
}
|
|
129
|
+
return { value: query, newIndex: idx };
|
|
130
|
+
}
|
|
131
|
+
static parseQualifiedName(lexemes, index) {
|
|
132
|
+
const { namespaces, name, newIndex } = FullNameParser_1.FullNameParser.parseFromLexeme(lexemes, index);
|
|
133
|
+
return {
|
|
134
|
+
namespaces: namespaces ? [...namespaces] : null,
|
|
135
|
+
name,
|
|
136
|
+
newIndex
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
static parseDefinitionList(lexemes, index) {
|
|
140
|
+
var _a, _b;
|
|
141
|
+
let idx = index;
|
|
142
|
+
const columns = [];
|
|
143
|
+
const constraints = [];
|
|
144
|
+
const openParenLexeme = lexemes[idx];
|
|
145
|
+
// Convert comments placed immediately after '(' into leading comments for the first entry.
|
|
146
|
+
let pendingLeading = this.toOptionalComments(this.popLexemeComments(openParenLexeme, 'after'));
|
|
147
|
+
// Skip opening parenthesis.
|
|
148
|
+
idx++;
|
|
149
|
+
// Parse individual column or constraint entries until closing parenthesis.
|
|
150
|
+
while (idx < lexemes.length) {
|
|
151
|
+
const lexeme = lexemes[idx];
|
|
152
|
+
if (lexeme.type === Lexeme_1.TokenType.CloseParen) {
|
|
153
|
+
// When comments sit right before ')', keep them with the preceding entry.
|
|
154
|
+
const closingLeading = this.popLexemeComments(lexeme, 'before');
|
|
155
|
+
if (closingLeading.length > 0) {
|
|
156
|
+
const target = (_a = (constraints.length > 0 ? constraints[constraints.length - 1] : columns[columns.length - 1])) !== null && _a !== void 0 ? _a : null;
|
|
157
|
+
if (target) {
|
|
158
|
+
target.addPositionedComments('after', closingLeading);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
idx++;
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
const tokenValue = lexeme.value.toLowerCase();
|
|
165
|
+
const isConstraint = this.TABLE_CONSTRAINT_STARTERS.has(tokenValue);
|
|
166
|
+
const entryResult = isConstraint
|
|
167
|
+
? this.parseTableConstraint(lexemes, idx)
|
|
168
|
+
: this.parseColumnDefinition(lexemes, idx);
|
|
169
|
+
let entry = entryResult.value;
|
|
170
|
+
if (pendingLeading && pendingLeading.length > 0) {
|
|
171
|
+
// Reattach comments that belonged between comma/parenthesis and the entry itself.
|
|
172
|
+
entry.addPositionedComments('before', pendingLeading);
|
|
173
|
+
pendingLeading = null;
|
|
174
|
+
}
|
|
175
|
+
const trailingComments = this.popLexemeComments(lexemes[Math.max(entryResult.newIndex - 1, idx)], 'after');
|
|
176
|
+
if (trailingComments.length > 0) {
|
|
177
|
+
// Preserve inline comments that appeared after the entry tokens.
|
|
178
|
+
entry.addPositionedComments('after', trailingComments);
|
|
179
|
+
}
|
|
180
|
+
if (isConstraint) {
|
|
181
|
+
constraints.push(entry);
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
columns.push(entry);
|
|
185
|
+
}
|
|
186
|
+
idx = entryResult.newIndex;
|
|
187
|
+
// Consume delimiter comma between definitions.
|
|
188
|
+
if (idx < lexemes.length && (lexemes[idx].type & Lexeme_1.TokenType.Comma)) {
|
|
189
|
+
const commaLexeme = lexemes[idx];
|
|
190
|
+
const commaTrailing = this.popLexemeComments(commaLexeme, 'after');
|
|
191
|
+
pendingLeading = this.toOptionalComments(commaTrailing);
|
|
192
|
+
idx++;
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
// Break when encountering the closing parenthesis.
|
|
196
|
+
if (idx < lexemes.length && lexemes[idx].type === Lexeme_1.TokenType.CloseParen) {
|
|
197
|
+
const closingLexeme = lexemes[idx];
|
|
198
|
+
const closingLeading = this.popLexemeComments(closingLexeme, 'before');
|
|
199
|
+
if (closingLeading.length > 0) {
|
|
200
|
+
const target = (_b = (constraints.length > 0 ? constraints[constraints.length - 1] : columns[columns.length - 1])) !== null && _b !== void 0 ? _b : null;
|
|
201
|
+
if (target) {
|
|
202
|
+
target.addPositionedComments('after', closingLeading);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
idx++;
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
pendingLeading = null;
|
|
209
|
+
}
|
|
210
|
+
return { columns, tableConstraints: constraints, newIndex: idx };
|
|
211
|
+
}
|
|
212
|
+
static parseColumnDefinition(lexemes, index) {
|
|
213
|
+
let idx = index;
|
|
214
|
+
// Parse the column name as a qualified identifier.
|
|
215
|
+
const columnNameResult = this.parseQualifiedName(lexemes, idx);
|
|
216
|
+
idx = columnNameResult.newIndex;
|
|
217
|
+
if (columnNameResult.namespaces && columnNameResult.namespaces.length > 0) {
|
|
218
|
+
const qualified = [...columnNameResult.namespaces, columnNameResult.name.name].join(".");
|
|
219
|
+
throw new Error(`[CreateTableParser] Column name '${qualified}' must not include a schema or namespace qualifier.`);
|
|
220
|
+
}
|
|
221
|
+
const columnName = columnNameResult.name;
|
|
222
|
+
// Parse optional data type immediately following the column name.
|
|
223
|
+
let dataType;
|
|
224
|
+
if (idx < lexemes.length && !this.isColumnConstraintStart(lexemes[idx]) && !this.isColumnTerminator(lexemes[idx])) {
|
|
225
|
+
const typeResult = this.parseColumnType(lexemes, idx);
|
|
226
|
+
dataType = typeResult.value;
|
|
227
|
+
idx = typeResult.newIndex;
|
|
228
|
+
}
|
|
229
|
+
// Collect column constraints until termination.
|
|
230
|
+
const constraints = [];
|
|
231
|
+
while (idx < lexemes.length && !this.isColumnTerminator(lexemes[idx])) {
|
|
232
|
+
const constraintResult = this.parseColumnConstraint(lexemes, idx);
|
|
233
|
+
constraints.push(constraintResult.value);
|
|
234
|
+
idx = constraintResult.newIndex;
|
|
235
|
+
}
|
|
236
|
+
const columnDef = new CreateTableQuery_1.TableColumnDefinition({
|
|
237
|
+
name: columnName,
|
|
238
|
+
dataType,
|
|
239
|
+
constraints
|
|
240
|
+
});
|
|
241
|
+
return { value: columnDef, newIndex: idx };
|
|
242
|
+
}
|
|
243
|
+
static parseColumnType(lexemes, index) {
|
|
244
|
+
try {
|
|
245
|
+
const result = FunctionExpressionParser_1.FunctionExpressionParser.parseTypeValue(lexemes, index);
|
|
246
|
+
return { value: result.value, newIndex: result.newIndex };
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
const typeEnd = this.findFirstConstraintIndex(lexemes, index);
|
|
250
|
+
const rawText = (0, ParserStringUtils_1.joinLexemeValues)(lexemes, index, typeEnd);
|
|
251
|
+
return { value: new ValueComponent_1.RawString(rawText), newIndex: typeEnd };
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
static parseColumnConstraint(lexemes, index) {
|
|
255
|
+
var _a;
|
|
256
|
+
let idx = index;
|
|
257
|
+
let constraintName;
|
|
258
|
+
// Handle optional CONSTRAINT <name> prefix.
|
|
259
|
+
if (((_a = lexemes[idx]) === null || _a === void 0 ? void 0 : _a.value.toLowerCase()) === "constraint") {
|
|
260
|
+
idx++;
|
|
261
|
+
const nameResult = this.parseQualifiedName(lexemes, idx);
|
|
262
|
+
constraintName = nameResult.name;
|
|
263
|
+
idx = nameResult.newIndex;
|
|
264
|
+
}
|
|
265
|
+
const token = lexemes[idx];
|
|
266
|
+
if (!token) {
|
|
267
|
+
throw new Error(`[CreateTableParser] Expected constraint definition at index ${idx}.`);
|
|
268
|
+
}
|
|
269
|
+
const value = token.value.toLowerCase();
|
|
270
|
+
// Parse NOT NULL / NULL constraints.
|
|
271
|
+
if (value === "not null" || value === "null") {
|
|
272
|
+
idx++;
|
|
273
|
+
return {
|
|
274
|
+
value: new CreateTableQuery_1.ColumnConstraintDefinition({
|
|
275
|
+
kind: value === "not null" ? "not-null" : "null",
|
|
276
|
+
constraintName
|
|
277
|
+
}),
|
|
278
|
+
newIndex: idx
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
// Parse DEFAULT constraint with arbitrary expressions.
|
|
282
|
+
if (value === "default") {
|
|
283
|
+
idx++;
|
|
284
|
+
const exprResult = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
|
|
285
|
+
idx = exprResult.newIndex;
|
|
286
|
+
return {
|
|
287
|
+
value: new CreateTableQuery_1.ColumnConstraintDefinition({
|
|
288
|
+
kind: "default",
|
|
289
|
+
constraintName,
|
|
290
|
+
defaultValue: exprResult.value
|
|
291
|
+
}),
|
|
292
|
+
newIndex: idx
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
// Parse PRIMARY KEY constraint.
|
|
296
|
+
if (value === "primary key") {
|
|
297
|
+
idx++;
|
|
298
|
+
return {
|
|
299
|
+
value: new CreateTableQuery_1.ColumnConstraintDefinition({
|
|
300
|
+
kind: "primary-key",
|
|
301
|
+
constraintName
|
|
302
|
+
}),
|
|
303
|
+
newIndex: idx
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
// Parse UNIQUE / UNIQUE KEY constraint.
|
|
307
|
+
if (value === "unique" || value === "unique key") {
|
|
308
|
+
idx++;
|
|
309
|
+
return {
|
|
310
|
+
value: new CreateTableQuery_1.ColumnConstraintDefinition({
|
|
311
|
+
kind: "unique",
|
|
312
|
+
constraintName
|
|
313
|
+
}),
|
|
314
|
+
newIndex: idx
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
// Parse REFERENCES clause.
|
|
318
|
+
if (value === "references") {
|
|
319
|
+
const referenceResult = this.parseReferenceDefinition(lexemes, idx);
|
|
320
|
+
idx = referenceResult.newIndex;
|
|
321
|
+
return {
|
|
322
|
+
value: new CreateTableQuery_1.ColumnConstraintDefinition({
|
|
323
|
+
kind: "references",
|
|
324
|
+
constraintName,
|
|
325
|
+
reference: referenceResult.value
|
|
326
|
+
}),
|
|
327
|
+
newIndex: idx
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
// Parse CHECK constraint.
|
|
331
|
+
if (value === "check") {
|
|
332
|
+
idx++;
|
|
333
|
+
const checkExpression = this.parseParenExpression(lexemes, idx);
|
|
334
|
+
idx = checkExpression.newIndex;
|
|
335
|
+
return {
|
|
336
|
+
value: new CreateTableQuery_1.ColumnConstraintDefinition({
|
|
337
|
+
kind: "check",
|
|
338
|
+
constraintName,
|
|
339
|
+
checkExpression: checkExpression.value
|
|
340
|
+
}),
|
|
341
|
+
newIndex: idx
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
// Parse identity-style generated clauses.
|
|
345
|
+
if (value.startsWith("generated")) {
|
|
346
|
+
const clauseEnd = this.findFirstConstraintIndex(lexemes, idx + 1);
|
|
347
|
+
const text = (0, ParserStringUtils_1.joinLexemeValues)(lexemes, idx, clauseEnd);
|
|
348
|
+
idx = clauseEnd;
|
|
349
|
+
const kind = value.startsWith("generated always")
|
|
350
|
+
? "generated-always-identity"
|
|
351
|
+
: "generated-by-default-identity";
|
|
352
|
+
return {
|
|
353
|
+
value: new CreateTableQuery_1.ColumnConstraintDefinition({
|
|
354
|
+
kind,
|
|
355
|
+
constraintName,
|
|
356
|
+
rawClause: new ValueComponent_1.RawString(text)
|
|
357
|
+
}),
|
|
358
|
+
newIndex: idx
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
// Fallback to raw clause capture for unsupported constraints.
|
|
362
|
+
const rawEnd = this.findFirstConstraintIndex(lexemes, idx + 1);
|
|
363
|
+
const rawText = (0, ParserStringUtils_1.joinLexemeValues)(lexemes, idx, rawEnd);
|
|
364
|
+
return {
|
|
365
|
+
value: new CreateTableQuery_1.ColumnConstraintDefinition({
|
|
366
|
+
kind: "raw",
|
|
367
|
+
constraintName,
|
|
368
|
+
rawClause: new ValueComponent_1.RawString(rawText)
|
|
369
|
+
}),
|
|
370
|
+
newIndex: rawEnd
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
static parseTableConstraint(lexemes, index) {
|
|
374
|
+
var _a;
|
|
375
|
+
let idx = index;
|
|
376
|
+
let constraintName;
|
|
377
|
+
// Capture optional CONSTRAINT <name> prefix.
|
|
378
|
+
if (((_a = lexemes[idx]) === null || _a === void 0 ? void 0 : _a.value.toLowerCase()) === "constraint") {
|
|
379
|
+
idx++;
|
|
380
|
+
const nameResult = this.parseQualifiedName(lexemes, idx);
|
|
381
|
+
constraintName = nameResult.name;
|
|
382
|
+
idx = nameResult.newIndex;
|
|
383
|
+
}
|
|
384
|
+
const token = lexemes[idx];
|
|
385
|
+
if (!token) {
|
|
386
|
+
throw new Error(`[CreateTableParser] Expected table constraint at index ${idx}.`);
|
|
387
|
+
}
|
|
388
|
+
const value = token.value.toLowerCase();
|
|
389
|
+
if (value === "primary key") {
|
|
390
|
+
idx++;
|
|
391
|
+
const { identifiers, newIndex } = this.parseIdentifierList(lexemes, idx);
|
|
392
|
+
idx = newIndex;
|
|
393
|
+
return {
|
|
394
|
+
value: new CreateTableQuery_1.TableConstraintDefinition({
|
|
395
|
+
kind: "primary-key",
|
|
396
|
+
constraintName,
|
|
397
|
+
columns: identifiers
|
|
398
|
+
}),
|
|
399
|
+
newIndex: idx
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
if (value === "unique" || value === "unique key") {
|
|
403
|
+
idx++;
|
|
404
|
+
let inlineKeyName;
|
|
405
|
+
if (idx < lexemes.length &&
|
|
406
|
+
lexemes[idx].value !== "(" &&
|
|
407
|
+
!(lexemes[idx].type & Lexeme_1.TokenType.Command)) {
|
|
408
|
+
const inlineNameResult = this.parseQualifiedName(lexemes, idx);
|
|
409
|
+
inlineKeyName = inlineNameResult.name;
|
|
410
|
+
idx = inlineNameResult.newIndex;
|
|
411
|
+
}
|
|
412
|
+
const { identifiers, newIndex } = this.parseIdentifierList(lexemes, idx);
|
|
413
|
+
idx = newIndex;
|
|
414
|
+
return {
|
|
415
|
+
value: new CreateTableQuery_1.TableConstraintDefinition({
|
|
416
|
+
kind: "unique",
|
|
417
|
+
constraintName: constraintName !== null && constraintName !== void 0 ? constraintName : inlineKeyName,
|
|
418
|
+
columns: identifiers
|
|
419
|
+
}),
|
|
420
|
+
newIndex: idx
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
if (value === "foreign key") {
|
|
424
|
+
idx++;
|
|
425
|
+
let inlineKeyName;
|
|
426
|
+
if (idx < lexemes.length &&
|
|
427
|
+
lexemes[idx].value !== "(" &&
|
|
428
|
+
!(lexemes[idx].type & Lexeme_1.TokenType.Command)) {
|
|
429
|
+
const inlineNameResult = this.parseQualifiedName(lexemes, idx);
|
|
430
|
+
inlineKeyName = inlineNameResult.name;
|
|
431
|
+
idx = inlineNameResult.newIndex;
|
|
432
|
+
}
|
|
433
|
+
const { identifiers, newIndex } = this.parseIdentifierList(lexemes, idx);
|
|
434
|
+
idx = newIndex;
|
|
435
|
+
const referenceResult = this.parseReferenceDefinition(lexemes, idx);
|
|
436
|
+
idx = referenceResult.newIndex;
|
|
437
|
+
return {
|
|
438
|
+
value: new CreateTableQuery_1.TableConstraintDefinition({
|
|
439
|
+
kind: "foreign-key",
|
|
440
|
+
constraintName: constraintName !== null && constraintName !== void 0 ? constraintName : inlineKeyName,
|
|
441
|
+
columns: identifiers,
|
|
442
|
+
reference: referenceResult.value,
|
|
443
|
+
deferrable: referenceResult.value.deferrable,
|
|
444
|
+
initially: referenceResult.value.initially
|
|
445
|
+
}),
|
|
446
|
+
newIndex: idx
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
if (value === "check") {
|
|
450
|
+
idx++;
|
|
451
|
+
const checkExpression = this.parseParenExpression(lexemes, idx);
|
|
452
|
+
idx = checkExpression.newIndex;
|
|
453
|
+
return {
|
|
454
|
+
value: new CreateTableQuery_1.TableConstraintDefinition({
|
|
455
|
+
kind: "check",
|
|
456
|
+
constraintName,
|
|
457
|
+
checkExpression: checkExpression.value
|
|
458
|
+
}),
|
|
459
|
+
newIndex: idx
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
// Fallback to capturing the raw text when the constraint is not recognized.
|
|
463
|
+
const rawEnd = this.findFirstConstraintIndex(lexemes, idx + 1);
|
|
464
|
+
const rawText = (0, ParserStringUtils_1.joinLexemeValues)(lexemes, idx, rawEnd);
|
|
465
|
+
return {
|
|
466
|
+
value: new CreateTableQuery_1.TableConstraintDefinition({
|
|
467
|
+
kind: "raw",
|
|
468
|
+
constraintName,
|
|
469
|
+
rawClause: new ValueComponent_1.RawString(rawText)
|
|
470
|
+
}),
|
|
471
|
+
newIndex: rawEnd
|
|
472
|
+
};
|
|
473
|
+
}
|
|
474
|
+
static parseIdentifierList(lexemes, index) {
|
|
475
|
+
var _a, _b, _c;
|
|
476
|
+
let idx = index;
|
|
477
|
+
const identifiers = [];
|
|
478
|
+
if (((_a = lexemes[idx]) === null || _a === void 0 ? void 0 : _a.type) !== Lexeme_1.TokenType.OpenParen) {
|
|
479
|
+
throw new Error(`[CreateTableParser] Expected '(' to start identifier list at index ${idx}.`);
|
|
480
|
+
}
|
|
481
|
+
idx++;
|
|
482
|
+
while (idx < lexemes.length) {
|
|
483
|
+
const nameResult = this.parseQualifiedName(lexemes, idx);
|
|
484
|
+
identifiers.push(nameResult.name);
|
|
485
|
+
idx = nameResult.newIndex;
|
|
486
|
+
if (((_b = lexemes[idx]) === null || _b === void 0 ? void 0 : _b.type) === Lexeme_1.TokenType.Comma) {
|
|
487
|
+
idx++;
|
|
488
|
+
continue;
|
|
489
|
+
}
|
|
490
|
+
if (((_c = lexemes[idx]) === null || _c === void 0 ? void 0 : _c.type) === Lexeme_1.TokenType.CloseParen) {
|
|
491
|
+
idx++;
|
|
492
|
+
break;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
return { identifiers, newIndex: idx };
|
|
496
|
+
}
|
|
497
|
+
static parseReferenceDefinition(lexemes, index) {
|
|
498
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
499
|
+
let idx = index;
|
|
500
|
+
if (((_a = lexemes[idx]) === null || _a === void 0 ? void 0 : _a.value.toLowerCase()) !== "references") {
|
|
501
|
+
throw new Error(`[CreateTableParser] Expected REFERENCES clause at index ${idx}.`);
|
|
502
|
+
}
|
|
503
|
+
idx++;
|
|
504
|
+
const tableNameResult = this.parseQualifiedName(lexemes, idx);
|
|
505
|
+
idx = tableNameResult.newIndex;
|
|
506
|
+
const targetTable = new ValueComponent_1.QualifiedName(tableNameResult.namespaces, tableNameResult.name);
|
|
507
|
+
// Parse optional column list in the REFERENCES clause.
|
|
508
|
+
let columns = null;
|
|
509
|
+
if (((_b = lexemes[idx]) === null || _b === void 0 ? void 0 : _b.type) === Lexeme_1.TokenType.OpenParen) {
|
|
510
|
+
const listResult = this.parseIdentifierList(lexemes, idx);
|
|
511
|
+
columns = listResult.identifiers;
|
|
512
|
+
idx = listResult.newIndex;
|
|
513
|
+
}
|
|
514
|
+
let matchType = null;
|
|
515
|
+
let onDelete = null;
|
|
516
|
+
let onUpdate = null;
|
|
517
|
+
let deferrable = null;
|
|
518
|
+
let initially = null;
|
|
519
|
+
// Parse optional trailing reference options.
|
|
520
|
+
while (idx < lexemes.length) {
|
|
521
|
+
const current = lexemes[idx].value.toLowerCase();
|
|
522
|
+
if (this.MATCH_KEYWORDS.has(current)) {
|
|
523
|
+
matchType = this.MATCH_KEYWORDS.get(current);
|
|
524
|
+
idx++;
|
|
525
|
+
continue;
|
|
526
|
+
}
|
|
527
|
+
if (current === "match") {
|
|
528
|
+
idx++;
|
|
529
|
+
const descriptor = (_d = (_c = lexemes[idx]) === null || _c === void 0 ? void 0 : _c.value.toLowerCase()) !== null && _d !== void 0 ? _d : "";
|
|
530
|
+
matchType = descriptor;
|
|
531
|
+
idx++;
|
|
532
|
+
continue;
|
|
533
|
+
}
|
|
534
|
+
if (current === "on delete") {
|
|
535
|
+
idx++;
|
|
536
|
+
const action = (_f = (_e = lexemes[idx]) === null || _e === void 0 ? void 0 : _e.value.toLowerCase()) !== null && _f !== void 0 ? _f : "";
|
|
537
|
+
onDelete = (_g = this.REFERENTIAL_ACTIONS.get(action)) !== null && _g !== void 0 ? _g : null;
|
|
538
|
+
idx++;
|
|
539
|
+
continue;
|
|
540
|
+
}
|
|
541
|
+
if (current === "on update") {
|
|
542
|
+
idx++;
|
|
543
|
+
const action = (_j = (_h = lexemes[idx]) === null || _h === void 0 ? void 0 : _h.value.toLowerCase()) !== null && _j !== void 0 ? _j : "";
|
|
544
|
+
onUpdate = (_k = this.REFERENTIAL_ACTIONS.get(action)) !== null && _k !== void 0 ? _k : null;
|
|
545
|
+
idx++;
|
|
546
|
+
continue;
|
|
547
|
+
}
|
|
548
|
+
if (this.DEFERRABILITY_KEYWORDS.has(current)) {
|
|
549
|
+
deferrable = this.DEFERRABILITY_KEYWORDS.get(current);
|
|
550
|
+
idx++;
|
|
551
|
+
continue;
|
|
552
|
+
}
|
|
553
|
+
if (this.INITIALLY_KEYWORDS.has(current)) {
|
|
554
|
+
initially = this.INITIALLY_KEYWORDS.get(current);
|
|
555
|
+
idx++;
|
|
556
|
+
continue;
|
|
557
|
+
}
|
|
558
|
+
break;
|
|
559
|
+
}
|
|
560
|
+
return {
|
|
561
|
+
value: new CreateTableQuery_1.ReferenceDefinition({
|
|
562
|
+
targetTable,
|
|
563
|
+
columns,
|
|
564
|
+
matchType,
|
|
565
|
+
onDelete,
|
|
566
|
+
onUpdate,
|
|
567
|
+
deferrable,
|
|
568
|
+
initially
|
|
569
|
+
}),
|
|
570
|
+
newIndex: idx
|
|
571
|
+
};
|
|
572
|
+
}
|
|
573
|
+
static parseParenExpression(lexemes, index) {
|
|
574
|
+
var _a, _b;
|
|
575
|
+
let idx = index;
|
|
576
|
+
if (((_a = lexemes[idx]) === null || _a === void 0 ? void 0 : _a.type) !== Lexeme_1.TokenType.OpenParen) {
|
|
577
|
+
throw new Error(`[CreateTableParser] Expected '(' introducing expression at index ${idx}.`);
|
|
578
|
+
}
|
|
579
|
+
idx++;
|
|
580
|
+
const expressionResult = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
|
|
581
|
+
idx = expressionResult.newIndex;
|
|
582
|
+
if (((_b = lexemes[idx]) === null || _b === void 0 ? void 0 : _b.type) !== Lexeme_1.TokenType.CloseParen) {
|
|
583
|
+
throw new Error(`[CreateTableParser] Expected ')' terminating expression at index ${idx}.`);
|
|
584
|
+
}
|
|
585
|
+
idx++;
|
|
586
|
+
return { value: expressionResult.value, newIndex: idx };
|
|
587
|
+
}
|
|
588
|
+
static isColumnConstraintStart(lexeme) {
|
|
589
|
+
if (!lexeme) {
|
|
590
|
+
return false;
|
|
591
|
+
}
|
|
592
|
+
const lower = lexeme.value.toLowerCase();
|
|
593
|
+
return this.COLUMN_CONSTRAINT_STARTERS.has(lower);
|
|
594
|
+
}
|
|
595
|
+
static isColumnTerminator(lexeme) {
|
|
596
|
+
if (!lexeme) {
|
|
597
|
+
return true;
|
|
598
|
+
}
|
|
599
|
+
if (lexeme.type & (Lexeme_1.TokenType.Comma | Lexeme_1.TokenType.CloseParen)) {
|
|
600
|
+
return true;
|
|
601
|
+
}
|
|
602
|
+
return false;
|
|
603
|
+
}
|
|
604
|
+
static isSelectKeyword(value, nextLexeme) {
|
|
605
|
+
if (!value) {
|
|
606
|
+
return false;
|
|
607
|
+
}
|
|
608
|
+
if (value === 'with' && (nextLexeme === null || nextLexeme === void 0 ? void 0 : nextLexeme.type) === Lexeme_1.TokenType.OpenParen) {
|
|
609
|
+
return false;
|
|
610
|
+
}
|
|
611
|
+
return value === "as" || value === "select" || value === "with" || value === "values";
|
|
612
|
+
}
|
|
613
|
+
static findClauseBoundary(lexemes, index) {
|
|
614
|
+
let idx = index;
|
|
615
|
+
while (idx < lexemes.length) {
|
|
616
|
+
const lower = lexemes[idx].value.toLowerCase();
|
|
617
|
+
if (this.isSelectKeyword(lower, lexemes[idx + 1])) {
|
|
618
|
+
break;
|
|
619
|
+
}
|
|
620
|
+
idx++;
|
|
621
|
+
}
|
|
622
|
+
return idx;
|
|
623
|
+
}
|
|
624
|
+
static findFirstConstraintIndex(lexemes, index) {
|
|
625
|
+
let idx = index;
|
|
626
|
+
while (idx < lexemes.length && !this.isColumnConstraintStart(lexemes[idx]) && !this.isColumnTerminator(lexemes[idx])) {
|
|
627
|
+
idx++;
|
|
628
|
+
}
|
|
629
|
+
return idx;
|
|
630
|
+
}
|
|
631
|
+
static parseWithDataOption(lexemes, index) {
|
|
632
|
+
// Detect PostgreSQL-style WITH [NO] DATA phrases that follow CREATE TABLE ... AS SELECT.
|
|
633
|
+
const current = lexemes[index];
|
|
634
|
+
if (!current) {
|
|
635
|
+
return null;
|
|
636
|
+
}
|
|
637
|
+
const value = current.value.toLowerCase();
|
|
638
|
+
if (value === "with data") {
|
|
639
|
+
return { value: "with-data", newIndex: index + 1 };
|
|
640
|
+
}
|
|
641
|
+
if (value === "with no data") {
|
|
642
|
+
return { value: "with-no-data", newIndex: index + 1 };
|
|
643
|
+
}
|
|
644
|
+
if (value !== "with") {
|
|
645
|
+
return null;
|
|
646
|
+
}
|
|
647
|
+
const next = lexemes[index + 1];
|
|
648
|
+
const nextValue = next === null || next === void 0 ? void 0 : next.value.toLowerCase();
|
|
649
|
+
if (nextValue === "data") {
|
|
650
|
+
return { value: "with-data", newIndex: index + 2 };
|
|
651
|
+
}
|
|
652
|
+
if (nextValue === "data") {
|
|
653
|
+
return { value: "with-data", newIndex: index + 2 };
|
|
654
|
+
}
|
|
655
|
+
if (nextValue === "no data") {
|
|
656
|
+
return { value: "with-no-data", newIndex: index + 2 };
|
|
657
|
+
}
|
|
658
|
+
if (nextValue === "no") {
|
|
659
|
+
const following = lexemes[index + 2];
|
|
660
|
+
if (following && following.value.toLowerCase() === "data") {
|
|
661
|
+
return { value: "with-no-data", newIndex: index + 3 };
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
return null;
|
|
665
|
+
}
|
|
666
|
+
static popLexemeComments(lexeme, position) {
|
|
667
|
+
if (!lexeme) {
|
|
668
|
+
return [];
|
|
669
|
+
}
|
|
670
|
+
let collected = [];
|
|
671
|
+
// Extract positioned comments first so they are not reused downstream.
|
|
672
|
+
if (lexeme.positionedComments && lexeme.positionedComments.length > 0) {
|
|
673
|
+
const matchIndex = lexeme.positionedComments.findIndex(pc => pc.position === position);
|
|
674
|
+
if (matchIndex >= 0) {
|
|
675
|
+
collected = [...lexeme.positionedComments[matchIndex].comments];
|
|
676
|
+
const remaining = lexeme.positionedComments.filter((_, idx) => idx !== matchIndex);
|
|
677
|
+
lexeme.positionedComments = remaining.length > 0 ? remaining : undefined;
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
if (collected.length > 0) {
|
|
681
|
+
return collected;
|
|
682
|
+
}
|
|
683
|
+
if (lexeme.comments && lexeme.comments.length > 0) {
|
|
684
|
+
const legacy = [...lexeme.comments];
|
|
685
|
+
lexeme.comments = null;
|
|
686
|
+
return legacy;
|
|
687
|
+
}
|
|
688
|
+
return [];
|
|
689
|
+
}
|
|
690
|
+
static toOptionalComments(comments) {
|
|
691
|
+
return comments.length > 0 ? comments : null;
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
exports.CreateTableParser = CreateTableParser;
|
|
695
|
+
CreateTableParser.TABLE_CONSTRAINT_STARTERS = new Set([
|
|
696
|
+
"constraint",
|
|
697
|
+
"primary key",
|
|
698
|
+
"unique",
|
|
699
|
+
"unique key",
|
|
700
|
+
"foreign key",
|
|
701
|
+
"check"
|
|
702
|
+
]);
|
|
703
|
+
CreateTableParser.COLUMN_CONSTRAINT_STARTERS = new Set([
|
|
704
|
+
"constraint",
|
|
705
|
+
"not null",
|
|
706
|
+
"null",
|
|
707
|
+
"default",
|
|
708
|
+
"primary key",
|
|
709
|
+
"unique",
|
|
710
|
+
"unique key",
|
|
711
|
+
"references",
|
|
712
|
+
"check",
|
|
713
|
+
"generated always",
|
|
714
|
+
"generated always as identity",
|
|
715
|
+
"generated by default",
|
|
716
|
+
"generated by default as identity"
|
|
717
|
+
]);
|
|
718
|
+
CreateTableParser.MATCH_KEYWORDS = new Map([
|
|
719
|
+
["match full", "full"],
|
|
720
|
+
["match partial", "partial"],
|
|
721
|
+
["match simple", "simple"]
|
|
722
|
+
]);
|
|
723
|
+
CreateTableParser.REFERENTIAL_ACTIONS = new Map([
|
|
724
|
+
["cascade", "cascade"],
|
|
725
|
+
["restrict", "restrict"],
|
|
726
|
+
["no action", "no action"],
|
|
727
|
+
["set null", "set null"],
|
|
728
|
+
["set default", "set default"]
|
|
729
|
+
]);
|
|
730
|
+
CreateTableParser.DEFERRABILITY_KEYWORDS = new Map([
|
|
731
|
+
["deferrable", "deferrable"],
|
|
732
|
+
["not deferrable", "not deferrable"]
|
|
733
|
+
]);
|
|
734
|
+
CreateTableParser.INITIALLY_KEYWORDS = new Map([
|
|
735
|
+
["initially immediate", "immediate"],
|
|
736
|
+
["initially deferred", "deferred"]
|
|
737
|
+
]);
|
|
738
|
+
//# sourceMappingURL=CreateTableParser.js.map
|