typesql-cli 0.15.0-experimental.4 → 0.15.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 (45) hide show
  1. package/README.md +5 -1
  2. package/code-generator.d.ts.map +1 -1
  3. package/code-generator.js +4 -2
  4. package/code-generator.js.map +1 -1
  5. package/code-generator2.d.ts.map +1 -1
  6. package/code-generator2.js +56 -29
  7. package/code-generator2.js.map +1 -1
  8. package/describe-query.d.ts.map +1 -1
  9. package/describe-query.js +8 -2
  10. package/describe-query.js.map +1 -1
  11. package/dialects/postgres.d.ts.map +1 -1
  12. package/dialects/postgres.js +40 -2
  13. package/dialects/postgres.js.map +1 -1
  14. package/drivers/postgres.d.ts.map +1 -1
  15. package/drivers/postgres.js +14 -4
  16. package/drivers/postgres.js.map +1 -1
  17. package/drivers/types.d.ts +1 -0
  18. package/drivers/types.d.ts.map +1 -1
  19. package/mysql-mapping.d.ts +1 -1
  20. package/mysql-mapping.d.ts.map +1 -1
  21. package/mysql-mapping.js.map +1 -1
  22. package/package.json +52 -52
  23. package/postgres-query-analyzer/describe.d.ts.map +1 -1
  24. package/postgres-query-analyzer/describe.js +10 -41
  25. package/postgres-query-analyzer/describe.js.map +1 -1
  26. package/postgres-query-analyzer/parser.d.ts +2 -0
  27. package/postgres-query-analyzer/parser.d.ts.map +1 -1
  28. package/postgres-query-analyzer/parser.js +12 -0
  29. package/postgres-query-analyzer/parser.js.map +1 -1
  30. package/postgres-query-analyzer/traverse.d.ts +2 -0
  31. package/postgres-query-analyzer/traverse.d.ts.map +1 -1
  32. package/postgres-query-analyzer/traverse.js +339 -69
  33. package/postgres-query-analyzer/traverse.js.map +1 -1
  34. package/sqlite-query-analyzer/code-generator.js +4 -2
  35. package/sqlite-query-analyzer/code-generator.js.map +1 -1
  36. package/sqlite-query-analyzer/replace-list-params.js +31 -7
  37. package/sqlite-query-analyzer/replace-list-params.js.map +1 -1
  38. package/sqlite-query-analyzer/traverse.d.ts +2 -2
  39. package/sqlite-query-analyzer/traverse.d.ts.map +1 -1
  40. package/sqlite-query-analyzer/traverse.js +55 -21
  41. package/sqlite-query-analyzer/traverse.js.map +1 -1
  42. package/sqlite-query-analyzer/types.d.ts +1 -1
  43. package/sqlite-query-analyzer/types.d.ts.map +1 -1
  44. package/types.d.ts +1 -0
  45. package/types.d.ts.map +1 -1
