typesql-cli 0.19.2 → 0.21.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 (123) hide show
  1. package/README.md +5 -0
  2. package/cli.js +51 -64
  3. package/cli.js.map +1 -1
  4. package/code-generator.d.ts +1 -1
  5. package/code-generator.d.ts.map +1 -1
  6. package/code-generator.js +4 -3
  7. package/code-generator.js.map +1 -1
  8. package/code-generator2.d.ts.map +1 -1
  9. package/code-generator2.js +151 -115
  10. package/code-generator2.js.map +1 -1
  11. package/codegen/code-generator.d.ts +13 -0
  12. package/codegen/code-generator.d.ts.map +1 -0
  13. package/codegen/code-generator.js +106 -0
  14. package/codegen/code-generator.js.map +1 -0
  15. package/codegen/code-generator2.d.ts +10 -0
  16. package/codegen/code-generator2.d.ts.map +1 -0
  17. package/codegen/code-generator2.js +917 -0
  18. package/codegen/code-generator2.js.map +1 -0
  19. package/codegen/codegen-util.d.ts +1 -0
  20. package/codegen/codegen-util.d.ts.map +1 -0
  21. package/codegen/codegen-util.js +2 -0
  22. package/codegen/codegen-util.js.map +1 -0
  23. package/codegen/generic/codegen-util.d.ts +8 -0
  24. package/codegen/generic/codegen-util.d.ts.map +1 -0
  25. package/codegen/generic/codegen-util.js +89 -0
  26. package/codegen/generic/codegen-util.js.map +1 -0
  27. package/codegen/mysql2.d.ts +40 -0
  28. package/codegen/mysql2.d.ts.map +1 -0
  29. package/codegen/mysql2.js +667 -0
  30. package/codegen/mysql2.js.map +1 -0
  31. package/codegen/pg.d.ts +9 -0
  32. package/codegen/pg.d.ts.map +1 -0
  33. package/codegen/pg.js +760 -0
  34. package/codegen/pg.js.map +1 -0
  35. package/codegen/postgres-pg.d.ts +10 -0
  36. package/codegen/postgres-pg.d.ts.map +1 -0
  37. package/codegen/postgres-pg.js +917 -0
  38. package/codegen/postgres-pg.js.map +1 -0
  39. package/codegen/shared/codegen-util.d.ts +28 -0
  40. package/codegen/shared/codegen-util.d.ts.map +1 -0
  41. package/codegen/shared/codegen-util.js +303 -0
  42. package/codegen/shared/codegen-util.js.map +1 -0
  43. package/codegen/sqlite-code-generator.d.ts +15 -0
  44. package/codegen/sqlite-code-generator.d.ts.map +1 -0
  45. package/codegen/sqlite-code-generator.js +1049 -0
  46. package/codegen/sqlite-code-generator.js.map +1 -0
  47. package/codegen/sqlite.d.ts +13 -0
  48. package/codegen/sqlite.d.ts.map +1 -0
  49. package/codegen/sqlite.js +893 -0
  50. package/codegen/sqlite.js.map +1 -0
  51. package/describe-query.d.ts.map +1 -1
  52. package/describe-query.js +45 -32
  53. package/describe-query.js.map +1 -1
  54. package/dialects/postgres.d.ts +4 -1
  55. package/dialects/postgres.d.ts.map +1 -1
  56. package/dialects/postgres.js +4 -2
  57. package/dialects/postgres.js.map +1 -1
  58. package/drivers/sqlite.d.ts +4 -1
  59. package/drivers/sqlite.d.ts.map +1 -1
  60. package/drivers/sqlite.js +4 -1
  61. package/drivers/sqlite.js.map +1 -1
  62. package/drivers/types.d.ts +3 -1
  63. package/drivers/types.d.ts.map +1 -1
  64. package/generic/codegen-util.d.ts +8 -0
  65. package/generic/codegen-util.d.ts.map +1 -0
  66. package/generic/codegen-util.js +89 -0
  67. package/generic/codegen-util.js.map +1 -0
  68. package/load-config.d.ts +6 -0
  69. package/load-config.d.ts.map +1 -1
  70. package/load-config.js +65 -1
  71. package/load-config.js.map +1 -1
  72. package/mysql-mapping.d.ts +4 -1
  73. package/mysql-mapping.d.ts.map +1 -1
  74. package/mysql-mapping.js +5 -3
  75. package/mysql-mapping.js.map +1 -1
  76. package/mysql-query-analyzer/infer-column-nullability.js +1 -1
  77. package/mysql-query-analyzer/infer-column-nullability.js.map +1 -1
  78. package/mysql-query-analyzer/parse.d.ts.map +1 -1
  79. package/mysql-query-analyzer/parse.js +3 -2
  80. package/mysql-query-analyzer/parse.js.map +1 -1
  81. package/package.json +2 -1
  82. package/postgres-pg.d.ts +10 -0
  83. package/postgres-pg.d.ts.map +1 -0
  84. package/postgres-pg.js +917 -0
  85. package/postgres-pg.js.map +1 -0
  86. package/postgres-query-analyzer/describe.d.ts +1 -1
  87. package/postgres-query-analyzer/describe.d.ts.map +1 -1
  88. package/postgres-query-analyzer/describe.js +77 -48
  89. package/postgres-query-analyzer/describe.js.map +1 -1
  90. package/postgres-query-analyzer/traverse.d.ts +1 -0
  91. package/postgres-query-analyzer/traverse.d.ts.map +1 -1
  92. package/postgres-query-analyzer/traverse.js +90 -28
  93. package/postgres-query-analyzer/traverse.js.map +1 -1
  94. package/postgres-query-analyzer/util.d.ts +9 -0
  95. package/postgres-query-analyzer/util.d.ts.map +1 -0
  96. package/postgres-query-analyzer/util.js +58 -0
  97. package/postgres-query-analyzer/util.js.map +1 -0
  98. package/rescript.d.ts +1 -0
  99. package/rescript.d.ts.map +1 -0
  100. package/rescript.js +2 -0
  101. package/rescript.js.map +1 -0
  102. package/sqlite-query-analyzer/parser.js +3 -3
  103. package/sqlite-query-analyzer/parser.js.map +1 -1
  104. package/sqlite-query-analyzer/replace-list-params.d.ts.map +1 -1
  105. package/sqlite-query-analyzer/replace-list-params.js.map +1 -1
  106. package/sqlite-query-analyzer/sqlite-code-generator.d.ts +15 -0
  107. package/sqlite-query-analyzer/sqlite-code-generator.d.ts.map +1 -0
  108. package/sqlite-query-analyzer/sqlite-code-generator.js +1049 -0
  109. package/sqlite-query-analyzer/sqlite-code-generator.js.map +1 -0
  110. package/sqlite-query-analyzer/traverse.js +1 -1
  111. package/sqlite-query-analyzer/traverse.js.map +1 -1
  112. package/sqlite.d.ts +43 -0
  113. package/sqlite.d.ts.map +1 -0
  114. package/sqlite.js +755 -0
  115. package/sqlite.js.map +1 -0
  116. package/ts-dynamic-query-descriptor.d.ts.map +1 -1
  117. package/ts-dynamic-query-descriptor.js +2 -1
  118. package/ts-dynamic-query-descriptor.js.map +1 -1
  119. package/ts-nested-descriptor.d.ts.map +1 -1
  120. package/ts-nested-descriptor.js +1 -1
  121. package/ts-nested-descriptor.js.map +1 -1
  122. package/types.d.ts +9 -1
  123. package/types.d.ts.map +1 -1
