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