@@ -7,7 +7,8 @@ const select_columns_1 = require("../mysql-query-analyzer/select-columns");
7
7
  function traverseSmt(stmt, dbSchema) {
8
8
  const traverseResult = {
9
9
  columnsNullability: [],
10
- parametersNullability: []
10
+ parameters: [],
11
+ singleRow: false
11
12
  };
12
13
  const selectstmt = stmt.selectstmt();
13
14
  if (selectstmt) {
@@ -45,12 +46,16 @@ function traverseSelectstmt(selectstmt, dbSchema, fromColumns, traverseResult) {
45
46
  const result = collectContextsOfType(selectstmt, PostgreSQLParser_1.C_expr_exprContext).filter(c_expr => c_expr.PARAM());
46
47
  const paramIsListResult = result.map(param => paramIsList(param));
47
48
  const columns = traverse_selectstmt(selectstmt, dbSchema, fromColumns, traverseResult);
49
+ //select parameters are collected after from paramters
50
+ traverseResult.parameters.sort((param1, param2) => param1.paramIndex - param2.paramIndex);
48
51
  const columnsNullability = columns.map(col => !col.is_nullable);
52
+ const multipleRowsResult = !isSingleRowResult(selectstmt, dbSchema);
49
53
  const limit = checkLimit(selectstmt);
50
54
  return {
51
55
  queryType: 'Select',
56
+ multipleRowsResult,
52
57
  columnsNullability,
53
- parametersNullability: traverseResult.parametersNullability,
58
+ parametersNullability: traverseResult.parameters.map(param => param.isNotNull),
54
59
  parameterList: paramIsListResult,
55
60
  limit
56
61
  };
@@ -112,6 +117,7 @@ function traverse_simple_select_intersect(simple_select_intersect, dbSchema, fro
112
117
  return [];
113
118
  }
114
119
  function traverse_simple_select_pramary(simple_select_pramary, dbSchema, parentFromColumns, traverseResult) {
120
+ var _a;
115
121
  const fromColumns = [];
116
122
  const from_clause = simple_select_pramary.from_clause();
117
123
  if (from_clause) {
@@ -125,6 +131,10 @@ function traverse_simple_select_pramary(simple_select_pramary, dbSchema, parentF
125
131
  const valuesColumns = traverse_values_clause(values_clause, dbSchema, parentFromColumns, traverseResult);
126
132
  return valuesColumns;
127
133
  }
134
+ const where_a_expr = (_a = simple_select_pramary.where_clause()) === null || _a === void 0 ? void 0 : _a.a_expr();
135
+ if (where_a_expr) {
136
+ traverse_a_expr(where_a_expr, dbSchema, parentFromColumns.concat(fromColumns), traverseResult);
137
+ }
128
138
  const filteredColumns = filterColumns_simple_select_pramary(simple_select_pramary, dbSchema, parentFromColumns.concat(fromColumns), traverseResult);
129
139
  return filteredColumns;
130
140
  }
@@ -153,12 +163,16 @@ function filterColumns_simple_select_pramary(simple_select_pramary, dbSchema, fr
153
163
  if (target_list_) {
154
164
  const target_list = target_list_.target_list();
155
165
  if (target_list) {
156
- return filterColumns_target_list(target_list, dbSchema, fromColumns, traverseResult);
166
+ return traverse_target_list(target_list, dbSchema, fromColumns, traverseResult);
157
167
  }
158
168
  }
169
+ const target_list = simple_select_pramary.target_list();
170
+ if (target_list) {
171
+ return traverse_target_list(target_list, dbSchema, fromColumns, traverseResult);
172
+ }
159
173
  return [];
160
174
  }
161
- function filterColumns_target_list(target_list, dbSchema, fromColumns, traverseResult) {
175
+ function traverse_target_list(target_list, dbSchema, fromColumns, traverseResult) {
162
176
  const columns = target_list.target_el_list().flatMap(target_el => {
163
177
  const fieldName = (0, select_columns_1.splitName)(target_el.getText());
164
178
  if (fieldName.name == '*') {
@@ -219,11 +233,11 @@ function traverse_expr_or(a_expr_or, dbSchema, fromColumns, traverseResult) {
219
233
  throw Error('traverse_expr_or - Not expected:' + a_expr_or.getText());
220
234
  }
221
235
  function traverse_expr_and(a_expr_and, dbSchema, fromColumns, traverseResult) {
222
- const a_expr_between = a_expr_and.a_expr_between_list()[0];
223
- if (a_expr_between) {
224
- return traverse_expr_between(a_expr_between, dbSchema, fromColumns, traverseResult);
225
- }
226
- throw Error('traverse_expr_and - Not expected:' + a_expr_and.getText());
236
+ const result = a_expr_and.a_expr_between_list().map(a_expr_between => traverse_expr_between(a_expr_between, dbSchema, fromColumns, traverseResult));
237
+ return {
238
+ column_name: a_expr_and.getText(),
239
+ is_nullable: result.some(col => col.is_nullable)
240
+ };
227
241
  }
228
242
  function traverse_expr_between(a_expr_between, dbSchema, fromColumns, traverseResult) {
229
243
  const a_expr_in = a_expr_between.a_expr_in_list()[0];
@@ -234,10 +248,31 @@ function traverse_expr_between(a_expr_between, dbSchema, fromColumns, traverseRe
234
248
  }
235
249
  function traverse_expr_in(a_expr_in, dbSchema, fromColumns, traverseResult) {
236
250
  const a_expr_unary = a_expr_in.a_expr_unary_not();
251
+ let leftExprResult = undefined;
237
252
  if (a_expr_unary) {
238
- return traverse_expr_unary(a_expr_unary, dbSchema, fromColumns, traverseResult);
253
+ leftExprResult = traverse_expr_unary(a_expr_unary, dbSchema, fromColumns, traverseResult);
254
+ }
255
+ const in_expr = a_expr_in.in_expr();
256
+ if (in_expr) {
257
+ traverse_in_expr(in_expr, dbSchema, fromColumns, traverseResult);
258
+ }
259
+ return {
260
+ column_name: a_expr_in.getText(),
261
+ //id in (...) -> is_nullable: false
262
+ // value -> is_nullable = leftExprResult.is_nullable
263
+ is_nullable: in_expr != null ? false : leftExprResult.is_nullable
264
+ };
265
+ }
266
+ function traverse_in_expr(in_expr, dbSchema, fromColumns, traverseResult) {
267
+ if (in_expr instanceof PostgreSQLParser_1.In_expr_selectContext) {
268
+ const select_with_parens = in_expr.select_with_parens();
269
+ traverse_select_with_parens(select_with_parens, dbSchema, fromColumns, traverseResult);
270
+ }
271
+ if (in_expr instanceof PostgreSQLParser_1.In_expr_listContext) {
272
+ in_expr.expr_list().a_expr_list().forEach(a_expr => {
273
+ traverse_a_expr(a_expr, dbSchema, fromColumns, traverseResult);
274
+ });
239
275
  }
240
- throw Error('traverse_expr_in - Not expected:' + a_expr_in.getText());
241
276
  }
242
277
  function traverse_expr_unary(a_expr_unary, dbSchema, fromColumns, traverseResult) {
243
278
  const a_expr_isnull = a_expr_unary.a_expr_isnull();
@@ -261,16 +296,24 @@ function traverse_expr_is_not(a_expr_is_not, dbSchema, fromColumns, traverseResu
261
296
  throw Error('traverse_expr_is_not - Not expected:' + a_expr_is_not.getText());
262
297
  }
263
298
  function traverse_expr_compare(a_expr_compare, dbSchema, fromColumns, traverseResult) {
264
- const a_expr_like = a_expr_compare.a_expr_like_list()[0];
265
- if (a_expr_like) {
266
- return traverse_expr_like(a_expr_like, dbSchema, fromColumns, traverseResult);
299
+ const a_expr_like_list = a_expr_compare.a_expr_like_list();
300
+ if (a_expr_like_list) {
301
+ const result = a_expr_like_list.map(a_expr_like => traverse_expr_like(a_expr_like, dbSchema, fromColumns, traverseResult));
302
+ return {
303
+ column_name: a_expr_compare.getText(),
304
+ is_nullable: result.some(col => col.is_nullable)
305
+ };
267
306
  }
268
307
  throw Error('traverse_expr_compare - Not expected:' + a_expr_compare.getText());
269
308
  }
270
309
  function traverse_expr_like(a_expr_like, dbSchema, fromColumns, traverseResult) {
271
- const a_expr_qual_op = a_expr_like.a_expr_qual_op_list()[0];
272
- if (a_expr_qual_op) {
273
- return traverse_expr_qual_op(a_expr_qual_op, dbSchema, fromColumns, traverseResult);
310
+ const a_expr_qual_op_list = a_expr_like.a_expr_qual_op_list();
311
+ if (a_expr_qual_op_list) {
312
+ const result = a_expr_qual_op_list.map(a_expr_qual_op => traverse_expr_qual_op(a_expr_qual_op, dbSchema, fromColumns, traverseResult));
313
+ return {
314
+ column_name: a_expr_like.getText(),
315
+ is_nullable: result.some(col => col.is_nullable)
316
+ };
274
317
  }
275
318
  throw Error('traverse_expr_like - Not expected:' + a_expr_like.getText());
276
319
  }
@@ -346,13 +389,17 @@ function traverse_expr_typecast(a_expr_typecast, dbSchema, fromColumns, traverse
346
389
  }
347
390
  throw Error('traverse_expr_typecast - Not expected:' + a_expr_typecast.getText());
348
391
  }
392
+ function traverseColumnRef(columnref, fromColumns) {
393
+ const fieldName = (0, select_columns_1.splitName)(columnref.getText());
394
+ const col = findColumn(fieldName, fromColumns);
395
+ return col;
396
+ }
349
397
  function traversec_expr(c_expr, dbSchema, fromColumns, traverseResult) {
350
398
  var _a, _b;
351
399
  if (c_expr instanceof PostgreSQLParser_1.C_expr_exprContext) {
352
400
  const columnref = c_expr.columnref();
353
401
  if (columnref) {
354
- const fieldName = (0, select_columns_1.splitName)(columnref.getText());
355
- const col = findColumn(fieldName, fromColumns);
402
+ const col = traverseColumnRef(columnref, fromColumns);
356
403
  return col;
357
404
  }
358
405
  const aexprconst = c_expr.aexprconst();
@@ -364,7 +411,10 @@ function traversec_expr(c_expr, dbSchema, fromColumns, traverseResult) {
364
411
  };
365
412
  }
366
413
  if (c_expr.PARAM()) {
367
- traverseResult.parametersNullability.push(true);
414
+ traverseResult.parameters.push({
415
+ paramIndex: c_expr.start.start,
416
+ isNotNull: true
417
+ });
368
418
  return {
369
419
  column_name: c_expr.PARAM().getText(),
370
420
  is_nullable: false
@@ -471,7 +521,7 @@ function traversefunc_expr_common_subexpr(func_expr_common_subexpr, dbSchema, fr
471
521
  const result = func_arg_list.map(func_arg_expr => {
472
522
  const paramResult = traverse_a_expr(func_arg_expr, dbSchema, fromColumns, traverseResult);
473
523
  if (isParameter(paramResult.column_name)) {
474
- traverseResult.parametersNullability[traverseResult.parametersNullability.length - 1] = false;
524
+ traverseResult.parameters[traverseResult.parameters.length - 1].isNotNull = false;
475
525
  paramResult.is_nullable = true;
476
526
  }
477
527
  return paramResult;
@@ -519,11 +569,11 @@ function traverse_table_ref(table_ref, dbSchema, fromColumns, traverseResult) {
519
569
  const allColumns = [];
520
570
  const relation_expr = table_ref.relation_expr();
521
571
  const aliasClause = table_ref.alias_clause();
522
- const alias = aliasClause ? aliasClause.getText() : undefined;
572
+ const alias = aliasClause ? aliasClause.colid().getText() : undefined;
523
573
  if (relation_expr) {
524
574
  const tableName = traverse_relation_expr(relation_expr, dbSchema);
525
- const tableNameWithAlias = alias ? alias : tableName;
526
- const fromColumnsResult = fromColumns.concat(dbSchema).filter(col => col.table_name === tableName).map(col => (Object.assign(Object.assign({}, col), { table_name: tableNameWithAlias })));
575
+ const tableNameWithAlias = alias ? alias : tableName.name;
576
+ const fromColumnsResult = fromColumns.concat(dbSchema).filter(col => col.table_name === tableName.name).map(col => (Object.assign(Object.assign({}, col), { table_name: tableNameWithAlias })));
527
577
  allColumns.push(...fromColumnsResult);
528
578
  }
529
579
  const table_ref_list = table_ref.table_ref_list();
@@ -572,11 +622,19 @@ function traverse_relation_expr(relation_expr, dbSchema) {
572
622
  return name;
573
623
  }
574
624
  function traverse_qualified_name(qualified_name, dbSchema) {
575
- const colid = qualified_name.colid();
576
- if (colid) {
577
- return traverse_colid(colid, dbSchema);
625
+ var _a, _b;
626
+ const colid_name = qualified_name.colid() ? traverse_colid(qualified_name.colid(), dbSchema) : '';
627
+ const indirection_el_list = (_a = qualified_name.indirection()) === null || _a === void 0 ? void 0 : _a.indirection_el_list();
628
+ if (indirection_el_list && indirection_el_list.length === 1) {
629
+ return {
630
+ name: ((_b = indirection_el_list[0].attr_name()) === null || _b === void 0 ? void 0 : _b.getText()) || '',
631
+ alias: colid_name
632
+ };
578
633
  }
579
- return '';
634
+ return {
635
+ name: colid_name,
636
+ alias: ''
637
+ };
580
638
  }
581
639
  function traverse_colid(colid, dbSchema) {
582
640
  const identifier = colid.identifier();
@@ -626,6 +684,11 @@ function paramIsList(c_expr) {
626
684
  return in_expr_list instanceof PostgreSQLParser_1.In_expr_listContext;
627
685
  }
628
686
  function traverseInsertstmt(insertstmt, dbSchema) {
687
+ const traverseResult = {
688
+ columnsNullability: [],
689
+ parameters: [],
690
+ singleRow: false
691
+ };
629
692
  const insert_target = insertstmt.insert_target();
630
693
  const tableName = insert_target.getText();
631
694
  const insertColumns = dbSchema.filter(col => col.table_name === tableName);
@@ -634,47 +697,64 @@ function traverseInsertstmt(insertstmt, dbSchema) {
634
697
  .insert_column_item_list()
635
698
  .map(insert_column_item => traverse_insert_column_item(insert_column_item, insertColumns));
636
699
  const selectstmt = insert_rest.selectstmt();
637
- const parametersNullability = traverse_insert_select_stmt(selectstmt, dbSchema, insertColumnsList);
638
- return {
700
+ traverse_insert_select_stmt(selectstmt, dbSchema, insertColumnsList, traverseResult);
701
+ const on_conflict = insertstmt.on_conflict_();
702
+ if (on_conflict) {
703
+ const set_clause_list = on_conflict.set_clause_list().set_clause_list() || [];
704
+ set_clause_list.forEach(set_clause => traverse_set_clause(set_clause, dbSchema, insertColumns, traverseResult));
705
+ }
706
+ const returning_clause = insertstmt.returning_clause();
707
+ const returninColumns = returning_clause ? traverse_target_list(returning_clause.target_list(), dbSchema, insertColumns, traverseResult) : [];
708
+ const result = {
639
709
  queryType: 'Insert',
640
- parametersNullability,
641
- columnsNullability: [],
710
+ multipleRowsResult: false,
711
+ parametersNullability: traverseResult.parameters.map(param => param.isNotNull),
712
+ columnsNullability: returninColumns.map(col => !col.is_nullable),
642
713
  parameterList: []
643
714
  };
715
+ if (returning_clause) {
716
+ result.returning = true;
717
+ }
718
+ return result;
644
719
  }
645
- function traverse_insert_select_stmt(selectstmt, dbSchema, insertColumnlist) {
646
- var _a, _b, _c, _d;
720
+ function traverse_insert_select_stmt(selectstmt, dbSchema, insertColumnlist, traverseResult) {
721
+ var _a, _b, _c, _d, _e;
647
722
  const simple_select = (_c = (_b = (_a = selectstmt.select_no_parens()) === null || _a === void 0 ? void 0 : _a.select_clause()) === null || _b === void 0 ? void 0 : _b.simple_select_intersect_list()) === null || _c === void 0 ? void 0 : _c[0];
648
723
  if (simple_select) {
649
724
  const simple_select_pramary = (_d = simple_select === null || simple_select === void 0 ? void 0 : simple_select.simple_select_pramary_list()) === null || _d === void 0 ? void 0 : _d[0];
650
725
  if (simple_select_pramary) {
651
- return simple_select_pramary.values_clause().expr_list_list()
652
- .flatMap(expr_list => traverse_insert_a_expr_list(expr_list, dbSchema, insertColumnlist));
726
+ const values_clause = simple_select_pramary.values_clause();
727
+ if (values_clause) {
728
+ values_clause.expr_list_list()
729
+ .forEach(expr_list => traverse_insert_a_expr_list(expr_list, dbSchema, insertColumnlist, traverseResult));
730
+ }
731
+ const target_list = (_e = simple_select_pramary.target_list_()) === null || _e === void 0 ? void 0 : _e.target_list();
732
+ if (target_list) {
733
+ const from_clause = simple_select_pramary.from_clause();
734
+ const fromColumns = from_clause ? traverse_from_clause(from_clause, dbSchema, [], traverseResult) : [];
735
+ target_list.target_el_list().forEach((target_el, index) => {
736
+ const targetResult = isNotNull_target_el(target_el, dbSchema, fromColumns, traverseResult);
737
+ if (isParameter(targetResult.column_name)) {
738
+ traverseResult.parameters.at(-1).isNotNull = !insertColumnlist[index].is_nullable;
739
+ }
740
+ });
741
+ }
653
742
  }
654
743
  }
655
- return [];
656
744
  }
657
- function traverse_insert_a_expr_list(expr_list, dbSchema, insertColumns) {
658
- const parametersNullability = [];
745
+ function traverse_insert_a_expr_list(expr_list, dbSchema, insertColumns, traverseResult) {
659
746
  expr_list.a_expr_list().forEach((a_expr, index) => {
660
- const traverseResult = {
661
- columnsNullability: [],
662
- parametersNullability: []
663
- };
664
747
  const result = traverse_a_expr(a_expr, dbSchema, insertColumns, traverseResult);
665
748
  if (isParameter(result.column_name)) {
666
- parametersNullability.push(!insertColumns[index].is_nullable);
667
- }
668
- else {
669
- parametersNullability.push(...traverseResult.parametersNullability);
749
+ traverseResult.parameters.at(-1).isNotNull = !insertColumns[index].is_nullable;
670
750
  }
671
751
  });
672
- return parametersNullability;
673
752
  }
674
753
  function traverseDeletestmt(deleteStmt, dbSchema, traverseResult) {
675
754
  return {
676
755
  queryType: 'Delete',
677
- parametersNullability: traverseResult.parametersNullability,
756
+ multipleRowsResult: false,
757
+ parametersNullability: traverseResult.parameters.map(param => param.isNotNull),
678
758
  columnsNullability: [],
679
759
  parameterList: []
680
760
  };
@@ -684,20 +764,21 @@ function traverseUpdatestmt(updatestmt, dbSchema, traverseResult) {
684
764
  const tableName = relation_expr_opt_alias.getText();
685
765
  const updateColumns = dbSchema.filter(col => col.table_name === tableName);
686
766
  updatestmt.set_clause_list().set_clause_list()
687
- .map(set_clause => traverse_set_clause(set_clause, dbSchema, updateColumns, traverseResult));
688
- const dataParameters = traverseResult.parametersNullability;
767
+ .forEach(set_clause => traverse_set_clause(set_clause, dbSchema, updateColumns, traverseResult));
768
+ const parametersBefore = traverseResult.parameters.length;
689
769
  const where_clause = updatestmt.where_or_current_clause();
690
770
  if (where_clause) {
691
771
  const a_expr = where_clause.a_expr();
692
772
  traverse_a_expr(a_expr, dbSchema, updateColumns, traverseResult);
693
773
  }
694
- const whereParameters = traverseResult.parametersNullability.slice(dataParameters.length);
774
+ const whereParameters = traverseResult.parameters.slice(parametersBefore);
695
775
  return {
696
776
  queryType: 'Update',
697
- parametersNullability: traverseResult.parametersNullability,
777
+ multipleRowsResult: false,
778
+ parametersNullability: traverseResult.parameters.slice(0, parametersBefore).map(param => param.isNotNull),
698
779
  columnsNullability: [],
699
780
  parameterList: [],
700
- whereParamtersNullability: whereParameters
781
+ whereParamtersNullability: whereParameters.map(param => param.isNotNull)
701
782
  };
702
783
  }
703
784
  function traverse_set_clause(set_clause, dbSchema, updateColumns, traverseResult) {
@@ -705,11 +786,11 @@ function traverse_set_clause(set_clause, dbSchema, updateColumns, traverseResult
705
786
  const columnName = (0, select_columns_1.splitName)(set_target.getText());
706
787
  const column = findColumn(columnName, updateColumns);
707
788
  const a_expr = set_clause.a_expr();
708
- const a_exprResult = traverse_a_expr(a_expr, dbSchema, updateColumns, traverseResult);
789
+ const excludedColumns = updateColumns.map((col) => (Object.assign(Object.assign({}, col), { table_name: 'excluded' })));
790
+ const a_exprResult = traverse_a_expr(a_expr, dbSchema, updateColumns.concat(excludedColumns), traverseResult);
709
791
  if (isParameter(a_exprResult.column_name)) {
710
- traverseResult.parametersNullability[traverseResult.parametersNullability.length - 1] = !column.is_nullable;
792
+ traverseResult.parameters[traverseResult.parameters.length - 1].isNotNull = !column.is_nullable;
711
793
  }
712
- return !column.is_nullable;
713
794
  }
714
795
  function traverse_insert_column_item(insert_column_item, dbSchema) {
715
796
  const colid = insert_column_item.colid();
@@ -905,20 +986,10 @@ function isNotNull_c_expr(c_expr, field) {
905
986
  }
906
987
  return false;
907
988
  }
908
- function checkLimit(selectstmt) {
909
- const select_no_parens = selectstmt.select_no_parens();
910
- if (select_no_parens) {
911
- return checkLimit_select_no_parens(select_no_parens);
912
- }
913
- const select_with_parens = selectstmt.select_with_parens();
914
- if (select_with_parens) {
915
- return checkLimit_select_with_parens(select_with_parens);
916
- }
917
- return undefined;
918
- }
919
989
  function checkLimit_select_no_parens(select_no_parens) {
920
990
  var _a, _b, _c;
921
- return +((_c = (_b = (_a = select_no_parens.select_limit()) === null || _a === void 0 ? void 0 : _a.limit_clause()) === null || _b === void 0 ? void 0 : _b.select_limit_value()) === null || _c === void 0 ? void 0 : _c.getText());
991
+ const limitText = (_c = (_b = (_a = select_no_parens.select_limit()) === null || _a === void 0 ? void 0 : _a.limit_clause()) === null || _b === void 0 ? void 0 : _b.select_limit_value()) === null || _c === void 0 ? void 0 : _c.getText();
992
+ return limitText ? +limitText : undefined;
922
993
  }
923
994
  function checkLimit_select_with_parens(select_with_parens) {
924
995
  return checkLimit(select_with_parens);
@@ -928,4 +999,203 @@ function isParameter(str) {
928
999
  const paramPattern = /^\$[0-9]+(::[a-zA-Z_][a-zA-Z0-9_]*)?$/;
929
1000
  return paramPattern.test(str);
930
1001
  }
1002
+ function isSingleRowResult(selectstmt, dbSchema) {
1003
+ var _a;
1004
+ const limit = checkLimit(selectstmt);
1005
+ if (limit === 1) {
1006
+ return true;
1007
+ }
1008
+ const select_no_parens = selectstmt.select_no_parens();
1009
+ const simple_select_pramary_list = (_a = select_no_parens.select_clause()
1010
+ .simple_select_intersect_list()) === null || _a === void 0 ? void 0 : _a[0].simple_select_pramary_list();
1011
+ if (simple_select_pramary_list.length > 1) {
1012
+ return false;
1013
+ }
1014
+ const simple_select_pramary = simple_select_pramary_list[0];
1015
+ const from_clause = simple_select_pramary.from_clause();
1016
+ if (!from_clause) {
1017
+ const hasSetReturningFunction = simple_select_pramary.target_list_().target_list().target_el_list().some(target_el => isSetReturningFunction_target_el(target_el));
1018
+ return !hasSetReturningFunction;
1019
+ }
1020
+ if (!simple_select_pramary.group_clause()) {
1021
+ const agreegateFunction = hasAggregateFunction(simple_select_pramary);
1022
+ if (agreegateFunction) {
1023
+ return true;
1024
+ }
1025
+ }
1026
+ const table_ref_list = from_clause.from_list().table_ref_list();
1027
+ if (table_ref_list.length > 1) {
1028
+ return false;
1029
+ }
1030
+ if (table_ref_list[0].JOIN_list().length > 0 || table_ref_list[0].select_with_parens() != null) {
1031
+ return false;
1032
+ }
1033
+ const tableName = getTableName(table_ref_list[0]);
1034
+ const uniqueKeys = dbSchema.filter(col => col.table_name.toLowerCase() === tableName.name.toLowerCase()
1035
+ && (col.column_key === 'PRI' || col.column_key === 'UNI'))
1036
+ .map(col => col.column_name);
1037
+ const where_clause = simple_select_pramary.where_clause();
1038
+ if (where_clause) {
1039
+ return isSingleRowResult_where(where_clause.a_expr(), uniqueKeys);
1040
+ }
1041
+ return false;
1042
+ }
1043
+ function hasAggregateFunction(simple_select_pramary) {
1044
+ const target_list_ = simple_select_pramary.target_list_();
1045
+ if (target_list_) {
1046
+ return target_list_.target_list().target_el_list().some(target_el => isAggregateFunction_target_el(target_el));
1047
+ }
1048
+ const target_list = simple_select_pramary.target_list();
1049
+ return target_list.target_el_list().some(target_el => isAggregateFunction_target_el(target_el));
1050
+ }
1051
+ function getTableName(table_ref) {
1052
+ const relation_expr = table_ref.relation_expr();
1053
+ const tableName = relation_expr.qualified_name().getText();
1054
+ const aliasClause = table_ref.alias_clause();
1055
+ const tableAlias = aliasClause ? aliasClause.colid().getText() : '';
1056
+ return {
1057
+ name: tableName,
1058
+ alias: tableAlias
1059
+ };
1060
+ }
1061
+ function isAggregateFunction_target_el(target_el) {
1062
+ if (target_el instanceof PostgreSQLParser_1.Target_labelContext) {
1063
+ const c_expr_list = collectContextsOfType(target_el, PostgreSQLParser_1.Func_exprContext);
1064
+ const aggrFunction = c_expr_list.some(func_expr => isAggregateFunction_c_expr(func_expr));
1065
+ return aggrFunction;
1066
+ }
1067
+ return false;
1068
+ }
1069
+ // SELECT distinct '''' || p.proname || '''' || ',' as aggregate_function
1070
+ // FROM pg_catalog.pg_proc p
1071
+ // JOIN pg_catalog.pg_aggregate a ON a.aggfnoid = p.oid
1072
+ // ORDER BY aggregate_function;
1073
+ const aggregateFunctions = new Set([
1074
+ 'array_agg',
1075
+ 'avg',
1076
+ 'bit_and',
1077
+ 'bit_or',
1078
+ 'bool_and',
1079
+ 'bool_or',
1080
+ 'corr',
1081
+ 'count',
1082
+ 'covar_pop',
1083
+ 'covar_samp',
1084
+ 'cume_dist',
1085
+ 'dense_rank',
1086
+ 'every',
1087
+ 'json_agg',
1088
+ 'json_object_agg',
1089
+ 'jsonb_agg',
1090
+ 'jsonb_object_agg',
1091
+ 'max',
1092
+ 'min',
1093
+ 'mode',
1094
+ 'percent_rank',
1095
+ 'percentile_cont',
1096
+ 'percentile_disc',
1097
+ 'rank',
1098
+ 'regr_avgx',
1099
+ 'regr_avgy',
1100
+ 'regr_count',
1101
+ 'regr_intercept',
1102
+ 'regr_r2',
1103
+ 'regr_slope',
1104
+ 'regr_sxx',
1105
+ 'regr_sxy',
1106
+ 'regr_syy',
1107
+ 'stddev',
1108
+ 'stddev_pop',
1109
+ 'stddev_samp',
1110
+ 'string_agg',
1111
+ 'sum',
1112
+ 'var_pop',
1113
+ 'var_samp',
1114
+ 'variance',
1115
+ 'xmlagg'
1116
+ ]);
1117
+ function isAggregateFunction_c_expr(func_expr) {
1118
+ var _a, _b, _c;
1119
+ const funcName = (_c = (_b = (_a = func_expr === null || func_expr === void 0 ? void 0 : func_expr.func_application()) === null || _a === void 0 ? void 0 : _a.func_name()) === null || _b === void 0 ? void 0 : _b.getText()) === null || _c === void 0 ? void 0 : _c.toLowerCase();
1120
+ return aggregateFunctions.has(funcName);
1121
+ }
1122
+ function isSetReturningFunction_target_el(target_el) {
1123
+ if (target_el instanceof PostgreSQLParser_1.Target_labelContext) {
1124
+ const c_expr_list = collectContextsOfType(target_el, PostgreSQLParser_1.Func_exprContext);
1125
+ const setReturningFunction = c_expr_list.some(func_expr => isSetReturningFunction_c_expr(func_expr));
1126
+ return setReturningFunction;
1127
+ }
1128
+ return false;
1129
+ }
1130
+ function isSetReturningFunction_c_expr(func_expr) {
1131
+ var _a, _b, _c;
1132
+ const funcName = (_c = (_b = (_a = func_expr === null || func_expr === void 0 ? void 0 : func_expr.func_application()) === null || _a === void 0 ? void 0 : _a.func_name()) === null || _b === void 0 ? void 0 : _b.getText()) === null || _c === void 0 ? void 0 : _c.toLowerCase();
1133
+ return funcName === 'generate_series';
1134
+ }
1135
+ function isSingleRowResult_where(a_expr, uniqueKeys) {
1136
+ var _a, _b;
1137
+ const a_expr_or_list = ((_b = (_a = a_expr.a_expr_qual()) === null || _a === void 0 ? void 0 : _a.a_expr_lessless()) === null || _b === void 0 ? void 0 : _b.a_expr_or_list()) || [];
1138
+ if (a_expr_or_list.length > 1 || a_expr_or_list[0].OR_list().length > 0) {
1139
+ return false;
1140
+ }
1141
+ const someInSingleRow = a_expr_or_list[0].a_expr_and_list().some(a_expr_and => {
1142
+ const a = isSingleRowResult_a_expr_and(a_expr_and, uniqueKeys);
1143
+ return a;
1144
+ });
1145
+ return someInSingleRow;
1146
+ }
1147
+ function isSingleRowResult_a_expr_and(a_expr_and, uniqueKeys) {
1148
+ const a_expr_between_list = a_expr_and.a_expr_between_list();
1149
+ if (a_expr_between_list && a_expr_between_list.length > 0) {
1150
+ return a_expr_between_list.some(a_expr_between => isSingleRowResult_a_expr_between(a_expr_between, uniqueKeys));
1151
+ }
1152
+ return false;
1153
+ }
1154
+ function isSingleRowResult_a_expr_between(a_expr_between, uniqueKeys) {
1155
+ const isSingleRow = a_expr_between.a_expr_in_list().every(a_expr_in => isSingleRowResult_a_expr_in(a_expr_in, uniqueKeys));
1156
+ return isSingleRow;
1157
+ }
1158
+ function isSingleRowResult_a_expr_in(a_expr_in, uniqueKeys) {
1159
+ var _a, _b, _c;
1160
+ const a_expr_compare = (_c = (_b = (_a = a_expr_in.a_expr_unary_not()) === null || _a === void 0 ? void 0 : _a.a_expr_isnull()) === null || _b === void 0 ? void 0 : _b.a_expr_is_not()) === null || _c === void 0 ? void 0 : _c.a_expr_compare();
1161
+ if (a_expr_compare) {
1162
+ if (a_expr_compare.EQUAL() != null) {
1163
+ const a_expr_like_list = a_expr_compare.a_expr_like_list();
1164
+ if (a_expr_like_list && a_expr_like_list.length == 2) {
1165
+ const left = a_expr_like_list[0];
1166
+ const right = a_expr_like_list[1];
1167
+ const result = (isUniqueColumn(left, uniqueKeys) + isUniqueColumn(right, uniqueKeys));
1168
+ return result == 1;
1169
+ }
1170
+ }
1171
+ ;
1172
+ }
1173
+ return false;
1174
+ }
1175
+ //1 = yes
1176
+ //0 = no
1177
+ function isUniqueColumn(a_expr_like, uniqueKeys) {
1178
+ var _a, _b;
1179
+ const c_expr = (_b = (_a = a_expr_like.a_expr_qual_op_list()) === null || _a === void 0 ? void 0 : _a[0].a_expr_unary_qualop_list()) === null || _b === void 0 ? void 0 : _b[0].a_expr_add().a_expr_mul_list()[0].a_expr_caret_list()[0].a_expr_unary_sign_list()[0].a_expr_at_time_zone().a_expr_collate().a_expr_typecast().c_expr();
1180
+ if (c_expr instanceof PostgreSQLParser_1.C_expr_exprContext) {
1181
+ const columnref = c_expr.columnref();
1182
+ if (columnref) {
1183
+ const fieldName = (0, select_columns_1.splitName)(columnref.getText());
1184
+ // const col = traverseColumnRef(columnref, dbSchema);
1185
+ return uniqueKeys.includes(fieldName.name) ? 1 : 0;
1186
+ }
1187
+ }
1188
+ return 0;
1189
+ }
1190
+ function checkLimit(selectstmt) {
1191
+ const select_no_parens = selectstmt.select_no_parens();
1192
+ if (select_no_parens) {
1193
+ return checkLimit_select_no_parens(select_no_parens);
1194
+ }
1195
+ const select_with_parens = selectstmt.select_with_parens();
1196
+ if (select_with_parens) {
1197
+ return checkLimit_select_with_parens(select_with_parens);
1198
+ }
1199
+ return undefined;
1200
+ }
931
1201
  //# sourceMappingURL=traverse.js.map