typesql-cli 0.7.0 → 0.7.1

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.
@@ -18,8 +18,12 @@ function traverseQueryContext(queryContext, dbSchema, namedParameters) {
18
18
  dbSchema,
19
19
  parameters,
20
20
  fromColumns: [],
21
+ subQueryColumns: [],
22
+ subQuery: false,
23
+ where: false,
21
24
  withSchema: [],
22
25
  dynamicSqlInfo: {
26
+ with: [],
23
27
  select: [],
24
28
  from: [],
25
29
  where: []
@@ -309,14 +313,14 @@ function traverseQueryExpressionOrParens(queryExpressionOrParens, traverseContex
309
313
  }
310
314
  throw Error("walkQueryExpressionOrParens");
311
315
  }
312
- function traverseQueryExpression(queryExpression, traverseContext, subQuery = false, recursiveNames) {
316
+ function traverseQueryExpression(queryExpression, traverseContext, recursiveNames) {
313
317
  const withClause = queryExpression.withClause();
314
318
  if (withClause) {
315
319
  traverseWithClause(withClause, traverseContext);
316
320
  }
317
321
  const queryExpressionBody = queryExpression.queryExpressionBody();
318
322
  if (queryExpressionBody) {
319
- return traverseQueryExpressionBody(queryExpressionBody, traverseContext, subQuery, recursiveNames);
323
+ return traverseQueryExpressionBody(queryExpressionBody, traverseContext, recursiveNames);
320
324
  }
321
325
  const queryExpressionParens = queryExpression.queryExpressionParens();
322
326
  if (queryExpressionParens) {
@@ -327,7 +331,7 @@ function traverseQueryExpression(queryExpression, traverseContext, subQuery = fa
327
331
  function traverseQueryExpressionParens(queryExpressionParens, traverseContext, recursiveNames) {
328
332
  const queryExpression = queryExpressionParens.queryExpression();
329
333
  if (queryExpression) {
330
- return traverseQueryExpression(queryExpression, traverseContext, false, recursiveNames);
334
+ return traverseQueryExpression(queryExpression, traverseContext, recursiveNames);
331
335
  }
332
336
  const queryExpressionParens2 = queryExpressionParens.queryExpressionParens();
333
337
  if (queryExpressionParens2) {
@@ -339,16 +343,16 @@ function createUnionVar(type, name) {
339
343
  const newVar = Object.assign(Object.assign({}, type), { name: name, table: '' });
340
344
  return newVar;
341
345
  }
342
- function traverseQueryExpressionBody(queryExpressionBody, traverseContext, subQuery = false, recursiveNames) {
346
+ function traverseQueryExpressionBody(queryExpressionBody, traverseContext, recursiveNames) {
343
347
  const allQueries = (0, parse_1.getAllQuerySpecificationsFromSelectStatement)(queryExpressionBody);
344
348
  const [first, ...unionQuerySpec] = allQueries;
345
- const mainQueryResult = traverseQuerySpecification(first, traverseContext, subQuery);
349
+ const mainQueryResult = traverseQuerySpecification(first, traverseContext);
346
350
  const resultTypes = mainQueryResult.columns.map((t, index) => unionQuerySpec.length == 0 ? t.type : createUnionVar(t.type, recursiveNames && recursiveNames.length > 0 ? recursiveNames[index] : t.name)); //TODO mover para traversequeryspecificat?
347
351
  for (let queryIndex = 0; queryIndex < unionQuerySpec.length; queryIndex++) {
348
352
  const columnNames = recursiveNames && recursiveNames.length > 0 ? recursiveNames : mainQueryResult.columns.map(col => col.name);
349
353
  const newFromColumns = recursiveNames ? renameFromColumns(mainQueryResult.columns, columnNames) : [];
350
354
  const unionQuery = unionQuerySpec[queryIndex];
351
- const unionResult = traverseQuerySpecification(unionQuery, Object.assign(Object.assign({}, traverseContext), { fromColumns: newFromColumns }), subQuery);
355
+ const unionResult = traverseQuerySpecification(unionQuery, Object.assign(Object.assign({}, traverseContext), { fromColumns: newFromColumns }));
352
356
  resultTypes.forEach((t2, index) => {
353
357
  mainQueryResult.columns[index].notNull = mainQueryResult.columns[index].notNull && unionResult.columns[index].notNull;
354
358
  traverseContext.constraints.push({
@@ -388,16 +392,16 @@ function renameFromColumns(fromColumns, recursiveNames) {
388
392
  });
389
393
  return newFromColumns;
390
394
  }
391
- function traverseQuerySpecification(querySpec, traverseContext, subQuery = false) {
395
+ function traverseQuerySpecification(querySpec, traverseContext) {
392
396
  const fromClause = querySpec.fromClause();
393
- const fromColumnsFrom = fromClause ? traverseFromClause(fromClause, traverseContext, subQuery) : [];
394
- const allColumns = subQuery ? traverseContext.fromColumns.concat(fromColumnsFrom) : fromColumnsFrom; //(... where id = t1.id)
395
- const selectItemListResult = traverseSelectItemList(querySpec.selectItemList(), Object.assign(Object.assign({}, traverseContext), { fromColumns: allColumns }), subQuery);
397
+ const fromColumnsFrom = fromClause ? traverseFromClause(fromClause, traverseContext) : [];
398
+ const allColumns = traverseContext.subQuery ? traverseContext.fromColumns.concat(fromColumnsFrom) : fromColumnsFrom; //(... where id = t1.id)
399
+ const selectItemListResult = traverseSelectItemList(querySpec.selectItemList(), Object.assign(Object.assign({}, traverseContext), { fromColumns: allColumns, subQueryColumns: fromColumnsFrom }));
396
400
  const whereClause = querySpec.whereClause();
397
401
  //TODO - HAVING, BLAH
398
402
  if (whereClause) {
399
403
  const whereExpr = whereClause === null || whereClause === void 0 ? void 0 : whereClause.expr();
400
- traverseExpr(whereExpr, Object.assign(Object.assign({}, traverseContext), { fromColumns: allColumns }), !subQuery);
404
+ traverseExpr(whereExpr, Object.assign(Object.assign({}, traverseContext), { fromColumns: allColumns, subQueryColumns: fromColumnsFrom, where: !traverseContext.subQuery }));
401
405
  }
402
406
  const columnNullability = (0, infer_column_nullability_1.inferNotNull)(querySpec, traverseContext.dbSchema, allColumns);
403
407
  const columns = selectItemListResult.types.map((t, index) => {
@@ -432,7 +436,7 @@ exports.traverseQuerySpecification = traverseQuerySpecification;
432
436
  function traverseWithClause(withClause, traverseContext) {
433
437
  //result1, result2
434
438
  withClause.commonTableExpression().forEach(commonTableExpression => {
435
- var _a;
439
+ var _a, _b;
436
440
  const identifier = commonTableExpression.identifier().text;
437
441
  const recursiveNames = withClause.RECURSIVE_SYMBOL() ? ((_a = commonTableExpression.columnInternalRefList()) === null || _a === void 0 ? void 0 : _a.columnInternalRef().map(t => t.text)) || [] : undefined;
438
442
  const subQuery = commonTableExpression.subquery();
@@ -447,16 +451,25 @@ function traverseWithClause(withClause, traverseContext) {
447
451
  };
448
452
  traverseContext.withSchema.push(withCol);
449
453
  });
454
+ (_b = traverseContext.dynamicSqlInfo.with) === null || _b === void 0 ? void 0 : _b.push({
455
+ fragment: (0, select_columns_1.extractOriginalSql)(commonTableExpression) + '',
456
+ relation: identifier,
457
+ fields: [],
458
+ dependOnFields: [],
459
+ dependOnParams: [],
460
+ parameters: [],
461
+ dependOn: []
462
+ });
450
463
  });
451
464
  }
452
465
  exports.traverseWithClause = traverseWithClause;
453
- function traverseFromClause(fromClause, traverseContext, subQuery = false) {
466
+ function traverseFromClause(fromClause, traverseContext) {
454
467
  var _a;
455
468
  const tableReferenceList = (_a = fromClause.tableReferenceList()) === null || _a === void 0 ? void 0 : _a.tableReference();
456
- const fromColumns = tableReferenceList ? traverseTableReferenceList(tableReferenceList, traverseContext, null, subQuery) : [];
469
+ const fromColumns = tableReferenceList ? traverseTableReferenceList(tableReferenceList, traverseContext, null) : [];
457
470
  return fromColumns;
458
471
  }
459
- function traverseTableReferenceList(tableReferenceList, traverseContext, currentFragment, subQuery = false) {
472
+ function traverseTableReferenceList(tableReferenceList, traverseContext, currentFragment) {
460
473
  const result = [];
461
474
  const fragements = [];
462
475
  tableReferenceList.forEach(tab => {
@@ -529,7 +542,7 @@ function traverseTableReferenceList(tableReferenceList, traverseContext, current
529
542
  traverseExpr(onClause, Object.assign(Object.assign({}, traverseContext), { fromColumns: allJoinedColumns.flatMap(c => c).concat(result) }));
530
543
  const columns = (0, select_columns_1.getExpressions)(onClause, ts_mysql_parser_1.SimpleExprColumnRefContext);
531
544
  columns.forEach(columnRef => {
532
- const fieldName = (0, select_columns_1.splitName)(columnRef.text);
545
+ const fieldName = (0, select_columns_1.splitName)(columnRef.expr.text);
533
546
  if ((innerJoinFragment === null || innerJoinFragment === void 0 ? void 0 : innerJoinFragment.relation) != fieldName.prefix) {
534
547
  innerJoinFragment.parentRelation = fieldName.prefix;
535
548
  }
@@ -549,7 +562,7 @@ function traverseTableReferenceList(tableReferenceList, traverseContext, current
549
562
  });
550
563
  });
551
564
  });
552
- if (!subQuery) {
565
+ if (!traverseContext.subQuery) {
553
566
  traverseContext.dynamicSqlInfo.from = fragements;
554
567
  }
555
568
  return result;
@@ -558,7 +571,7 @@ function traverseTableFactor(tableFactor, traverseContext, currentFragment) {
558
571
  var _a;
559
572
  const singleTable = tableFactor.singleTable();
560
573
  if (singleTable) {
561
- return traverseSingleTable(singleTable, traverseContext.dbSchema, traverseContext.withSchema, currentFragment);
574
+ return traverseSingleTable(singleTable, traverseContext.dbSchema, traverseContext.withSchema, currentFragment, traverseContext.dynamicSqlInfo.with);
562
575
  }
563
576
  const derivadTable = tableFactor.derivedTable();
564
577
  if (derivadTable) {
@@ -602,7 +615,7 @@ function traverseTableReferenceListParens(ctx, traverseContext) {
602
615
  }
603
616
  throw Error('traverseTableReferenceListParens - not supported: ' + ctx.constructor.name);
604
617
  }
605
- function traverseSingleTable(singleTable, dbSchema, withSchema, currentFragment) {
618
+ function traverseSingleTable(singleTable, dbSchema, withSchema, currentFragment, withFragments) {
606
619
  var _a;
607
620
  const table = singleTable === null || singleTable === void 0 ? void 0 : singleTable.tableRef().text;
608
621
  const tableAlias = (_a = singleTable === null || singleTable === void 0 ? void 0 : singleTable.tableAlias()) === null || _a === void 0 ? void 0 : _a.identifier().text;
@@ -610,6 +623,11 @@ function traverseSingleTable(singleTable, dbSchema, withSchema, currentFragment)
610
623
  if (currentFragment) {
611
624
  currentFragment.relation = tableAlias || tableName.name;
612
625
  }
626
+ withFragments === null || withFragments === void 0 ? void 0 : withFragments.forEach(withFragment => {
627
+ if (withFragment.relation == table) {
628
+ withFragment.parentRelation = tableAlias || tableName.name;
629
+ }
630
+ });
613
631
  const fields = filterColumns(dbSchema, withSchema, tableAlias, tableName);
614
632
  return fields;
615
633
  }
@@ -617,7 +635,7 @@ function traverseSubquery(subQuery, traverseContext, recursiveNames) {
617
635
  const queryExpressionParens = subQuery.queryExpressionParens();
618
636
  const queryExpression = queryExpressionParens.queryExpression();
619
637
  if (queryExpression) {
620
- return traverseQueryExpression(queryExpression, traverseContext, true, recursiveNames);
638
+ return traverseQueryExpression(queryExpression, Object.assign(Object.assign({}, traverseContext), { subQuery: true }), recursiveNames);
621
639
  }
622
640
  const queryExpressionParens2 = queryExpressionParens.queryExpressionParens();
623
641
  if (queryExpressionParens2) {
@@ -625,7 +643,7 @@ function traverseSubquery(subQuery, traverseContext, recursiveNames) {
625
643
  }
626
644
  throw Error('traverseSubquery - not expected: ' + subQuery.constructor.name);
627
645
  }
628
- function traverseSelectItemList(selectItemList, traverseContext, subQuery = false) {
646
+ function traverseSelectItemList(selectItemList, traverseContext) {
629
647
  const listType = [];
630
648
  if (selectItemList.MULT_OPERATOR()) {
631
649
  traverseContext.fromColumns.forEach(col => {
@@ -643,9 +661,9 @@ function traverseSelectItemList(selectItemList, traverseContext, subQuery = fals
643
661
  dependOnFields: [],
644
662
  dependOnParams: [],
645
663
  parameters: [],
646
- dependOn: []
664
+ dependOn: [tableName]
647
665
  };
648
- if (!subQuery) {
666
+ if (!traverseContext.subQuery) {
649
667
  traverseContext.dynamicSqlInfo.select.push(fieldFragment);
650
668
  }
651
669
  });
@@ -665,7 +683,6 @@ function traverseSelectItemList(selectItemList, traverseContext, subQuery = fals
665
683
  }
666
684
  const expr = selectItem.expr();
667
685
  if (expr) {
668
- const exprType = traverseExpr(expr, traverseContext);
669
686
  const selectFragment = {
670
687
  fragment: (0, select_columns_1.extractOriginalSql)(selectItem) + '',
671
688
  fragementWithoutAlias: (0, select_columns_1.extractOriginalSql)(expr),
@@ -675,20 +692,9 @@ function traverseSelectItemList(selectItemList, traverseContext, subQuery = fals
675
692
  parameters: [],
676
693
  dependOn: []
677
694
  };
678
- if (!subQuery) {
695
+ const exprType = traverseExpr(expr, Object.assign(Object.assign({}, traverseContext), { currentFragement: traverseContext.subQuery ? traverseContext.currentFragement : selectFragment }));
696
+ if (!traverseContext.subQuery) {
679
697
  (_a = traverseContext.dynamicSqlInfo.select) === null || _a === void 0 ? void 0 : _a.push(selectFragment);
680
- const columns = (0, select_columns_1.getExpressions)(expr, ts_mysql_parser_1.SimpleExprColumnRefContext);
681
- const columnName = (0, select_columns_1.getColumnName)(selectItem);
682
- columns.forEach(colRef => {
683
- const fieldName = (0, select_columns_1.splitName)(colRef.text);
684
- const column = (0, select_columns_1.findColumn)(fieldName, traverseContext.fromColumns);
685
- selectFragment.fields.push({
686
- field: fieldName.name,
687
- name: columnName,
688
- table: column.tableAlias || column.table
689
- });
690
- selectFragment.dependOn.push(column.tableAlias || column.table);
691
- });
692
698
  }
693
699
  // const fields = exprType.kind == 'TypeVar' ? [{ field: exprType.name, table: exprType.table + '', name: getColumnName(selectItem) }] : []
694
700
  if (exprType.kind == 'TypeOperator') {
@@ -712,12 +718,12 @@ function traverseHavingClause(havingClause, traverseContext) {
712
718
  const havingExpr = havingClause.expr();
713
719
  traverseExpr(havingExpr, traverseContext);
714
720
  }
715
- function traverseExpr(expr, traverseContext, where = false) {
721
+ function traverseExpr(expr, traverseContext) {
716
722
  if (expr instanceof ts_mysql_parser_1.ExprIsContext) {
717
723
  const boolPri = expr.boolPri();
718
724
  let paramsCount = traverseContext.parameters.length;
719
- const boolPriType = traverseBoolPri(boolPri, traverseContext, where);
720
- if (where) {
725
+ const boolPriType = traverseBoolPri(boolPri, traverseContext);
726
+ if (traverseContext.where) {
721
727
  const currentFragment = {
722
728
  fragment: 'AND ' + (0, select_columns_1.extractOriginalSql)(expr),
723
729
  fields: [],
@@ -733,7 +739,7 @@ function traverseExpr(expr, traverseContext, where = false) {
733
739
  });
734
740
  const columnsRef = (0, select_columns_1.getExpressions)(expr, ts_mysql_parser_1.ColumnRefContext);
735
741
  columnsRef.forEach(colRef => {
736
- const fileName = (0, select_columns_1.splitName)(colRef.text);
742
+ const fileName = (0, select_columns_1.splitName)(colRef.expr.text);
737
743
  currentFragment.fields.push({
738
744
  field: fileName.name,
739
745
  name: fileName.name,
@@ -757,8 +763,8 @@ function traverseExpr(expr, traverseContext, where = false) {
757
763
  (0, select_columns_1.getTopLevelAndExpr)(expr, all);
758
764
  all.forEach(andExpression => {
759
765
  let paramsCount = traverseContext.parameters.length;
760
- traverseExpr(andExpression.expr, traverseContext, false);
761
- if (where) {
766
+ traverseExpr(andExpression.expr, Object.assign(Object.assign({}, traverseContext), { where: false }));
767
+ if (traverseContext.where) {
762
768
  const currentFragment = {
763
769
  fragment: andExpression.operator + ' ' + (0, select_columns_1.extractOriginalSql)(andExpression.expr),
764
770
  fields: [],
@@ -774,7 +780,7 @@ function traverseExpr(expr, traverseContext, where = false) {
774
780
  });
775
781
  const columnsRef = (0, select_columns_1.getExpressions)(andExpression.expr, ts_mysql_parser_1.ColumnRefContext);
776
782
  columnsRef.forEach(colRef => {
777
- const fileName = (0, select_columns_1.splitName)(colRef.text);
783
+ const fileName = (0, select_columns_1.splitName)(colRef.expr.text);
778
784
  currentFragment.fields.push({
779
785
  field: fileName.name,
780
786
  name: fileName.name,
@@ -788,10 +794,10 @@ function traverseExpr(expr, traverseContext, where = false) {
788
794
  }
789
795
  throw Error('traverseExpr - not supported: ' + expr.text);
790
796
  }
791
- function traverseBoolPri(boolPri, traverseContext, where = false) {
797
+ function traverseBoolPri(boolPri, traverseContext) {
792
798
  if (boolPri instanceof ts_mysql_parser_1.PrimaryExprPredicateContext) {
793
799
  const predicate = boolPri.predicate();
794
- const predicateType = traversePredicate(predicate, traverseContext, where);
800
+ const predicateType = traversePredicate(predicate, traverseContext);
795
801
  return predicateType;
796
802
  }
797
803
  if (boolPri instanceof ts_mysql_parser_1.PrimaryExprIsNullContext) {
@@ -829,9 +835,9 @@ function traverseBoolPri(boolPri, traverseContext, where = false) {
829
835
  }
830
836
  throw Error('traverseExpr - not supported: ' + boolPri.constructor.name);
831
837
  }
832
- function traversePredicate(predicate, traverseContext, where = false) {
838
+ function traversePredicate(predicate, traverseContext) {
833
839
  const bitExpr = predicate.bitExpr()[0]; //TODO - predicate length = 2? [1] == predicateOperations
834
- const bitExprType = traverseBitExpr(bitExpr, traverseContext, where);
840
+ const bitExprType = traverseBitExpr(bitExpr, traverseContext);
835
841
  const predicateOperations = predicate.predicateOperations();
836
842
  if (predicateOperations) {
837
843
  const rightType = traversePredicateOperations(predicateOperations, bitExprType, traverseContext);
@@ -871,10 +877,10 @@ function traverseExprList(exprList, traverseContext) {
871
877
  };
872
878
  return type;
873
879
  }
874
- function traverseBitExpr(bitExpr, traverseContext, where = false) {
880
+ function traverseBitExpr(bitExpr, traverseContext) {
875
881
  const simpleExpr = bitExpr.simpleExpr();
876
882
  if (simpleExpr) {
877
- return traverseSimpleExpr(simpleExpr, traverseContext, where);
883
+ return traverseSimpleExpr(simpleExpr, Object.assign(Object.assign({}, traverseContext), { where: false }));
878
884
  }
879
885
  if (bitExpr.bitExpr().length == 2) {
880
886
  const bitExprLeft = bitExpr.bitExpr()[0];
@@ -959,13 +965,13 @@ function traversePredicateOperations(predicateOperations, parentType, traverseCo
959
965
  }
960
966
  const exprList = predicateOperations.exprList();
961
967
  if (exprList) {
962
- const rightType = traverseExprList(exprList, traverseContext);
968
+ const rightType = traverseExprList(exprList, Object.assign(Object.assign({}, traverseContext), { where: false }));
963
969
  return rightType;
964
970
  }
965
971
  }
966
972
  if (predicateOperations instanceof ts_mysql_parser_1.PredicateExprLikeContext) {
967
973
  const simpleExpr = predicateOperations.simpleExpr()[0];
968
- const rightType = traverseSimpleExpr(simpleExpr, traverseContext);
974
+ const rightType = traverseSimpleExpr(simpleExpr, Object.assign(Object.assign({}, traverseContext), { where: false }));
969
975
  traverseContext.constraints.push({
970
976
  expression: simpleExpr.text,
971
977
  type1: parentType,
@@ -997,7 +1003,7 @@ function traversePredicateOperations(predicateOperations, parentType, traverseCo
997
1003
  }
998
1004
  throw Error("Not supported: " + predicateOperations.constructor.name);
999
1005
  }
1000
- function traverseSimpleExpr(simpleExpr, traverseContext, where = false) {
1006
+ function traverseSimpleExpr(simpleExpr, traverseContext) {
1001
1007
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
1002
1008
  if (simpleExpr instanceof ts_mysql_parser_1.SimpleExprColumnRefContext) {
1003
1009
  const fieldName = (0, select_columns_1.splitName)(simpleExpr.text);
@@ -1009,6 +1015,17 @@ function traverseSimpleExpr(simpleExpr, traverseContext, where = false) {
1009
1015
  type2: column.columnType,
1010
1016
  mostGeneralType: true
1011
1017
  });
1018
+ if (traverseContext.currentFragement != null) {
1019
+ if (!traverseContext.subQuery) {
1020
+ traverseContext.currentFragement.dependOn.push(column.tableAlias || column.table);
1021
+ }
1022
+ else {
1023
+ const subQueryColumn = (0, select_columns_1.findColumnOrNull)(fieldName, traverseContext.subQueryColumns);
1024
+ if (subQueryColumn == null) {
1025
+ traverseContext.currentFragement.dependOn.push(column.tableAlias || column.table);
1026
+ }
1027
+ }
1028
+ }
1012
1029
  return typeVar;
1013
1030
  }
1014
1031
  if (simpleExpr instanceof ts_mysql_parser_1.SimpleExprParamMarkerContext) {
@@ -1054,7 +1071,7 @@ function traverseSimpleExpr(simpleExpr, traverseContext, where = false) {
1054
1071
  if (simpleExpr instanceof ts_mysql_parser_1.SimpleExprListContext) {
1055
1072
  const exprList = simpleExpr.exprList();
1056
1073
  const listType = exprList.expr().map(item => {
1057
- const exprType = traverseExpr(item, traverseContext, false);
1074
+ const exprType = traverseExpr(item, Object.assign(Object.assign({}, traverseContext), { where: false }));
1058
1075
  return exprType;
1059
1076
  });
1060
1077
  const resultType = {