rawsql-ts 0.4.0-beta → 0.6.0-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 (156) hide show
  1. package/README.md +74 -9
  2. package/dist/esm/models/BinarySelectQuery.js +10 -0
  3. package/dist/esm/models/BinarySelectQuery.js.map +1 -1
  4. package/dist/esm/models/Clause.js +104 -6
  5. package/dist/esm/models/Clause.js.map +1 -1
  6. package/dist/esm/models/CreateTableQuery.js +1 -1
  7. package/dist/esm/models/CreateTableQuery.js.map +1 -1
  8. package/dist/esm/models/InsertQuery.js +2 -9
  9. package/dist/esm/models/InsertQuery.js.map +1 -1
  10. package/dist/esm/models/SelectQuery.js.map +1 -1
  11. package/dist/esm/models/SimpleSelectQuery.js +10 -0
  12. package/dist/esm/models/SimpleSelectQuery.js.map +1 -1
  13. package/dist/esm/models/UpdateQuery.js +25 -0
  14. package/dist/esm/models/UpdateQuery.js.map +1 -0
  15. package/dist/esm/models/ValueComponent.js +34 -15
  16. package/dist/esm/models/ValueComponent.js.map +1 -1
  17. package/dist/esm/models/ValuesQuery.js +10 -0
  18. package/dist/esm/models/ValuesQuery.js.map +1 -1
  19. package/dist/esm/parsers/FullNameParser.js +89 -0
  20. package/dist/esm/parsers/FullNameParser.js.map +1 -0
  21. package/dist/esm/parsers/FunctionExpressionParser.js +33 -32
  22. package/dist/esm/parsers/FunctionExpressionParser.js.map +1 -1
  23. package/dist/esm/parsers/IdentifierParser.js +5 -30
  24. package/dist/esm/parsers/IdentifierParser.js.map +1 -1
  25. package/dist/esm/parsers/InsertQueryParser.js +6 -27
  26. package/dist/esm/parsers/InsertQueryParser.js.map +1 -1
  27. package/dist/esm/parsers/ReturningClauseParser.js +31 -0
  28. package/dist/esm/parsers/ReturningClauseParser.js.map +1 -0
  29. package/dist/esm/parsers/SetClauseParser.js +39 -0
  30. package/dist/esm/parsers/SetClauseParser.js.map +1 -0
  31. package/dist/esm/parsers/SourceExpressionParser.js +19 -0
  32. package/dist/esm/parsers/SourceExpressionParser.js.map +1 -1
  33. package/dist/esm/parsers/SourceParser.js +16 -8
  34. package/dist/esm/parsers/SourceParser.js.map +1 -1
  35. package/dist/esm/parsers/UpdateClauseParser.js +17 -0
  36. package/dist/esm/parsers/UpdateClauseParser.js.map +1 -0
  37. package/dist/esm/parsers/UpdateQueryParser.js +84 -0
  38. package/dist/esm/parsers/UpdateQueryParser.js.map +1 -0
  39. package/dist/esm/parsers/ValueParser.js +13 -11
  40. package/dist/esm/parsers/ValueParser.js.map +1 -1
  41. package/dist/esm/transformers/CTEDisabler.js +2 -2
  42. package/dist/esm/transformers/CTEDisabler.js.map +1 -1
  43. package/dist/esm/transformers/Formatter.js +152 -25
  44. package/dist/esm/transformers/Formatter.js.map +1 -1
  45. package/dist/esm/transformers/ParameterCollector.js +33 -0
  46. package/dist/esm/transformers/ParameterCollector.js.map +1 -0
  47. package/dist/esm/transformers/QueryBuilder.js +54 -6
  48. package/dist/esm/transformers/QueryBuilder.js.map +1 -1
  49. package/dist/esm/transformers/SelectValueCollector.js +4 -4
  50. package/dist/esm/transformers/UpstreamSelectQueryFinder.js +1 -1
  51. package/dist/esm/types/models/BinarySelectQuery.d.ts +7 -1
  52. package/dist/esm/types/models/Clause.d.ts +58 -4
  53. package/dist/esm/types/models/InsertQuery.d.ts +4 -9
  54. package/dist/esm/types/models/SelectQuery.d.ts +4 -1
  55. package/dist/esm/types/models/SimpleSelectQuery.d.ts +7 -1
  56. package/dist/esm/types/models/UpdateQuery.d.ts +31 -0
  57. package/dist/esm/types/models/ValueComponent.d.ts +14 -5
  58. package/dist/esm/types/models/ValuesQuery.d.ts +8 -1
  59. package/dist/esm/types/parsers/FullNameParser.d.ts +26 -0
  60. package/dist/esm/types/parsers/InsertQueryParser.d.ts +0 -1
  61. package/dist/esm/types/parsers/ReturningClauseParser.d.ts +12 -0
  62. package/dist/esm/types/parsers/SetClauseParser.d.ts +11 -0
  63. package/dist/esm/types/parsers/SourceExpressionParser.d.ts +8 -0
  64. package/dist/esm/types/parsers/SourceParser.d.ts +14 -0
  65. package/dist/esm/types/parsers/UpdateClauseParser.d.ts +15 -0
  66. package/dist/esm/types/parsers/UpdateQueryParser.d.ts +16 -0
  67. package/dist/esm/types/transformers/Formatter.d.ts +18 -3
  68. package/dist/esm/types/transformers/ParameterCollector.d.ts +12 -0
  69. package/dist/esm/types/transformers/QueryBuilder.d.ts +9 -0
  70. package/dist/esm/types/utils/ParameterHelper.d.ts +14 -0
  71. package/dist/esm/utils/ParameterHelper.js +27 -0
  72. package/dist/esm/utils/ParameterHelper.js.map +1 -0
  73. package/dist/models/BinarySelectQuery.d.ts +7 -1
  74. package/dist/models/BinarySelectQuery.js +10 -0
  75. package/dist/models/BinarySelectQuery.js.map +1 -1
  76. package/dist/models/Clause.d.ts +58 -4
  77. package/dist/models/Clause.js +110 -7
  78. package/dist/models/Clause.js.map +1 -1
  79. package/dist/models/CreateTableQuery.js +1 -1
  80. package/dist/models/CreateTableQuery.js.map +1 -1
  81. package/dist/models/InsertQuery.d.ts +4 -9
  82. package/dist/models/InsertQuery.js +2 -9
  83. package/dist/models/InsertQuery.js.map +1 -1
  84. package/dist/models/SelectQuery.d.ts +4 -1
  85. package/dist/models/SelectQuery.js.map +1 -1
  86. package/dist/models/SimpleSelectQuery.d.ts +7 -1
  87. package/dist/models/SimpleSelectQuery.js +10 -0
  88. package/dist/models/SimpleSelectQuery.js.map +1 -1
  89. package/dist/models/UpdateQuery.d.ts +31 -0
  90. package/dist/models/UpdateQuery.js +29 -0
  91. package/dist/models/UpdateQuery.js.map +1 -0
  92. package/dist/models/ValueComponent.d.ts +14 -5
  93. package/dist/models/ValueComponent.js +34 -15
  94. package/dist/models/ValueComponent.js.map +1 -1
  95. package/dist/models/ValuesQuery.d.ts +8 -1
  96. package/dist/models/ValuesQuery.js +10 -0
  97. package/dist/models/ValuesQuery.js.map +1 -1
  98. package/dist/parsers/FullNameParser.d.ts +26 -0
  99. package/dist/parsers/FullNameParser.js +93 -0
  100. package/dist/parsers/FullNameParser.js.map +1 -0
  101. package/dist/parsers/FunctionExpressionParser.js +32 -31
  102. package/dist/parsers/FunctionExpressionParser.js.map +1 -1
  103. package/dist/parsers/IdentifierParser.js +5 -30
  104. package/dist/parsers/IdentifierParser.js.map +1 -1
  105. package/dist/parsers/InsertQueryParser.d.ts +0 -1
  106. package/dist/parsers/InsertQueryParser.js +6 -27
  107. package/dist/parsers/InsertQueryParser.js.map +1 -1
  108. package/dist/parsers/ReturningClauseParser.d.ts +12 -0
  109. package/dist/parsers/ReturningClauseParser.js +35 -0
  110. package/dist/parsers/ReturningClauseParser.js.map +1 -0
  111. package/dist/parsers/SetClauseParser.d.ts +11 -0
  112. package/dist/parsers/SetClauseParser.js +43 -0
  113. package/dist/parsers/SetClauseParser.js.map +1 -0
  114. package/dist/parsers/SourceExpressionParser.d.ts +8 -0
  115. package/dist/parsers/SourceExpressionParser.js +19 -0
  116. package/dist/parsers/SourceExpressionParser.js.map +1 -1
  117. package/dist/parsers/SourceParser.d.ts +14 -0
  118. package/dist/parsers/SourceParser.js +16 -8
  119. package/dist/parsers/SourceParser.js.map +1 -1
  120. package/dist/parsers/UpdateClauseParser.d.ts +15 -0
  121. package/dist/parsers/UpdateClauseParser.js +21 -0
  122. package/dist/parsers/UpdateClauseParser.js.map +1 -0
  123. package/dist/parsers/UpdateQueryParser.d.ts +16 -0
  124. package/dist/parsers/UpdateQueryParser.js +88 -0
  125. package/dist/parsers/UpdateQueryParser.js.map +1 -0
  126. package/dist/parsers/ValueParser.js +13 -11
  127. package/dist/parsers/ValueParser.js.map +1 -1
  128. package/dist/transformers/CTEDisabler.js +2 -2
  129. package/dist/transformers/CTEDisabler.js.map +1 -1
  130. package/dist/transformers/Formatter.d.ts +18 -3
  131. package/dist/transformers/Formatter.js +152 -25
  132. package/dist/transformers/Formatter.js.map +1 -1
  133. package/dist/transformers/ParameterCollector.d.ts +12 -0
  134. package/dist/transformers/ParameterCollector.js +37 -0
  135. package/dist/transformers/ParameterCollector.js.map +1 -0
  136. package/dist/transformers/QueryBuilder.d.ts +9 -0
  137. package/dist/transformers/QueryBuilder.js +53 -5
  138. package/dist/transformers/QueryBuilder.js.map +1 -1
  139. package/dist/transformers/SelectValueCollector.js +4 -4
  140. package/dist/transformers/UpstreamSelectQueryFinder.js +1 -1
  141. package/dist/utils/ParameterHelper.d.ts +14 -0
  142. package/dist/utils/ParameterHelper.js +31 -0
  143. package/dist/utils/ParameterHelper.js.map +1 -0
  144. package/package.json +2 -2
  145. package/dist/esm/types/utils/extractNamespacesAndName.d.ts +0 -5
  146. package/dist/esm/types/utils/parseEscapedOrDotSeparatedIdentifiers.d.ts +0 -9
  147. package/dist/esm/utils/extractNamespacesAndName.js +0 -16
  148. package/dist/esm/utils/extractNamespacesAndName.js.map +0 -1
  149. package/dist/esm/utils/parseEscapedOrDotSeparatedIdentifiers.js +0 -39
  150. package/dist/esm/utils/parseEscapedOrDotSeparatedIdentifiers.js.map +0 -1
  151. package/dist/utils/extractNamespacesAndName.d.ts +0 -5
  152. package/dist/utils/extractNamespacesAndName.js +0 -18
  153. package/dist/utils/extractNamespacesAndName.js.map +0 -1
  154. package/dist/utils/parseEscapedOrDotSeparatedIdentifiers.d.ts +0 -9
  155. package/dist/utils/parseEscapedOrDotSeparatedIdentifiers.js +0 -42
  156. package/dist/utils/parseEscapedOrDotSeparatedIdentifiers.js.map +0 -1
