typesql-cli 0.15.2 → 0.16.0-experimental.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +1 -1
  2. package/cli.js +20 -94
  3. package/cli.js.map +1 -1
  4. package/code-generator2.d.ts.map +1 -1
  5. package/code-generator2.js +287 -24
  6. package/code-generator2.js.map +1 -1
  7. package/describe-query.js +3 -3
  8. package/describe-query.js.map +1 -1
  9. package/drivers/libsql.d.ts +2 -2
  10. package/drivers/libsql.d.ts.map +1 -1
  11. package/drivers/libsql.js +2 -2
  12. package/drivers/libsql.js.map +1 -1
  13. package/drivers/postgres.d.ts +2 -3
  14. package/drivers/postgres.d.ts.map +1 -1
  15. package/drivers/postgres.js +1 -2
  16. package/drivers/postgres.js.map +1 -1
  17. package/package.json +1 -1
  18. package/postgres-query-analyzer/describe.d.ts.map +1 -1
  19. package/postgres-query-analyzer/describe.js +8 -3
  20. package/postgres-query-analyzer/describe.js.map +1 -1
  21. package/postgres-query-analyzer/parser.d.ts +2 -2
  22. package/postgres-query-analyzer/parser.d.ts.map +1 -1
  23. package/postgres-query-analyzer/parser.js +4 -4
  24. package/postgres-query-analyzer/parser.js.map +1 -1
  25. package/postgres-query-analyzer/traverse.d.ts +8 -1
  26. package/postgres-query-analyzer/traverse.d.ts.map +1 -1
  27. package/postgres-query-analyzer/traverse.js +231 -76
  28. package/postgres-query-analyzer/traverse.js.map +1 -1
  29. package/queryExectutor.d.ts +4 -3
  30. package/queryExectutor.d.ts.map +1 -1
  31. package/queryExectutor.js +48 -33
  32. package/queryExectutor.js.map +1 -1
  33. package/schema-info.d.ts +17 -0
  34. package/schema-info.d.ts.map +1 -0
  35. package/schema-info.js +142 -0
  36. package/schema-info.js.map +1 -0
  37. package/sqlite-query-analyzer/query-executor.d.ts +5 -5
  38. package/sqlite-query-analyzer/query-executor.d.ts.map +1 -1
  39. package/sqlite-query-analyzer/query-executor.js +20 -30
  40. package/sqlite-query-analyzer/query-executor.js.map +1 -1
@@ -1,21 +1,39 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defaultOptions = defaultOptions;
3
4
  exports.traverseSmt = traverseSmt;
4
5
  const PostgreSQLParser_1 = require("@wsporto/typesql-parser/postgres/PostgreSQLParser");
5
6
  const typesql_parser_1 = require("@wsporto/typesql-parser");
6
7
  const select_columns_1 = require("../mysql-query-analyzer/select-columns");