@@ -8,6 +8,7 @@ const typesql_parser_1 = require("@wsporto/typesql-parser");
8
8
  const select_columns_1 = require("../mysql-query-analyzer/select-columns");
9
9
  const postgres_1 = require("@wsporto/typesql-parser/postgres");
10
10
  const case_nullability_checker_1 = require("./case-nullability-checker");
11
+ const util_1 = require("./util");
11
12
  function defaultOptions() {
12
13
  return {
13
14
  collectNestedInfo: false,
@@ -89,7 +90,7 @@ function traverseSelectstmt(selectstmt, context, traverseResult) {
89
90
  const paramIsListResult = getInParameterList(selectstmt);
90
91
  const selectResult = traverse_selectstmt(selectstmt, context, traverseResult);
91
92
  //select parameters are collected after from paramters
92
- traverseResult.parameters.sort((param1, param2) => param1.paramIndex - param2.paramIndex);
93
+ traverseResult.parameters.sort((param1, param2) => param1.paramPos - param2.paramPos);
93
94
  const multipleRowsResult = !(selectResult.singleRow || isSingleRowResult(selectstmt, selectResult.columns));
94
95
  const limit = checkLimit(selectstmt);
95
96
  const postgresTraverseResult = {
@@ -98,8 +99,12 @@ function traverseSelectstmt(selectstmt, context, traverseResult) {
98
99
  columns: selectResult.columns,
99
100
  parametersNullability: traverseResult.parameters.map(param => (Object.assign({ isNotNull: param.isNotNull }, addConstraintIfNotNull(param.checkConstraint)))),
100
101
  parameterList: paramIsListResult,
102
+ orderByColumns: selectResult.orderByColumns,
101
103
  limit
102
104
  };
105
+ if (selectResult.orderByColumns && selectResult.orderByColumns.length > 0) {
106
+ postgresTraverseResult.orderByColumns = selectResult.orderByColumns;
107
+ }
103
108
  if (traverseResult.relations) {
104
109
  postgresTraverseResult.relations = traverseResult.relations;
105
110
  }
@@ -120,7 +125,7 @@ function traverse_selectstmt(selectstmt, context, traverseResult) {
120
125
  };
121
126
  }
122
127
  function traverse_select_no_parens(select_no_parens, context, traverseResult) {
123
- var _a;
128
+ var _a, _b;
124
129
  const with_clause = select_no_parens.with_clause();
125
130
  if (with_clause) {
126
131
  with_clause.cte_list().common_table_expr_list()
@@ -135,13 +140,22 @@ function traverse_select_no_parens(select_no_parens, context, traverseResult) {
135
140
  }
136
141
  const select_clause = select_no_parens.select_clause();
137
142
  const selectResult = traverse_select_clause(select_clause, context, traverseResult);
143
+ const sort_clause = (_a = select_no_parens.sort_clause_()) === null || _a === void 0 ? void 0 : _a.sort_clause();
144
+ if (sort_clause) {
145
+ context.ignoreColumnRef = true;
146
+ sort_clause.sortby_list().sortby_list().forEach(sortby => {
147
+ const a_expr = sortby.a_expr();
148
+ traverse_a_expr(a_expr, context, traverseResult);
149
+ });
150
+ context.ignoreColumnRef = undefined;
151
+ }
138
152
  const select_limit = select_no_parens.select_limit();
139
153
  if (select_limit) {
140
154
  const numParamsBefore = traverseResult.parameters.length;
141
155
  let fragment = '';
142
156
  const limit_clause = select_limit.limit_clause();
143
157
  if (limit_clause) {
144
- const limit_a_expr = (_a = limit_clause.select_limit_value()) === null || _a === void 0 ? void 0 : _a.a_expr();
158
+ const limit_a_expr = (_b = limit_clause.select_limit_value()) === null || _b === void 0 ? void 0 : _b.a_expr();
145
159
  if (limit_a_expr) {
146
160
  traverse_a_expr(limit_a_expr, context, traverseResult);
147
161
  }
@@ -158,7 +172,7 @@ function traverse_select_no_parens(select_no_parens, context, traverseResult) {
158
172
  }
159
173
  }
160
174
  if (fragment) {
161
- const parameters = traverseResult.parameters.slice(numParamsBefore).map((_, index) => index + numParamsBefore);
175
+ const parameters = getParametersIndexes(traverseResult.parameters.slice(numParamsBefore));
162
176
  traverseResult.dynamicQueryInfo.limitOffset = {
163
177
  fragment,
164
178
  parameters
@@ -175,7 +189,7 @@ function traverse_common_table_expr(common_table_expr, context, traverseResult)
175
189
  const selectResult = traverse_selectstmt(select_stmt, Object.assign(Object.assign({}, context), { collectDynamicQueryInfo: false }), traverseResult);
176
190
  const columnsWithTalbeName = selectResult.columns.map(col => (Object.assign(Object.assign({}, col), { table: tableName })));
177
191
  if (context.collectDynamicQueryInfo) {
178
- const parameters = traverseResult.parameters.slice(numParamsBefore).map((_, index) => index + numParamsBefore);
192
+ const parameters = getParametersIndexes(traverseResult.parameters.slice(numParamsBefore));
179
193
  (_a = traverseResult.dynamicQueryInfo) === null || _a === void 0 ? void 0 : _a.with.push({
180
194
  fragment: (0, select_columns_1.extractOriginalSql)(common_table_expr),
181
195
  relationName: tableName,
@@ -184,6 +198,10 @@ function traverse_common_table_expr(common_table_expr, context, traverseResult)
184
198
  }
185
199
  return columnsWithTalbeName;
186
200
  }
201
+ function getParametersIndexes(params) {
202
+ const parameters = [...new Set(params.map(param => param.parameterNumber - 1))];
203
+ return parameters;
204
+ }
187
205
  function traverse_select_clause(select_clause, context, traverseResult) {
188
206
  const simple_select_intersect_list = select_clause.simple_select_intersect_list();
189
207
  const mainSelectResult = traverse_simple_select_intersect(simple_select_intersect_list[0], context, traverseResult);
@@ -201,6 +219,7 @@ function traverse_select_clause(select_clause, context, traverseResult) {
201
219
  }
202
220
  return {
203
221
  columns,
222
+ orderByColumns: mainSelectResult.orderByColumns,
204
223
  singleRow: simple_select_intersect_list.length == 1 ? mainSelectResult.singleRow : false
205
224
  };
206
225
  }
@@ -224,7 +243,7 @@ function traverse_simple_select_pramary(simple_select_pramary, context, traverse
224
243
  if (from_clause) {
225
244
  const where_clause = simple_select_pramary.where_clause();
226
245
  fromResult = traverse_from_clause(from_clause, context, traverseResult);
227
- fromResult.columns = where_clause != null ? fromResult.columns.map(field => checkIsNullable(where_clause, field)) : fromResult.columns;
246
+ fromResult.columns = where_clause != null ? fromResult.columns.map(field => (Object.assign(Object.assign({}, field), { is_nullable: !checkIsNotNull(where_clause, field, fromResult.columns) }))) : fromResult.columns;
228
247
  }
229
248
  const values_clause = simple_select_pramary.values_clause();
230
249
  if (values_clause) {
@@ -242,10 +261,10 @@ function traverse_simple_select_pramary(simple_select_pramary, context, traverse
242
261
  const numParamsBefore = traverseResult.parameters.length;
243
262
  traverse_a_expr(where_a_expr, newContext, traverseResult);
244
263
  if (context.collectDynamicQueryInfo) {
245
- const parameters = traverseResult.parameters.slice(numParamsBefore).map((_, index) => index + numParamsBefore);
264
+ const parameters = getParametersIndexes(traverseResult.parameters.slice(numParamsBefore));
246
265
  const relations = extractRelations(where_a_expr);
247
266
  (_b = traverseResult.dynamicQueryInfo) === null || _b === void 0 ? void 0 : _b.where.push({
248
- fragment: `AND ${(0, select_columns_1.extractOriginalSql)(where_a_expr)}`,
267
+ fragment: `${(0, select_columns_1.extractOriginalSql)(where_a_expr)}`,
249
268
  parameters,
250
269
  dependOnRelations: relations
251
270
  });
@@ -254,11 +273,11 @@ function traverse_simple_select_pramary(simple_select_pramary, context, traverse
254
273
  (_d = (_c = simple_select_pramary.group_clause()) === null || _c === void 0 ? void 0 : _c.group_by_list()) === null || _d === void 0 ? void 0 : _d.group_by_item_list().forEach(group_by => {
255
274
  const a_expr = group_by.a_expr();
256
275
  if (a_expr) {
257
- newContext.groupBy = true;
276
+ newContext.ignoreColumnRef = true;
258
277
  /* The GROUP BY clause can reference column aliases defined in the SELECT list.
259
278
  There's no need to retrieve nullability or type information from the GROUP BY expressions (findColumn(col). */
260
279
  traverse_a_expr(a_expr, newContext, traverseResult);
261
- newContext.groupBy = false;
280
+ newContext.ignoreColumnRef = false;
262
281
  }
263
282
  });
264
283
  const having_expr = (_e = simple_select_pramary.having_clause()) === null || _e === void 0 ? void 0 : _e.a_expr();
@@ -266,9 +285,11 @@ function traverse_simple_select_pramary(simple_select_pramary, context, traverse
266
285
  traverse_a_expr(having_expr, newContext, traverseResult);
267
286
  }
268
287
  const filteredColumns = filterColumns_simple_select_pramary(simple_select_pramary, Object.assign(Object.assign({}, context), { fromColumns: fromResult.columns, parentColumns: context.fromColumns }), traverseResult);
288
+ const orderByColumns = (0, util_1.getOrderByColumns)(fromResult.columns, filteredColumns);
269
289
  return {
270
290
  columns: filteredColumns,
271
- singleRow: fromResult.singleRow
291
+ singleRow: fromResult.singleRow,
292
+ orderByColumns
272
293
  };
273
294
  }
274
295
  function extractRelations(a_expr) {
@@ -364,7 +385,7 @@ function traverse_target_el(target_el, context, traverseResult) {
364
385
  });
365
386
  }
366
387
  if (context.collectDynamicQueryInfo) {
367
- const parameters = traverseResult.parameters.slice(numParamsBefore).map((_, index) => index + numParamsBefore);
388
+ const parameters = getParametersIndexes(traverseResult.parameters.slice(numParamsBefore));
368
389
  const relations = extractRelations(target_el.a_expr());
369
390
  (_b = traverseResult.dynamicQueryInfo) === null || _b === void 0 ? void 0 : _b.select.push({
370
391
  fragment: (0, select_columns_1.extractOriginalSql)(target_el),
@@ -692,8 +713,15 @@ function traverse_expr_typecast(a_expr_typecast, context, traverseResult) {
692
713
  }
693
714
  function traverseColumnRef(columnref, fromColumns) {
694
715
  const fieldName = getFieldName(columnref);
695
- const col = findColumn(fieldName, fromColumns);
696
- return Object.assign(Object.assign({}, col), { is_nullable: col.is_nullable });
716
+ const col = findColumnOrNull(fieldName, fromColumns);
717
+ if (col != null) {
718
+ return Object.assign(Object.assign({}, col), { is_nullable: col.is_nullable });
719
+ }
720
+ const record = findRecordOrNull(fieldName, fromColumns);
721
+ if (record != null) {
722
+ return record;
723
+ }
724
+ throw Error('Column not found: ' + fieldNameToString(fieldName));
697
725
  }
698
726
  function getFieldName(columnref) {
699
727
  const colid = get_colid_text(columnref.colid());
@@ -781,7 +809,7 @@ function traversec_expr(c_expr, context, traverseResult) {
781
809
  }
782
810
  const columnref = c_expr.columnref();
783
811
  if (columnref) {
784
- if (context.groupBy) {
812
+ if (context.ignoreColumnRef) {
785
813
  return {
786
814
  column_name: columnref.getText(),
787
815
  is_nullable: false,
@@ -821,8 +849,9 @@ function traversec_expr(c_expr, context, traverseResult) {
821
849
  }
822
850
  if (c_expr.PARAM()) {
823
851
  traverseResult.parameters.push({
824
- paramIndex: c_expr.start.start,
825
- isNotNull: !context.propagatesNull
852
+ paramPos: c_expr.start.start,
853
+ isNotNull: !context.propagatesNull,
854
+ parameterNumber: Number(c_expr.PARAM().getText().slice(1)) //$1, $2...
826
855
  });
827
856
  return {
828
857
  column_name: c_expr.PARAM().getText(),
@@ -941,7 +970,7 @@ function traversec_expr_case(c_expr_case, context, traverseResult) {
941
970
  const elseIsNotNull = (elseResult === null || elseResult === void 0 ? void 0 : elseResult.is_nullable) === false || branchNotNull;
942
971
  const notNull = elseIsNotNull && whenIsNotNull;
943
972
  return {
944
- column_name: '?column?',
973
+ column_name: 'case',
945
974
  is_nullable: !notNull,
946
975
  table: '',
947
976
  schema: '',
@@ -1361,13 +1390,35 @@ function findColumnOrNull(fieldName, fromColumns) {
1361
1390
  const col = fromColumns.find(col => (fieldName.prefix === '' || col.table.toLowerCase() === fieldName.prefix.toLowerCase()) && col.column_name.toLowerCase() === fieldName.name.toLowerCase());
1362
1391
  return col;
1363
1392
  }
1393
+ function findRecordOrNull(fieldName, fromColumns) {
1394
+ const table = fromColumns.filter(col => col.table.toLowerCase() === fieldName.name.toLowerCase()
1395
+ || fieldName.name === '*' && col.table === fieldName.prefix);
1396
+ if (table.length === 0) {
1397
+ return null;
1398
+ }
1399
+ return Object.assign(Object.assign({}, table[0]), { recordTypes: table });
1400
+ }
1364
1401
  function fieldNameToString(fieldName) {
1365
1402
  return fieldName.prefix !== '' ? `${fieldName.prefix}.${fieldName.name}` : fieldName.name;
1366
1403
  }
1367
- function checkIsNullable(where_clause, field) {
1368
- const isNotNullResult = !field.is_nullable || isNotNull({ name: field.column_name, prefix: field.table }, where_clause);
1369
- const col = Object.assign(Object.assign({}, field), { is_nullable: !isNotNullResult });
1370
- return col;
1404
+ function checkIsNotNull(where_clause, field, fromColumns) {
1405
+ if (!field.is_nullable) {
1406
+ return true;
1407
+ }
1408
+ const fieldName = { name: field.column_name, prefix: field.table };
1409
+ const isNotNullExpr = isNotNull(fieldName, where_clause);
1410
+ if (!isNotNullExpr) {
1411
+ return false; //notNull: true
1412
+ }
1413
+ const col = findColumnOrNull(fieldName, fromColumns);
1414
+ if (col != null) {
1415
+ return true; //notNull: true
1416
+ }
1417
+ const record = findRecordOrNull({ name: fieldName.prefix, prefix: '' }, fromColumns);
1418
+ if (record != null) {
1419
+ return true; //notNull: true
1420
+ }
1421
+ return false;
1371
1422
  }
1372
1423
  function traverse_from_clause(from_clause, context, traverseResult) {
1373
1424
  const from_list = from_clause.from_list();
@@ -1381,11 +1432,17 @@ function traverse_from_clause(from_clause, context, traverseResult) {
1381
1432
  };
1382
1433
  }
1383
1434
  function traverse_from_list(from_list, context, traverseResult) {
1384
- const fromListResult = from_list.table_ref_list().map(table_ref => traverse_table_ref(table_ref, context, traverseResult));
1385
- const columns = fromListResult.flatMap(tableRes => tableRes.columns);
1435
+ const tableRefs = from_list.table_ref_list();
1436
+ const columns = [];
1437
+ let singleRow = false;
1438
+ for (const table_ref of tableRefs) {
1439
+ const result = traverse_table_ref(table_ref, Object.assign(Object.assign({}, context), { parentColumns: columns }), traverseResult);
1440
+ columns.push(...result.columns);
1441
+ singleRow = result.singleRow;
1442
+ }
1386
1443
  return {
1387
1444
  columns: columns,
1388
- singleRow: fromListResult.length === 1 ? fromListResult[0].singleRow : false
1445
+ singleRow: tableRefs.length === 1 ? singleRow : false
1389
1446
  };
1390
1447
  }
1391
1448
  function getFromColumns(tableName, withColumns, dbSchema) {
@@ -1508,7 +1565,7 @@ function traverse_joins(joinList, context, traverseResult) {
1508
1565
  collectNestedInfo(joinQual, joinColumns, traverseResult);
1509
1566
  }
1510
1567
  if (context.collectDynamicQueryInfo) {
1511
- const parameters = traverseResult.parameters.slice(numParamsBefore).map((_, index) => index + numParamsBefore);
1568
+ const parameters = getParametersIndexes(traverseResult.parameters.slice(numParamsBefore));
1512
1569
  collectDynamicQueryInfoTableRef(join.tableRef, joinType, joinQual, joinColumns, parameters, traverseResult);
1513
1570
  }
1514
1571
  });
@@ -1781,6 +1838,9 @@ function get_indiretion_text(indirection) {
1781
1838
  if (colLabel) {
1782
1839
  return get_colid_text(colLabel);
1783
1840
  }
1841
+ if (indirection_el_list[0].STAR()) {
1842
+ return '*';
1843
+ }
1784
1844
  }
1785
1845
  return '';
1786
1846
  }
@@ -2033,7 +2093,7 @@ function isNotNull_a_expr_in(a_expr_in, field) {
2033
2093
  }
2034
2094
  function isNotNull_a_expr_unary_not(a_expr_unary_not, field) {
2035
2095
  const a_expr_isnull = a_expr_unary_not.a_expr_isnull();
2036
- if (a_expr_isnull) {
2096
+ if (!a_expr_unary_not.NOT() && a_expr_isnull) {
2037
2097
  return isNotNull_a_expr_isnull(a_expr_isnull, field);
2038
2098
  }
2039
2099
  return false;
@@ -2172,7 +2232,9 @@ function isNotNull_c_expr(c_expr, field) {
2172
2232
  const columnref = c_expr.columnref();
2173
2233
  if (columnref) {
2174
2234
  const fieldName = getFieldName(columnref);
2175
- return (fieldName.name === field.name && (fieldName.prefix === '' || field.prefix === fieldName.prefix));
2235
+ const fieldIsNotNull = (fieldName.name === field.name && (fieldName.prefix === '' || field.prefix === fieldName.prefix));
2236
+ const tableIsNotNull = (fieldName.name === '*' && fieldName.prefix === field.prefix) || fieldName.name === field.prefix;
2237
+ return fieldIsNotNull || tableIsNotNull;
2176
2238
  }
2177
2239
  const aexprconst = c_expr.aexprconst();
2178
2240
  if (aexprconst) {