@@ -76,7 +76,7 @@ export declare class TableSource extends SqlComponent {
76
76
  namespaces: IdentifierString[] | null;
77
77
  table: IdentifierString;
78
78
  identifier: IdentifierString;
79
- constructor(namespaces: string[] | null, table: string);
79
+ constructor(namespaces: string[] | IdentifierString[] | null, table: string | IdentifierString);
80
80
  getSourceName(): string;
81
81
  }
82
82
  export declare class FunctionSource extends SqlComponent {
@@ -120,14 +120,14 @@ export declare class JoinClause extends SqlComponent {
120
120
  condition: JoinConditionComponent | null;
121
121
  lateral: boolean;
122
122
  constructor(joinType: string, source: SourceExpression, condition: JoinConditionComponent | null, lateral: boolean);
123
- getAliasSourceName(): string | null;
123
+ getSourceAliasName(): string | null;
124
124
  }
125
125
  export declare class FromClause extends SqlComponent {
126
126
  static kind: symbol;
127
127
  source: SourceExpression;
128
128
  joins: JoinClause[] | null;
129
129
  constructor(source: SourceExpression, join: JoinClause[] | null);
130
- getAliasSourceName(): string | null;
130
+ getSourceAliasName(): string | null;
131
131
  /**
132
132
  * Returns all SourceExpression objects in this FROM clause, including main source and all JOIN sources.
133
133
  */
@@ -139,7 +139,7 @@ export declare class CommonTable extends SqlComponent {
139
139
  materialized: boolean | null;
140
140
  aliasExpression: SourceAliasExpression;
141
141
  constructor(query: SelectQuery, aliasExpression: SourceAliasExpression | string, materialized: boolean | null);
142
- getAliasSourceName(): string;
142
+ getSourceAliasName(): string;
143
143
  }
144
144
  export declare class WithClause extends SqlComponent {
145
145
  static kind: symbol;
@@ -186,3 +186,57 @@ export declare class SourceAliasExpression extends SqlComponent {
186
186
  columns: IdentifierString[] | null;
187
187
  constructor(alias: string, columnAlias: string[] | null);
188
188
  }
189
+ export declare class ReturningClause extends SqlComponent {
190
+ static kind: symbol;
191
+ columns: IdentifierString[];
192
+ /**
193
+ * Constructs a ReturningClause.
194
+ * @param columns Array of IdentifierString or string representing column names.
195
+ */
196
+ constructor(columns: (IdentifierString | string)[]);
197
+ }
198
+ export declare class SetClause extends SqlComponent {
199
+ static kind: symbol;
200
+ items: SetClauseItem[];
201
+ constructor(items: (SetClauseItem | {
202
+ column: string | IdentifierString;
203
+ value: ValueComponent;
204
+ })[]);
205
+ }
206
+ /**
207
+ * Represents a single SET clause item in an UPDATE statement.
208
+ */
209
+ /**
210
+ * Represents a single SET clause item in an UPDATE statement.
211
+ * Now supports namespaces for fully qualified column names (e.g. schema.table.column).
212
+ */
213
+ export declare class SetClauseItem extends SqlComponent {
214
+ static kind: symbol;
215
+ namespaces: IdentifierString[] | null;
216
+ column: IdentifierString;
217
+ value: ValueComponent;
218
+ constructor(column: string | IdentifierString | {
219
+ namespaces: string[] | IdentifierString[] | null;
220
+ column: string | IdentifierString;
221
+ }, value: ValueComponent);
222
+ /**
223
+ * Returns the fully qualified column name as a string.
224
+ */
225
+ getFullName(): string;
226
+ }
227
+ export declare class UpdateClause extends SqlComponent {
228
+ static kind: symbol;
229
+ source: SourceExpression;
230
+ constructor(source: SourceExpression);
231
+ getSourceAliasName(): string | null;
232
+ }
233
+ /**
234
+ * Represents the target table (with optional alias/schema) and columns for an INSERT statement.
235
+ * @param source The target table as a SourceExpression (can include schema, alias, etc.)
236
+ * @param columns Array of column names (as strings)
237
+ */
238
+ export declare class InsertClause extends SqlComponent {
239
+ source: SourceExpression;
240
+ columns: string[];
241
+ constructor(source: SourceExpression, columns: string[]);
242
+ }
@@ -1,21 +1,16 @@
1
1
  import { SqlComponent } from "./SqlComponent";
2
- import { IdentifierString } from "./ValueComponent";
3
2
  import { SelectQuery } from "./SelectQuery";
3
+ import { InsertClause } from "./Clause";
4
4
  export declare class InsertQuery extends SqlComponent {
5
5
  static kind: symbol;
6
- namespaces: IdentifierString[] | null;
7
- table: IdentifierString;
8
- columns: IdentifierString[];
6
+ insertClause: InsertClause;
9
7
  selectQuery: SelectQuery | null;
10
8
  /**
11
- * @param params.table Table name (string or IdentifierString)
12
- * @param params.columns Array of column names (string[] or IdentifierString[])
9
+ * @param params.insertClause InsertClause instance (target table and columns)
13
10
  * @param params.selectQuery SELECT/VALUES query (required)
14
11
  */
15
12
  constructor(params: {
16
- namespaces: (string | IdentifierString)[] | null;
17
- table: string | IdentifierString;
18
- columns: (string | IdentifierString)[];
13
+ insertClause: InsertClause;
19
14
  selectQuery?: SelectQuery | null;
20
15
  });
21
16
  }
@@ -1,6 +1,9 @@
1
+ import { SqlComponent } from "./SqlComponent";
1
2
  import { InsertQuery } from "./InsertQuery";
2
3
  import { SimpleSelectQuery } from "./SimpleSelectQuery";
3
4
  import { BinarySelectQuery } from "./BinarySelectQuery";
4
5
  import { ValuesQuery } from "./ValuesQuery";
5
- export type SelectQuery = SimpleSelectQuery | BinarySelectQuery | ValuesQuery | InsertQuery;
6
+ export interface SelectQuery extends SqlComponent {
7
+ setParameter(name: string, value: any): this;
8
+ }
6
9
  export { SimpleSelectQuery, BinarySelectQuery, ValuesQuery, InsertQuery };
@@ -7,7 +7,7 @@ import { TableColumnResolver } from "../transformers/TableColumnResolver";
7
7
  /**
8
8
  * Represents a simple SELECT query in SQL.
9
9
  */
10
- export declare class SimpleSelectQuery extends SqlComponent {
10
+ export declare class SimpleSelectQuery extends SqlComponent implements SelectQuery {
11
11
  static kind: symbol;
12
12
  WithClause: WithClause | null;
13
13
  selectClause: SelectClause;
@@ -195,4 +195,10 @@ export declare class SimpleSelectQuery extends SqlComponent {
195
195
  appendWhereExpr(columnName: string, exprBuilder: (expr: string) => string, options?: {
196
196
  upstream?: boolean;
197
197
  }): void;
198
+ /**
199
+ * Sets the value of a parameter by name in this query.
200
+ * @param name Parameter name
201
+ * @param value Value to set
202
+ */
203
+ setParameter(name: string, value: any): this;
198
204
  }
@@ -0,0 +1,31 @@
1
+ import { SqlComponent } from "./SqlComponent";
2
+ import { IdentifierString, ValueComponent } from "./ValueComponent";
3
+ import { FromClause, ReturningClause, SetClause, WhereClause, UpdateClause } from "./Clause";
4
+ import { WithClause } from "./Clause";
5
+ export declare class UpdateQuery extends SqlComponent {
6
+ static kind: symbol;
7
+ withClause: WithClause | null;
8
+ updateClause: UpdateClause;
9
+ setClause: SetClause;
10
+ whereClause: WhereClause | null;
11
+ fromClause: FromClause | null;
12
+ returningClause: ReturningClause | null;
13
+ /**
14
+ * @param params.source SourceExpression (table or subquery with optional alias)
15
+ * @param params.setClause SetClause instance or array of {column, value} pairs
16
+ * @param params.where WHERE clause (optional)
17
+ * @param params.from FROM clause (optional)
18
+ * @param params.returning RETURNING clause (optional)
19
+ */
20
+ constructor(params: {
21
+ withClause?: WithClause | null;
22
+ updateClause: UpdateClause;
23
+ setClause: SetClause | {
24
+ column: string | IdentifierString;
25
+ value: ValueComponent;
26
+ }[];
27
+ whereClause?: WhereClause | null;
28
+ fromClause?: FromClause | null;
29
+ returning?: ReturningClause | null;
30
+ });
31
+ }
@@ -16,16 +16,17 @@ export declare class ColumnReference extends SqlComponent {
16
16
  static kind: symbol;
17
17
  namespaces: IdentifierString[] | null;
18
18
  column: IdentifierString;
19
- constructor(namespaces: string | string[] | null, column: string);
19
+ constructor(namespaces: string | string[] | IdentifierString[] | null, column: string | IdentifierString);
20
20
  toString(): string;
21
21
  getNamespace(): string;
22
22
  }
23
23
  export declare class FunctionCall extends SqlComponent {
24
24
  static kind: symbol;
25
+ namespaces: IdentifierString[] | null;
25
26
  name: RawString;
26
27
  argument: ValueComponent | null;
27
28
  over: OverExpression | null;
28
- constructor(name: string, argument: ValueComponent | null, over: OverExpression | null);
29
+ constructor(namespaces: string[] | IdentifierString[] | null, name: string | RawString, argument: ValueComponent | null, over: OverExpression | null);
29
30
  }
30
31
  export type OverExpression = WindowFrameExpression | IdentifierString;
31
32
  export declare enum WindowFrameType {
@@ -85,7 +86,13 @@ export declare class LiteralValue extends SqlComponent {
85
86
  export declare class ParameterExpression extends SqlComponent {
86
87
  static kind: symbol;
87
88
  name: RawString;
88
- constructor(name: string);
89
+ value: any | null;
90
+ /**
91
+ * The index assigned by the formatter when generating parameterized queries.
92
+ * This is used for naming parameters like $1, $2, ...
93
+ */
94
+ index: number | null;
95
+ constructor(name: string, value?: any | null);
89
96
  }
90
97
  export declare class SwitchCaseArgument extends SqlComponent {
91
98
  static kind: symbol;
@@ -147,9 +154,11 @@ export declare class StringSpecifierExpression extends SqlComponent {
147
154
  }
148
155
  export declare class TypeValue extends SqlComponent {
149
156
  static kind: symbol;
150
- type: RawString;
157
+ namespaces: IdentifierString[] | null;
158
+ name: RawString;
151
159
  argument: ValueComponent | null;
152
- constructor(type: string, argument?: ValueComponent | null);
160
+ constructor(namespaces: string[] | IdentifierString[] | null, name: string | RawString, argument?: ValueComponent | null);
161
+ getTypeName(): string;
153
162
  }
154
163
  export declare class TupleExpression extends SqlComponent {
155
164
  static kind: symbol;
@@ -1,10 +1,11 @@
1
+ import { SelectQuery } from "./SelectQuery";
1
2
  import { SimpleSelectQuery } from "./SimpleSelectQuery";
2
3
  import { SqlComponent } from "./SqlComponent";
3
4
  import { TupleExpression } from "./ValueComponent";
4
5
  /**
5
6
  * Represents a VALUES query in SQL.
6
7
  */
7
- export declare class ValuesQuery extends SqlComponent {
8
+ export declare class ValuesQuery extends SqlComponent implements SelectQuery {
8
9
  static kind: symbol;
9
10
  tuples: TupleExpression[];
10
11
  /**
@@ -15,4 +16,10 @@ export declare class ValuesQuery extends SqlComponent {
15
16
  columnAliases: string[] | null;
16
17
  constructor(tuples: TupleExpression[], columnAliases?: string[] | null);
17
18
  toSimpleSelectQuery(): SimpleSelectQuery;
19
+ /**
20
+ * Sets the value of a parameter by name in this query.
21
+ * @param name Parameter name
22
+ * @param value Value to set
23
+ */
24
+ setParameter(name: string, value: any): this;
18
25
  }
@@ -0,0 +1,26 @@
1
+ import { Lexeme } from "../models/Lexeme";
2
+ import { IdentifierString } from "../models/ValueComponent";
3
+ /**
4
+ * Utility class for parsing fully qualified names (e.g. db.schema.table or db.schema.table.column_name)
5
+ * This can be used for both table and column references.
6
+ */
7
+ export declare class FullNameParser {
8
+ /**
9
+ * Parses a fully qualified name from lexemes, returning namespaces, table, and new index.
10
+ */
11
+ static parseFromLexeme(lexemes: Lexeme[], index: number): {
12
+ namespaces: string[] | null;
13
+ name: IdentifierString;
14
+ newIndex: number;
15
+ };
16
+ /**
17
+ * Parses a fully qualified name from a string (e.g. 'db.schema.table')
18
+ * Returns { namespaces, name }
19
+ */
20
+ static parse(str: string): {
21
+ namespaces: string[] | null;
22
+ name: IdentifierString;
23
+ };
24
+ private static parseEscapedOrDotSeparatedIdentifiers;
25
+ private static extractNamespacesAndName;
26
+ }
@@ -13,5 +13,4 @@ export declare class InsertQueryParser {
13
13
  value: InsertQuery;
14
14
  newIndex: number;
15
15
  };
16
- private static parseFullQualifiedName;
17
16
  }
@@ -0,0 +1,12 @@
1
+ import { Lexeme } from "../models/Lexeme";
2
+ import { ReturningClause } from "../models/Clause";
3
+ export declare class ReturningClauseParser {
4
+ /**
5
+ * Parse RETURNING clause from lexemes, starting at the given index.
6
+ * Returns a ReturningClause instance and the new index after parsing.
7
+ */
8
+ static parseFromLexeme(lexemes: Lexeme[], index: number): {
9
+ value: ReturningClause;
10
+ newIndex: number;
11
+ };
12
+ }
@@ -0,0 +1,11 @@
1
+ import { Lexeme } from "../models/Lexeme";
2
+ import { SetClause } from "../models/Clause";
3
+ /**
4
+ * Parse SET clause from lexemes (including 'SET' keyword check).
5
+ */
6
+ export declare class SetClauseParser {
7
+ static parseFromLexeme(lexemes: Lexeme[], idx: number): {
8
+ setClause: SetClause;
9
+ newIndex: number;
10
+ };
11
+ }
@@ -1,6 +1,14 @@
1
1
  import { SourceExpression } from "../models/Clause";
2
2
  import { Lexeme } from "../models/Lexeme";
3
3
  export declare class SourceExpressionParser {
4
+ /**
5
+ * Parse SQL string to SourceExpression (e.g. "table", "table as t", "schema.table t")
6
+ */
7
+ static parse(query: string): SourceExpression;
8
+ static parseTableSourceFromLexemes(lexemes: Lexeme[], index: number): {
9
+ value: SourceExpression;
10
+ newIndex: number;
11
+ };
4
12
  static parseFromLexeme(lexemes: Lexeme[], index: number): {
5
13
  value: SourceExpression;
6
14
  newIndex: number;
@@ -2,6 +2,20 @@ import { SourceComponent } from "../models/Clause";
2
2
  import { Lexeme } from "../models/Lexeme";
3
3
  export declare class SourceParser {
4
4
  static parse(query: string): SourceComponent;
5
+ /**
6
+ * Parses only a TableSource from the given lexemes, regardless of the presence of parentheses after the identifier.
7
+ * This method is specifically used for cases like INSERT queries (e.g., "insert into table_name (col1, col2)")
8
+ * where a parenthesis immediately following the table name could otherwise be misinterpreted as a function call.
9
+ * By using this method, the parser forcibly treats the source as a TableSource.
10
+ *
11
+ * @param lexemes The array of lexemes to parse.
12
+ * @param index The starting index in the lexeme array.
13
+ * @returns An object containing the parsed TableSource and the new index.
14
+ */
15
+ static parseTableSourceFromLexemes(lexemes: Lexeme[], index: number): {
16
+ value: SourceComponent;
17
+ newIndex: number;
18
+ };
5
19
  static parseFromLexeme(lexemes: Lexeme[], index: number): {
6
20
  value: SourceComponent;
7
21
  newIndex: number;
@@ -0,0 +1,15 @@
1
+ import { UpdateClause } from "../models/Clause";
2
+ import { Lexeme } from "../models/Lexeme";
3
+ /**
4
+ * Parses the target of an UPDATE statement (table or source expression with optional alias).
5
+ */
6
+ export declare class UpdateClauseParser {
7
+ /**
8
+ * Parse from lexeme array (returns UpdateClause and new index)
9
+ * This method parses a table or a table with alias using SourceExpressionParser.
10
+ */
11
+ static parseFromLexeme(lexemes: Lexeme[], index: number): {
12
+ value: UpdateClause;
13
+ newIndex: number;
14
+ };
15
+ }
@@ -0,0 +1,16 @@
1
+ import { UpdateQuery } from "../models/UpdateQuery";
2
+ import { Lexeme } from "../models/Lexeme";
3
+ export declare class UpdateQueryParser {
4
+ /**
5
+ * Parse SQL string to UpdateQuery AST.
6
+ * @param query SQL string
7
+ */
8
+ static parse(query: string): UpdateQuery;
9
+ /**
10
+ * Parse from lexeme array (for internal use and tests)
11
+ */
12
+ static parseFromLexeme(lexemes: Lexeme[], index: number): {
13
+ value: UpdateQuery;
14
+ newIndex: number;
15
+ };
16
+ }
@@ -1,4 +1,9 @@
1
1
  import { SqlComponent, SqlComponentVisitor } from "../models/SqlComponent";
2
+ export declare enum ParameterStyle {
3
+ Anonymous = "anonymous",// ?
4
+ Indexed = "indexed",// $1, $2, ...
5
+ Named = "named"
6
+ }
2
7
  interface FormatterConfig {
3
8
  identifierEscape?: {
4
9
  start: string;
@@ -9,10 +14,9 @@ interface FormatterConfig {
9
14
  end: string;
10
15
  };
11
16
  /**
12
- * If false, named parameters are not supported (e.g. MySQL: use only '?').
13
- * If true (default), named parameters are output (e.g. :userId, @userId).
17
+ * Parameter style: anonymous (?), indexed ($1), or named (:name)
14
18
  */
15
- supportNamedParameter?: boolean;
19
+ parameterStyle?: ParameterStyle;
16
20
  }
17
21
  export declare class Formatter implements SqlComponentVisitor<string> {
18
22
  /**
@@ -21,6 +25,7 @@ export declare class Formatter implements SqlComponentVisitor<string> {
21
25
  static readonly PRESETS: Record<string, FormatterConfig>;
22
26
  private handlers;
23
27
  private config;
28
+ private parameterIndex;
24
29
  constructor();
25
30
  /**
26
31
  * Formats the given SQL AST node into a SQL string.
@@ -30,6 +35,10 @@ export declare class Formatter implements SqlComponentVisitor<string> {
30
35
  * @returns The formatted SQL string.
31
36
  */
32
37
  format(arg: SqlComponent, config?: FormatterConfig | null): string;
38
+ formatWithParameters(arg: SqlComponent, config?: FormatterConfig | null): {
39
+ sql: string;
40
+ params: any[] | Record<string, any>[] | Record<string, any>;
41
+ };
33
42
  /**
34
43
  * Visitor entry point for SQL AST nodes.
35
44
  * Note: This method is public only for interface compatibility.
@@ -95,5 +104,11 @@ export declare class Formatter implements SqlComponentVisitor<string> {
95
104
  */
96
105
  private visitCreateTableQuery;
97
106
  private visitInsertQuery;
107
+ private visitUpdateQuery;
108
+ private visitUpdateClause;
109
+ private visitSetClause;
110
+ private visitSetClauseItem;
111
+ private visitReturningClause;
112
+ private visitInsertClause;
98
113
  }
99
114
  export {};
@@ -0,0 +1,12 @@
1
+ import { ParameterExpression } from "../models/ValueComponent";
2
+ /**
3
+ * Utility class to collect all ParameterExpression nodes from an AST.
4
+ */
5
+ export declare class ParameterCollector {
6
+ /**
7
+ * Recursively collect all ParameterExpression nodes from AST.
8
+ * @param node AST root
9
+ * @returns ParameterExpression[]
10
+ */
11
+ static collect(node: any): ParameterExpression[];
12
+ }
@@ -1,3 +1,4 @@
1
+ import { UpdateQuery } from '../models/UpdateQuery';
1
2
  import { BinarySelectQuery, SelectQuery, SimpleSelectQuery } from "../models/SelectQuery";
2
3
  import { CreateTableQuery } from "../models/CreateTableQuery";
3
4
  import { InsertQuery } from "../models/InsertQuery";
@@ -51,4 +52,12 @@ export declare class QueryBuilder {
51
52
  * @returns An InsertQuery instance
52
53
  */
53
54
  static buildInsertQuery(selectQuery: SimpleSelectQuery, tableName: string): InsertQuery;
55
+ /**
56
+ * Builds an UPDATE query from a SELECT query, table name, and primary key(s).
57
+ * @param selectQuery The SELECT query providing new values (must select all columns to update and PKs)
58
+ * @param updateTableExprRaw The table name to update
59
+ * @param primaryKeys The primary key column name(s)
60
+ * @returns UpdateQuery instance
61
+ */
62
+ static buildUpdateQuery(selectQuery: SimpleSelectQuery, selectSourceName: string, updateTableExprRaw: string, primaryKeys: string | string[]): UpdateQuery;
54
63
  }
@@ -0,0 +1,14 @@
1
+ import { SqlComponent } from "../models/SqlComponent";
2
+ /**
3
+ * Utility class for parameter operations on SQL queries.
4
+ */
5
+ export declare class ParameterHelper {
6
+ /**
7
+ * Sets the value of a parameter by name in the given query.
8
+ * Throws an error if the parameter is not found.
9
+ * @param query The query object (must be a SqlComponent)
10
+ * @param name Parameter name
11
+ * @param value Value to set
12
+ */
13
+ static set(query: SqlComponent, name: string, value: any): void;
14
+ }
@@ -0,0 +1,27 @@
1
+ import { ParameterCollector } from "../transformers/ParameterCollector";
2
+ /**
3
+ * Utility class for parameter operations on SQL queries.
4
+ */
5
+ export class ParameterHelper {
6
+ /**
7
+ * Sets the value of a parameter by name in the given query.
8
+ * Throws an error if the parameter is not found.
9
+ * @param query The query object (must be a SqlComponent)
10
+ * @param name Parameter name
11
+ * @param value Value to set
12
+ */
13
+ static set(query, name, value) {
14
+ const params = ParameterCollector.collect(query);
15
+ let found = false;
16
+ for (const p of params) {
17
+ if (p.name.value === name) {
18
+ p.value = value;
19
+ found = true;
20
+ }
21
+ }
22
+ if (!found) {
23
+ throw new Error(`Parameter '${name}' not found in query.`);
24
+ }
25
+ }
26
+ }
27
+ //# sourceMappingURL=ParameterHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParameterHelper.js","sourceRoot":"","sources":["../../../src/utils/ParameterHelper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAGxE;;GAEG;AACH,MAAM,OAAO,eAAe;IACxB;;;;;;OAMG;IACI,MAAM,CAAC,GAAG,CAAC,KAAmB,EAAE,IAAY,EAAE,KAAU;QAC3D,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAEjD,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACrB,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;gBACxB,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC;gBAChB,KAAK,GAAG,IAAI,CAAC;YACjB,CAAC;QACL,CAAC;QAED,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,uBAAuB,CAAC,CAAC;QAC/D,CAAC;IACL,CAAC;CACJ"}
@@ -5,7 +5,7 @@ import { RawString } from "./ValueComponent";
5
5
  /**
6
6
  * Represents a binary SELECT query (e.g., UNION, INTERSECT, EXCEPT).
7
7
  */
8
- export declare class BinarySelectQuery extends SqlComponent {
8
+ export declare class BinarySelectQuery extends SqlComponent implements SelectQuery {
9
9
  static kind: symbol;
10
10
  left: SelectQuery;
11
11
  operator: RawString;
@@ -88,4 +88,10 @@ export declare class BinarySelectQuery extends SqlComponent {
88
88
  exceptRaw(sql: string): BinarySelectQuery;
89
89
  exceptAllRaw(sql: string): BinarySelectQuery;
90
90
  toSource(alias?: string): SourceExpression;
91
+ /**
92
+ * Sets the value of a parameter by name in this query.
93
+ * @param name Parameter name
94
+ * @param value Value to set
95
+ */
96
+ setParameter(name: string, value: any): this;
91
97
  }
@@ -6,6 +6,7 @@ const SqlComponent_1 = require("./SqlComponent");
6
6
  const ValueComponent_1 = require("./ValueComponent");
7
7
  const CTENormalizer_1 = require("../transformers/CTENormalizer");
8
8
  const SelectQueryParser_1 = require("../parsers/SelectQueryParser");
9
+ const ParameterHelper_1 = require("../utils/ParameterHelper");
9
10
  /**
10
11
  * Represents a binary SELECT query (e.g., UNION, INTERSECT, EXCEPT).
11
12
  */
@@ -133,6 +134,15 @@ class BinarySelectQuery extends SqlComponent_1.SqlComponent {
133
134
  toSource(alias = "subq") {
134
135
  return new Clause_1.SourceExpression(new Clause_1.SubQuerySource(this), new Clause_1.SourceAliasExpression(alias, null));
135
136
  }
137
+ /**
138
+ * Sets the value of a parameter by name in this query.
139
+ * @param name Parameter name
140
+ * @param value Value to set
141
+ */
142
+ setParameter(name, value) {
143
+ ParameterHelper_1.ParameterHelper.set(this, name, value);
144
+ return this;
145
+ }
136
146
  }
137
147
  exports.BinarySelectQuery = BinarySelectQuery;
138
148
  BinarySelectQuery.kind = Symbol("BinarySelectQuery");
@@ -1 +1 @@
1
- {"version":3,"file":"BinarySelectQuery.js","sourceRoot":"","sources":["../../src/models/BinarySelectQuery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BinarySelectQuery.js","sourceRoot":"","sources":["../../src/models/BinarySelectQuery.ts"],"names":[],"mappings":"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"}