7
- function traverseSmt(stmt, dbSchema, generateNestedInfo) {
8
+ function defaultOptions() {
9
+ return {
10
+ collectNestedInfo: false,
11
+ collectDynamicQueryInfo: false
12
+ };
13
+ }
14
+ function traverseSmt(stmt, dbSchema, options) {
15
+ const { collectNestedInfo = false, collectDynamicQueryInfo = false } = options;
8
16
  const traverseResult = {
9
17
  columnsNullability: [],
10
18
  parameters: [],
11
19
  singleRow: false
12
20
  };
13
- if (generateNestedInfo) {
21
+ if (collectNestedInfo) {
14
22
  traverseResult.relations = [];
15
23
  }
24
+ if (collectDynamicQueryInfo) {
25
+ const dynamicQueryInfo = {
26
+ with: [],
27
+ select: [],
28
+ from: [],
29
+ where: []
30
+ };
31
+ traverseResult.dynamicQueryInfo = dynamicQueryInfo;
32
+ }
16
33
  const traverseContext = {
17
34
  dbSchema,
18
- generateNestedInfo,
35
+ collectNestedInfo,
36
+ collectDynamicQueryInfo,
19
37
  fromColumns: []
20
38
  };
21
39
  const selectstmt = stmt.selectstmt();
@@ -69,6 +87,9 @@ function traverseSelectstmt(selectstmt, context, traverseResult) {
69
87
  if (traverseResult.relations) {
70
88
  postgresTraverseResult.relations = traverseResult.relations;
71
89
  }
90
+ if (traverseResult.dynamicQueryInfo) {
91
+ postgresTraverseResult.dynamicQueryInfo = traverseResult.dynamicQueryInfo;
92
+ }
72
93
  return postgresTraverseResult;
73
94
  }
74
95
  function traverse_selectstmt(selectstmt, context, traverseResult) {
@@ -90,21 +111,54 @@ function traverse_select_no_parens(select_no_parens, context, traverseResult) {
90
111
  });
91
112
  }
92
113
  const select_clause = select_no_parens.select_clause();
93
- if (select_clause) {
94
- const newContext = Object.assign(Object.assign({}, context), { fromColumns: withColumns.concat(context.fromColumns) });
95
- return traverse_select_clause(select_clause, newContext, traverseResult);
114
+ const newContext = Object.assign(Object.assign({}, context), { fromColumns: withColumns.concat(context.fromColumns) });
115
+ const selectResult = traverse_select_clause(select_clause, newContext, traverseResult);
116
+ const select_limit = select_no_parens.select_limit();
117
+ if (select_limit) {
118
+ const numParamsBefore = traverseResult.parameters.length;
119
+ const limit_clause = select_limit.limit_clause();
120
+ const limit_a_expr = limit_clause.select_limit_value().a_expr();
121
+ traverse_a_expr(limit_a_expr, context, traverseResult);
122
+ let fragment = '';
123
+ if (limit_clause) {
124
+ if (context.collectDynamicQueryInfo) {
125
+ fragment += (0, select_columns_1.extractOriginalSql)(limit_clause);
126
+ }
127
+ }
128
+ const offset_clause = select_limit.offset_clause();
129
+ if (offset_clause) {
130
+ const offset_a_expr = offset_clause.select_offset_value().a_expr();
131
+ traverse_a_expr(offset_a_expr, context, traverseResult);
132
+ if (context.collectDynamicQueryInfo) {
133
+ fragment += ' ' + (0, select_columns_1.extractOriginalSql)(offset_clause);
134
+ }
135
+ }
136
+ if (fragment) {
137
+ const parameters = traverseResult.parameters.slice(numParamsBefore).map((_, index) => index + numParamsBefore);
138
+ traverseResult.dynamicQueryInfo.limitOffset = {
139
+ fragment,
140
+ parameters
141
+ };
142
+ }
96
143
  }
97
- return [];
144
+ return selectResult;
98
145
  }
99
146
  function traverse_common_table_expr(common_table_expr, context, traverseResult) {
147
+ var _a;
100
148
  const tableName = common_table_expr.name().getText();
101
149
  const select_stmt = common_table_expr.preparablestmt().selectstmt();
102
- if (select_stmt) {
103
- const columns = traverse_selectstmt(select_stmt, context, traverseResult);
104
- const columnsWithTalbeName = columns.map(col => (Object.assign(Object.assign({}, col), { table_name: tableName })));
105
- return columnsWithTalbeName;
150
+ const numParamsBefore = traverseResult.parameters.length;
151
+ const columns = traverse_selectstmt(select_stmt, Object.assign(Object.assign({}, context), { collectDynamicQueryInfo: false }), traverseResult);
152
+ const columnsWithTalbeName = columns.map(col => (Object.assign(Object.assign({}, col), { table_name: tableName })));
153
+ if (context.collectDynamicQueryInfo) {
154
+ const parameters = traverseResult.parameters.slice(numParamsBefore).map((_, index) => index + numParamsBefore);
155
+ (_a = traverseResult.dynamicQueryInfo) === null || _a === void 0 ? void 0 : _a.with.push({
156
+ fragment: (0, select_columns_1.extractOriginalSql)(common_table_expr),
157
+ relationName: tableName,
158
+ parameters
159
+ });
106
160
  }
107
- return [];
161
+ return columnsWithTalbeName;
108
162
  }
109
163
  function traverse_select_clause(select_clause, context, traverseResult) {
110
164
  const simple_select_intersect_list = select_clause.simple_select_intersect_list();
@@ -135,7 +189,7 @@ function traverse_simple_select_intersect(simple_select_intersect, context, trav
135
189
  return [];
136
190
  }
137
191
  function traverse_simple_select_pramary(simple_select_pramary, context, traverseResult) {
138
- var _a;
192
+ var _a, _b;
139
193
  const fromColumns = [];
140
194
  const from_clause = simple_select_pramary.from_clause();
141
195
  if (from_clause) {
@@ -153,11 +207,32 @@ function traverse_simple_select_pramary(simple_select_pramary, context, traverse
153
207
  //fromColumns has precedence
154
208
  const newContext = Object.assign(Object.assign({}, context), { fromColumns: fromColumns.concat(context.fromColumns) });
155
209
  if (where_a_expr) {
210
+ const numParamsBefore = traverseResult.parameters.length;
156
211
  traverse_a_expr(where_a_expr, newContext, traverseResult);
212
+ if (context.collectDynamicQueryInfo) {
213
+ const parameters = traverseResult.parameters.slice(numParamsBefore).map((_, index) => index + numParamsBefore);
214
+ const relations = extractRelations(where_a_expr);
215
+ (_b = traverseResult.dynamicQueryInfo) === null || _b === void 0 ? void 0 : _b.where.push({
216
+ fragment: `AND ${(0, select_columns_1.extractOriginalSql)(where_a_expr)}`,
217
+ parameters,
218
+ dependOnRelations: relations
219
+ });
220
+ }
157
221
  }
158
222
  const filteredColumns = filterColumns_simple_select_pramary(simple_select_pramary, newContext, traverseResult);
159
223
  return filteredColumns;
160
224
  }
225
+ function extractRelations(a_expr) {
226
+ const columnsRef = collectContextsOfType(a_expr, PostgreSQLParser_1.ColumnrefContext);
227
+ const relations = columnsRef
228
+ .map((colRefExpr) => {
229
+ const colRef = colRefExpr;
230
+ const tableName = (0, select_columns_1.splitName)(colRef.getText());
231
+ return tableName;
232
+ });
233
+ const uniqueRelations = [...new Set(relations.map(relation => relation.prefix))];
234
+ return uniqueRelations;
235
+ }
161
236
  function traverse_values_clause(values_clause, context, traverseResult) {
162
237
  const expr_list_list = values_clause.expr_list_list();
163
238
  if (expr_list_list) {
@@ -197,17 +272,29 @@ function traverse_target_list(target_list, context, traverseResult) {
197
272
  const fieldName = (0, select_columns_1.splitName)(target_el.getText());
198
273
  if (fieldName.name == '*') {
199
274
  const columns = filterColumns(context.fromColumns, fieldName);
275
+ if (context.collectDynamicQueryInfo) {
276
+ columns.forEach(col => {
277
+ var _a;
278
+ (_a = traverseResult.dynamicQueryInfo) === null || _a === void 0 ? void 0 : _a.select.push({
279
+ fragment: `${col.table_name}.${col.column_name}`,
280
+ fragmentWitoutAlias: `${col.table_name}.${col.column_name}`,
281
+ dependOnRelations: [col.table_name],
282
+ parameters: []
283
+ });
284
+ });
285
+ }
200
286
  return columns;
201
287
  }
202
- const column = isNotNull_target_el(target_el, context, traverseResult);
288
+ const column = traverse_target_el(target_el, context, traverseResult);
203
289
  return [column];
204
290
  });
205
291
  return columns;
206
292
  }
207
- function isNotNull_target_el(target_el, context, traverseResult) {
208
- var _a;
293
+ function traverse_target_el(target_el, context, traverseResult) {
294
+ var _a, _b;
209
295
  if (target_el instanceof PostgreSQLParser_1.Target_labelContext) {
210
296
  const a_expr = target_el.a_expr();
297
+ const numParamsBefore = traverseResult.parameters.length;
211
298
  const exprResult = traverse_a_expr(a_expr, context, traverseResult);
212
299
  const colLabel = target_el.colLabel();
213
300
  const alias = colLabel != null ? colLabel.getText() : '';
@@ -219,6 +306,16 @@ function isNotNull_target_el(target_el, context, traverseResult) {
219
306
  }
220
307
  });
221
308
  }
309
+ if (context.collectDynamicQueryInfo) {
310
+ const parameters = traverseResult.parameters.slice(numParamsBefore).map((_, index) => index + numParamsBefore);
311
+ const relations = extractRelations(target_el.a_expr());
312
+ (_b = traverseResult.dynamicQueryInfo) === null || _b === void 0 ? void 0 : _b.select.push({
313
+ fragment: (0, select_columns_1.extractOriginalSql)(target_el),
314
+ fragmentWitoutAlias: (0, select_columns_1.extractOriginalSql)(target_el.a_expr()),
315
+ dependOnRelations: relations,
316
+ parameters
317
+ });
318
+ }
222
319
  return {
223
320
  column_name: alias || exprResult.column_name,
224
321
  is_nullable: exprResult.is_nullable,
@@ -256,11 +353,17 @@ function traverse_a_expr_lessless(a_expr_lessless, context, traverseResult) {
256
353
  throw Error('traverse_a_expr_lessless - Not expected:' + a_expr_lessless.getText());
257
354
  }
258
355
  function traverse_expr_or(a_expr_or, context, traverseResult) {
259
- const a_expr_and = a_expr_or.a_expr_and_list()[0];
260
- if (a_expr_and) {
261
- return traverse_expr_and(a_expr_and, context, traverseResult);
356
+ // expr1 OR expr2
357
+ const result = a_expr_or.a_expr_and_list().map(a_expr_and => traverse_expr_and(a_expr_and, context, traverseResult));
358
+ if (result.length === 1) {
359
+ return result[0];
262
360
  }
263
- throw Error('traverse_expr_or - Not expected:' + a_expr_or.getText());
361
+ return {
362
+ column_name: '?column?',
363
+ is_nullable: result.some(col => col.is_nullable),
364
+ table_name: '',
365
+ table_schema: ''
366
+ };
264
367
  }
265
368
  function traverse_expr_and(a_expr_and, context, traverseResult) {
266
369
  const result = a_expr_and.a_expr_between_list().map(a_expr_between => traverse_expr_between(a_expr_between, context, traverseResult));
@@ -480,11 +583,11 @@ function traversec_expr(c_expr, context, traverseResult) {
480
583
  if (c_expr.PARAM()) {
481
584
  traverseResult.parameters.push({
482
585
  paramIndex: c_expr.start.start,
483
- isNotNull: true
586
+ isNotNull: !context.propagatesNull
484
587
  });
485
588
  return {
486
589
  column_name: c_expr.PARAM().getText(),
487
- is_nullable: false,
590
+ is_nullable: !!context.propagatesNull,
488
591
  table_name: '',
489
592
  table_schema: ''
490
593
  };
@@ -523,6 +626,28 @@ function traversec_expr(c_expr, context, traverseResult) {
523
626
  if (a_expr_in_parens) {
524
627
  return traverse_a_expr(a_expr_in_parens, context, traverseResult);
525
628
  }
629
+ const explicit_row = c_expr.explicit_row();
630
+ if (explicit_row) {
631
+ const expr_list = explicit_row.expr_list().a_expr_list()
632
+ .map(a_expr => traverse_a_expr(a_expr, context, traverseResult));
633
+ return {
634
+ column_name: '?column?',
635
+ is_nullable: expr_list.some(col => col.is_nullable),
636
+ table_name: '',
637
+ table_schema: ''
638
+ };
639
+ }
640
+ const implicit_row = c_expr.implicit_row();
641
+ if (implicit_row) {
642
+ const expr_list = implicit_row.expr_list().a_expr_list().concat(implicit_row.a_expr())
643
+ .map(a_expr => traverse_a_expr(a_expr, context, traverseResult));
644
+ return {
645
+ column_name: '?column?',
646
+ is_nullable: expr_list.some(col => col.is_nullable),
647
+ table_name: '',
648
+ table_schema: ''
649
+ };
650
+ }
526
651
  }
527
652
  if (c_expr instanceof PostgreSQLParser_1.C_expr_caseContext) {
528
653
  const isNotNull = traversec_expr_case(c_expr, context, traverseResult);
@@ -614,20 +739,13 @@ function traversefunc_application(func_application, context, traverseResult) {
614
739
  if (functionName === 'generate_series') {
615
740
  return true;
616
741
  }
617
- if (func_arg_expr_list) {
618
- func_arg_expr_list.forEach(func_arg_expr => traversefunc_arg_expr(func_arg_expr, context, traverseResult));
619
- }
620
742
  return false;
621
743
  }
622
744
  function traversefunc_expr_common_subexpr(func_expr_common_subexpr, context, traverseResult) {
623
- if (func_expr_common_subexpr.COALESCE()) {
745
+ if (func_expr_common_subexpr.COALESCE() || func_expr_common_subexpr.GREATEST() || func_expr_common_subexpr.LEAST()) {
624
746
  const func_arg_list = func_expr_common_subexpr.expr_list().a_expr_list();
625
747
  const result = func_arg_list.map(func_arg_expr => {
626
- const paramResult = traverse_a_expr(func_arg_expr, context, traverseResult);
627
- if (isParameter(paramResult.column_name)) {
628
- traverseResult.parameters[traverseResult.parameters.length - 1].isNotNull = false;
629
- paramResult.is_nullable = true;
630
- }
748
+ const paramResult = traverse_a_expr(func_arg_expr, Object.assign(Object.assign({}, context), { propagatesNull: true }), traverseResult);
631
749
  return paramResult;
632
750
  });
633
751
  return result.some(col => !col.is_nullable);
@@ -675,19 +793,19 @@ function traverse_table_ref(table_ref, context, traverseResult) {
675
793
  const allColumns = [];
676
794
  const relation_expr = table_ref.relation_expr();
677
795
  const aliasClause = table_ref.alias_clause();
678
- const alias = aliasClause ? aliasClause.colid().getText() : undefined;
796
+ const alias = aliasClause ? aliasClause.colid().getText() : '';
679
797
  if (relation_expr) {
680
798
  const tableName = traverse_relation_expr(relation_expr, dbSchema);
681
799
  const tableNameWithAlias = alias ? alias : tableName.name;
682
800
  const fromColumnsResult = fromColumns.concat(dbSchema).filter(col => col.table_name === tableName.name)
683
801
  .map(col => (Object.assign(Object.assign({}, col), { table_name: tableNameWithAlias })));
684
802
  allColumns.push(...fromColumnsResult);
685
- if (context.generateNestedInfo) {
803
+ if (context.collectNestedInfo) {
686
804
  const key = fromColumnsResult.filter(col => col.column_key === 'PRI');
687
805
  const renameAs = (aliasClause === null || aliasClause === void 0 ? void 0 : aliasClause.AS()) != null;
688
806
  const relation = {
689
807
  name: tableName.name,
690
- alias: alias || '',
808
+ alias: alias,
691
809
  renameAs,
692
810
  parentRelation: '',
693
811
  joinColumn: ((_a = key[0]) === null || _a === void 0 ? void 0 : _a.column_name) || '',
@@ -696,61 +814,95 @@ function traverse_table_ref(table_ref, context, traverseResult) {
696
814
  };
697
815
  (_b = traverseResult.relations) === null || _b === void 0 ? void 0 : _b.push(relation);
698
816
  }
699
- }
700
- const table_ref_list = table_ref.table_ref_list();
701
- const join_type_list = table_ref.join_type_list();
702
- const join_qual_list = table_ref.join_qual_list();
703
- if (table_ref_list) {
704
- const joinColumns = table_ref_list.flatMap((table_ref, joinIndex) => {
705
- const joinType = join_type_list[joinIndex]; //INNER, LEFT
706
- const joinQual = join_qual_list[joinIndex];
707
- const joinColumns = traverse_table_ref(table_ref, context, traverseResult);
708
- const isUsing = (joinQual === null || joinQual === void 0 ? void 0 : joinQual.USING()) ? true : false;
709
- const isLeftJoin = joinType === null || joinType === void 0 ? void 0 : joinType.LEFT();
710
- const filteredColumns = isUsing ? filterUsingColumns(joinColumns, joinQual) : joinColumns;
711
- const resultColumns = isLeftJoin ? filteredColumns.map(col => (Object.assign(Object.assign({}, col), { is_nullable: true }))) : filteredColumns;
712
- if (context.generateNestedInfo) {
713
- collectNestedInfo(joinQual, resultColumns, traverseResult);
714
- }
715
- return resultColumns;
716
- });
717
- allColumns.push(...joinColumns);
817
+ const table_ref_list = table_ref.table_ref_list();
818
+ const join_type_list = table_ref.join_type_list();
819
+ const join_qual_list = table_ref.join_qual_list();
820
+ if (context.collectDynamicQueryInfo && traverseResult.dynamicQueryInfo.from.length == 0) {
821
+ collectDynamicQueryInfoTableRef(table_ref, null, null, fromColumnsResult, [], traverseResult);
822
+ }
823
+ if (table_ref_list) {
824
+ const joinColumns = table_ref_list.flatMap((table_ref, joinIndex) => {
825
+ const joinType = join_type_list[joinIndex]; //INNER, LEFT
826
+ const joinQual = join_qual_list[joinIndex];
827
+ const numParamsBefore = traverseResult.parameters.length;
828
+ const joinColumns = traverse_table_ref(table_ref, context, traverseResult);
829
+ const isUsing = (joinQual === null || joinQual === void 0 ? void 0 : joinQual.USING()) ? true : false;
830
+ const isLeftJoin = joinType === null || joinType === void 0 ? void 0 : joinType.LEFT();
831
+ const filteredColumns = isUsing ? filterUsingColumns(joinColumns, joinQual) : joinColumns;
832
+ const resultColumns = isLeftJoin ? filteredColumns.map(col => (Object.assign(Object.assign({}, col), { is_nullable: true }))) : filteredColumns;
833
+ if (context.collectNestedInfo) {
834
+ collectNestedInfo(joinQual, resultColumns, traverseResult);
835
+ }
836
+ if (context.collectDynamicQueryInfo) {
837
+ const parameters = traverseResult.parameters.slice(numParamsBefore).map((_, index) => index + numParamsBefore);
838
+ collectDynamicQueryInfoTableRef(table_ref, joinType, joinQual, resultColumns, parameters, traverseResult);
839
+ }
840
+ return resultColumns;
841
+ });
842
+ allColumns.push(...joinColumns);
843
+ }
718
844
  }
719
845
  const select_with_parens = table_ref.select_with_parens();
720
846
  if (select_with_parens) {
721
- const columns = traverse_select_with_parens(select_with_parens, context, traverseResult);
847
+ const columns = traverse_select_with_parens(select_with_parens, Object.assign(Object.assign({}, context), { collectDynamicQueryInfo: false }), traverseResult);
722
848
  const withAlias = columns.map(col => (Object.assign(Object.assign({}, col), { table_name: alias || col.table_name })));
723
849
  return withAlias;
724
850
  }
725
851
  return allColumns;
726
852
  }
727
- function collectNestedInfo(joinQual, resultColumns, traverseResult) {
728
- var _a;
853
+ function collectDynamicQueryInfoTableRef(table_ref, joinType, joinQual, columns, parameters, traverseResult) {
854
+ var _a, _b;
855
+ const alias = table_ref.alias_clause() ? (0, select_columns_1.extractOriginalSql)(table_ref.alias_clause()) : '';
856
+ const fromExpr = (0, select_columns_1.extractOriginalSql)(table_ref.relation_expr() || table_ref.select_with_parens());
857
+ const tableName = ((_a = table_ref.relation_expr()) === null || _a === void 0 ? void 0 : _a.getText()) || alias;
858
+ const fromOrJoin = joinType ? `${(0, select_columns_1.extractOriginalSql)(joinType)} JOIN` : 'FROM';
859
+ const join = joinQual ? ` ${(0, select_columns_1.extractOriginalSql)(joinQual)}` : '';
860
+ const fromFragment = `${fromOrJoin} ${fromExpr} ${alias}${join}`;
861
+ const fields = columns.map(col => col.column_name);
862
+ const joinColumns = joinQual ? getJoinColumns(joinQual) : [];
863
+ const parentList = joinColumns.filter(joinRef => joinRef.prefix !== tableName && joinRef.prefix !== alias);
864
+ const parentRelation = parentList.length === 1 ? parentList[0].prefix : '';
865
+ (_b = traverseResult.dynamicQueryInfo) === null || _b === void 0 ? void 0 : _b.from.push({
866
+ fragment: fromFragment,
867
+ fields,
868
+ parameters,
869
+ relationName: tableName,
870
+ relationAlias: alias,
871
+ parentRelation
872
+ });
873
+ }
874
+ function getJoinColumns(joinQual) {
729
875
  const a_expr_or_list = joinQual ? collectContextsOfType(joinQual, PostgreSQLParser_1.A_expr_orContext) : [];
730
876
  if (a_expr_or_list.length == 1) {
731
877
  const a_expr_or = a_expr_or_list[0];
732
878
  const a_expr_and = a_expr_or.a_expr_and_list()[0];
733
879
  const columnref = collectContextsOfType(a_expr_and, PostgreSQLParser_1.ColumnrefContext);
734
880
  const joinColumns = columnref.map(colRef => (0, select_columns_1.splitName)(colRef.getText()));
735
- const currentRelation = (_a = traverseResult.relations) === null || _a === void 0 ? void 0 : _a.at(-1);
736
- joinColumns.forEach(joinRef => {
737
- if (currentRelation) {
738
- const joinColumn = resultColumns.filter(col => col.column_name === joinRef.name)[0];
739
- const unique = joinColumn && (joinColumn.column_key === 'PRI' || joinColumn.column_key === 'UNI');
740
- if (joinRef.prefix === currentRelation.name || joinRef.prefix === currentRelation.alias) {
741
- if (!unique) {
742
- currentRelation.cardinality = 'many';
743
- }
881
+ return joinColumns;
882
+ }
883
+ return [];
884
+ }
885
+ function collectNestedInfo(joinQual, resultColumns, traverseResult) {
886
+ var _a;
887
+ const joinColumns = getJoinColumns(joinQual);
888
+ const currentRelation = (_a = traverseResult.relations) === null || _a === void 0 ? void 0 : _a.at(-1);
889
+ joinColumns.forEach(joinRef => {
890
+ if (currentRelation) {
891
+ const joinColumn = resultColumns.filter(col => col.column_name === joinRef.name)[0];
892
+ const unique = joinColumn && (joinColumn.column_key === 'PRI' || joinColumn.column_key === 'UNI');
893
+ if (joinRef.prefix === currentRelation.name || joinRef.prefix === currentRelation.alias) {
894
+ if (!unique) {
895
+ currentRelation.cardinality = 'many';
744
896
  }
745
- else {
746
- currentRelation.parentRelation = joinRef.prefix;
747
- if (!unique) {
748
- currentRelation.parentCardinality = 'many';
749
- }
897
+ }
898
+ else {
899
+ currentRelation.parentRelation = joinRef.prefix;
900
+ if (!unique) {
901
+ currentRelation.parentCardinality = 'many';
750
902
  }
751
903
  }
752
- });
753
- }
904
+ }
905
+ });
754
906
  }
755
907
  function filterUsingColumns(fromColumns, joinQual) {
756
908
  const excludeList = joinQual.name_list().name_list().map(name => (0, select_columns_1.splitName)(name.getText()));
@@ -851,7 +1003,8 @@ function traverseInsertstmt(insertstmt, dbSchema) {
851
1003
  const context = {
852
1004
  dbSchema,
853
1005
  fromColumns: insertColumns,
854
- generateNestedInfo: false
1006
+ collectNestedInfo: false,
1007
+ collectDynamicQueryInfo: false
855
1008
  };
856
1009
  const selectstmt = insert_rest.selectstmt();
857
1010
  traverse_insert_select_stmt(selectstmt, Object.assign(Object.assign({}, context), { fromColumns: insertColumnsList }), traverseResult);
@@ -890,7 +1043,7 @@ function traverse_insert_select_stmt(selectstmt, context, traverseResult) {
890
1043
  const from_clause = simple_select_pramary.from_clause();
891
1044
  const fromColumns = from_clause ? traverse_from_clause(from_clause, Object.assign(Object.assign({}, context), { fromColumns: [] }), traverseResult) : [];
892
1045
  target_list.target_el_list().forEach((target_el, index) => {
893
- const targetResult = isNotNull_target_el(target_el, Object.assign(Object.assign({}, context), { fromColumns }), traverseResult);
1046
+ const targetResult = traverse_target_el(target_el, Object.assign(Object.assign({}, context), { fromColumns }), traverseResult);
894
1047
  if (isParameter(targetResult.column_name)) {
895
1048
  traverseResult.parameters.at(-1).isNotNull = !context.fromColumns[index].is_nullable;
896
1049
  }
@@ -915,7 +1068,8 @@ function traverseDeletestmt(deleteStmt, dbSchema, traverseResult) {
915
1068
  const context = {
916
1069
  dbSchema,
917
1070
  fromColumns: deleteColumns,
918
- generateNestedInfo: false
1071
+ collectNestedInfo: false,
1072
+ collectDynamicQueryInfo: false
919
1073
  };
920
1074
  const returninColumns = returning_clause ? traverse_target_list(returning_clause.target_list(), context, traverseResult) : [];
921
1075
  const result = {
@@ -937,7 +1091,8 @@ function traverseUpdatestmt(updatestmt, dbSchema, traverseResult) {
937
1091
  const context = {
938
1092
  dbSchema,
939
1093
  fromColumns: updateColumns,
940
- generateNestedInfo: false
1094
+ collectNestedInfo: false,
1095
+ collectDynamicQueryInfo: false
941
1096
  };
942
1097
  updatestmt.set_clause_list().set_clause_list()
943
1098
  .forEach(set_clause => traverse_set_clause(set_clause, context, traverseResult));