happy-sql 2.3.0 → 2.4.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 (106) hide show
  1. package/ChangeLog +60 -0
  2. package/bin/convert.js +3 -9
  3. package/lib/parser/visitors/clause/alter-table/alter-table.js +21 -0
  4. package/lib/parser/visitors/clause/binary.js +30 -6
  5. package/lib/parser/visitors/clause/column-definition/column-definition.js +49 -8
  6. package/lib/parser/visitors/clause/count/count.js +5 -2
  7. package/lib/parser/visitors/clause/create-extension/create-extension.js +7 -0
  8. package/lib/parser/visitors/clause/create-index/create-index.js +36 -5
  9. package/lib/parser/visitors/clause/create-schema/create-schema.js +7 -0
  10. package/lib/parser/visitors/clause/create-table/create-table.js +58 -7
  11. package/lib/parser/visitors/clause/create-view/create-view.js +17 -0
  12. package/lib/parser/visitors/clause/drop-index/drop-index.js +3 -0
  13. package/lib/parser/visitors/clause/drop-view/drop-view.js +15 -0
  14. package/lib/parser/visitors/clause/explain/explain.js +16 -0
  15. package/lib/parser/visitors/clause/from/from.js +93 -4
  16. package/lib/parser/visitors/clause/from/limit.js +13 -0
  17. package/lib/parser/visitors/clause/from/order-by.js +14 -3
  18. package/lib/parser/visitors/clause/from/table-func.js +5 -18
  19. package/lib/parser/visitors/clause/grant/grant.js +26 -0
  20. package/lib/parser/visitors/clause/index.js +50 -2
  21. package/lib/parser/visitors/clause/insert/insert.js +39 -5
  22. package/lib/parser/visitors/clause/operand.js +55 -1
  23. package/lib/parser/visitors/clause/pragma/pragma.js +52 -2
  24. package/lib/parser/visitors/clause/select/select.js +139 -6
  25. package/lib/parser/visitors/clause/set-param/set-param.js +19 -0
  26. package/lib/parser/visitors/clause/table-constraint.js +27 -0
  27. package/lib/parser/visitors/clause/update/update.js +17 -0
  28. package/lib/parser/visitors/clause/where/where.js +17 -0
  29. package/lib/printer/visitors/call-expression/clauses/access-method/access-method.js +4 -0
  30. package/lib/printer/visitors/call-expression/clauses/analyze/analyze.js +10 -0
  31. package/lib/printer/visitors/call-expression/clauses/array-type/array-type.js +4 -0
  32. package/lib/printer/visitors/call-expression/clauses/clauses.js +132 -2
  33. package/lib/printer/visitors/call-expression/clauses/collate/collate.js +7 -0
  34. package/lib/printer/visitors/call-expression/clauses/concurrently/concurrently.js +2 -0
  35. package/lib/printer/visitors/call-expression/clauses/constraint/constraint.js +11 -0
  36. package/lib/printer/visitors/call-expression/clauses/count-distinct/count-distinct.js +13 -0
  37. package/lib/printer/visitors/call-expression/clauses/create-extension/create-extension.js +4 -0
  38. package/lib/printer/visitors/call-expression/clauses/create-index/create-index.js +43 -9
  39. package/lib/printer/visitors/call-expression/clauses/create-index/create-unique-index.js +5 -19
  40. package/lib/printer/visitors/call-expression/clauses/create-materialized-view/create-materialized-view.js +8 -0
  41. package/lib/printer/visitors/call-expression/clauses/create-schema/create-schema.js +4 -0
  42. package/lib/printer/visitors/call-expression/clauses/create-table/create-table.js +16 -1
  43. package/lib/printer/visitors/call-expression/clauses/create-table-as/create-table-as.js +8 -0
  44. package/lib/printer/visitors/call-expression/clauses/create-temp-table/create-temp-table.js +11 -0
  45. package/lib/printer/visitors/call-expression/clauses/create-view/create-view.js +8 -0
  46. package/lib/printer/visitors/call-expression/clauses/create-virtual-table/create-virtual-table.js +8 -0
  47. package/lib/printer/visitors/call-expression/clauses/{nextval/nextval.js → default-nextval/default-nextval.js} +2 -1
  48. package/lib/printer/visitors/call-expression/clauses/default-values/default-values.js +3 -0
  49. package/lib/printer/visitors/call-expression/clauses/detach/detach.js +6 -0
  50. package/lib/printer/visitors/call-expression/clauses/distinct-on/distinct-on.js +14 -0
  51. package/lib/printer/visitors/call-expression/clauses/do-block/do-block.js +5 -0
  52. package/lib/printer/visitors/call-expression/clauses/drop-index/drop-index.js +13 -1
  53. package/lib/printer/visitors/call-expression/clauses/drop-view/drop-view.js +24 -0
  54. package/lib/printer/visitors/call-expression/clauses/explain/explain.js +4 -0
  55. package/lib/printer/visitors/call-expression/clauses/explain-analyze/explain-analyze.js +4 -0
  56. package/lib/printer/visitors/call-expression/clauses/explain-query-plan/explain-query-plan.js +4 -0
  57. package/lib/printer/visitors/call-expression/clauses/fetch-first/fetch-first.js +5 -0
  58. package/lib/printer/visitors/call-expression/clauses/filter/filter.js +8 -0
  59. package/lib/printer/visitors/call-expression/clauses/for-update/for-update.js +3 -0
  60. package/lib/printer/visitors/call-expression/clauses/from/from.js +34 -3
  61. package/lib/printer/visitors/call-expression/clauses/generated-always-as/generated-always-as.js +10 -0
  62. package/lib/printer/visitors/call-expression/clauses/grant/grant.js +10 -0
  63. package/lib/printer/visitors/call-expression/clauses/grant-on/grant-on.js +10 -0
  64. package/lib/printer/visitors/call-expression/clauses/if-not-exists/if-not-exists.js +2 -0
  65. package/lib/printer/visitors/call-expression/clauses/indexed-by/indexed-by.js +7 -0
  66. package/lib/printer/visitors/call-expression/clauses/into/into.js +30 -2
  67. package/lib/printer/visitors/call-expression/clauses/json-op.js +1 -0
  68. package/lib/printer/visitors/call-expression/clauses/lateral-join/lateral-join.js +26 -3
  69. package/lib/printer/visitors/call-expression/clauses/like/like.js +7 -0
  70. package/lib/printer/visitors/call-expression/clauses/limit-all/limit-all.js +3 -0
  71. package/lib/printer/visitors/call-expression/clauses/limit-clauses.js +4 -0
  72. package/lib/printer/visitors/call-expression/clauses/named-window/named-window.js +16 -0
  73. package/lib/printer/visitors/call-expression/clauses/not/not.js +4 -0
  74. package/lib/printer/visitors/call-expression/clauses/not-indexed/not-indexed.js +4 -0
  75. package/lib/printer/visitors/call-expression/clauses/nulls-order/nulls-order.js +9 -0
  76. package/lib/printer/visitors/call-expression/clauses/offset/offset.js +4 -0
  77. package/lib/printer/visitors/call-expression/clauses/on-conflict/on-conflict.js +16 -1
  78. package/lib/printer/visitors/call-expression/clauses/on-delete/on-delete.js +32 -0
  79. package/lib/printer/visitors/call-expression/clauses/or-abort/or-abort.js +3 -0
  80. package/lib/printer/visitors/call-expression/clauses/or-fail/or-fail.js +3 -0
  81. package/lib/printer/visitors/call-expression/clauses/over/over.js +12 -0
  82. package/lib/printer/visitors/call-expression/clauses/pragma/pragma.js +14 -5
  83. package/lib/printer/visitors/call-expression/clauses/privilege/privilege.js +10 -0
  84. package/lib/printer/visitors/call-expression/clauses/references/references.js +14 -4
  85. package/lib/printer/visitors/call-expression/clauses/reindex/reindex.js +10 -0
  86. package/lib/printer/visitors/call-expression/clauses/release-savepoint/release-savepoint.js +4 -0
  87. package/lib/printer/visitors/call-expression/clauses/rename-table/rename-table.js +4 -0
  88. package/lib/printer/visitors/call-expression/clauses/right-outer-join/right-outer-join.js +8 -0
  89. package/lib/printer/visitors/call-expression/clauses/row-level-security/row-level-security.js +7 -0
  90. package/lib/printer/visitors/call-expression/clauses/select/select.js +37 -9
  91. package/lib/printer/visitors/call-expression/clauses/set-param/set-param.js +14 -0
  92. package/lib/printer/visitors/call-expression/clauses/show-param/show-param.js +4 -0
  93. package/lib/printer/visitors/call-expression/clauses/table-primary-key/table-primary-key.js +13 -0
  94. package/lib/printer/visitors/call-expression/clauses/table-unique/table-unique.js +13 -0
  95. package/lib/printer/visitors/call-expression/clauses/to/to.js +10 -0
  96. package/lib/printer/visitors/call-expression/clauses/truncate/truncate.js +12 -0
  97. package/lib/printer/visitors/call-expression/clauses/unary-minus/unary-minus.js +4 -0
  98. package/lib/printer/visitors/call-expression/clauses/update/update.js +24 -3
  99. package/lib/printer/visitors/call-expression/clauses/using/using.js +13 -0
  100. package/lib/printer/visitors/call-expression/clauses/vacuum/vacuum.js +8 -1
  101. package/lib/printer/visitors/call-expression/clauses/window-frame/window-frame.js +38 -0
  102. package/lib/printer/visitors/call-expression/clauses/with-named/with-named.js +8 -20
  103. package/lib/printer/visitors/call-expression/clauses/without-rowid/without-rowid.js +1 -0
  104. package/lib/printer/visitors/member-expression.js +14 -0
  105. package/lib/printer/visitors/string-literal.js +9 -5
  106. package/package.json +9 -2
@@ -7,8 +7,18 @@ import {convertFrom} from '#parser/clause/from';
7
7
  import {convertCount, isCount} from '#parser/clause/count';
8
8
  import {convertCaseWhen} from '#parser/clause/case-when';
9
9
  import {convertBinary} from '#parser/clause/binary';
10
+ import {
11
+ convertCondition,
12
+ convertBetween,
13
+ } from '#parser/clause/where';
10
14
  import {findClause} from '#parser/clause/find';
11
15
  import {convertOrderBy} from '../from/order-by.js';
16
+ import {
17
+ convertLimit,
18
+ convertOffset,
19
+ convertFetch,
20
+ convertForUpdate,
21
+ } from '../from/limit.js';
12
22
 
13
23
  const isString = (a) => typeof a === 'string';
14
24
 
@@ -48,16 +58,29 @@ const convertExtract = (column) => {
48
58
  ]);
49
59
  };
50
60
 
61
+ const convertFilter = (column, fn) => {
62
+ if (!column.filter)
63
+ return fn;
64
+
65
+ const {where} = column.filter;
66
+ const condition = convertCondition(where.expr.expr);
67
+
68
+ return callExpression(identifier('filter'), [fn, condition]);
69
+ };
70
+
51
71
  const convertColumn = (column) => {
52
72
  if (isCount(column))
53
- return convertCount(column);
73
+ return convertOverIfPresent(column, convertFilter(column, convertCount(column)));
54
74
 
55
75
  if (column.type === 'func_call')
56
- return convertFuncCall(column);
76
+ return convertFilter(column, convertFuncCall(column));
57
77
 
58
78
  if (column.type === 'cast_expr')
59
79
  return convertCast(column);
60
80
 
81
+ if (column.type === 'cast_operator_expr')
82
+ return convertOperand(column);
83
+
61
84
  if (column.type === 'extract_expr')
62
85
  return convertExtract(column);
63
86
 
@@ -91,12 +114,63 @@ const convertColumn = (column) => {
91
114
  if (column.type === 'array_literal_expr')
92
115
  return convertOperand(column);
93
116
 
117
+ if (column.type === 'prefix_op_expr')
118
+ return convertOperand(column);
119
+
120
+ if (column.type === 'postfix_op_expr')
121
+ return convertCondition(column);
122
+
123
+ if (column.type === 'between_expr')
124
+ return convertBetween(column);
125
+
126
+ // quoted identifier like "weird col" — keep original text
127
+ if (isString(column.text) && column.text.startsWith('"'))
128
+ return stringLiteral(column.text);
129
+
94
130
  return identifier(column.name);
95
131
  };
96
132
 
133
+ const convertOverIfPresent = (column, fn) => {
134
+ if (!column.over)
135
+ return fn;
136
+
137
+ return convertOver(column, fn);
138
+ };
139
+
140
+ const isWindowRef = (over) => over.window.type === 'identifier';
141
+
142
+ const convertFrameBound = (bound) => {
143
+ if (bound.type === 'frame_bound_current_row')
144
+ return callExpression(identifier('currentRow'), []);
145
+
146
+ const name = bound.type === 'frame_bound_preceding' ? 'preceding' : 'following';
147
+
148
+ const isUnbounded = bound.expr?.type === 'frame_unbounded';
149
+ const args = !isUnbounded && bound.expr ? [
150
+ numericLiteral(bound.expr.value),
151
+ ] : [];
152
+
153
+ return callExpression(identifier(name), args);
154
+ };
155
+
156
+ const convertFrame = ({extent}) => callExpression(identifier('rowsBetween'), [
157
+ convertFrameBound(extent.begin),
158
+ convertFrameBound(extent.end),
159
+ ]);
160
+
97
161
  const convertOverClause = (over) => {
162
+ if (isWindowRef(over))
163
+ return [
164
+ identifier(over.window.name),
165
+ ];
166
+
98
167
  const result = [];
99
- const {partitionBy, orderBy} = over.window.expr;
168
+
169
+ const {
170
+ partitionBy,
171
+ orderBy,
172
+ frame,
173
+ } = over.window.expr;
100
174
 
101
175
  if (partitionBy)
102
176
  result.push(callExpression(identifier('partitionBy'), partitionBy.specifications.items.map(convertOperand)));
@@ -104,6 +178,9 @@ const convertOverClause = (over) => {
104
178
  if (orderBy)
105
179
  result.push(convertOrderBy(orderBy));
106
180
 
181
+ if (frame)
182
+ result.push(convertFrame(frame));
183
+
107
184
  return result;
108
185
  };
109
186
 
@@ -159,19 +236,57 @@ const convertColumns = (columns) => {
159
236
 
160
237
  const isDistinct = (selectClause) => selectClause.modifiers.some(({type}) => type === 'select_distinct');
161
238
 
239
+ const convertDistinctOn = ({modifiers}) => {
240
+ if (!modifiers.some(({type}) => type === 'select_distinct_on'))
241
+ return null;
242
+
243
+ const modifier = modifiers.find(({type}) => type === 'select_distinct_on');
244
+ const onCols = [];
245
+
246
+ for (const item of modifier.columns.expr.items) {
247
+ onCols.push(identifier(item.name));
248
+ }
249
+
250
+ return callExpression(identifier('distinctOn'), onCols);
251
+ };
252
+
253
+ const convertValuesRow = (node) => {
254
+ const {items} = node.expr;
255
+
256
+ return callExpression(identifier('row'), items.map(convertOperand));
257
+ };
258
+
259
+ const convertValuesClause = (clause) => callExpression(identifier('values'), clause.values.items.map(convertValuesRow));
260
+
162
261
  export const convertSelect = ({clauses}) => {
163
262
  const selectClause = findClause(clauses, 'select_clause');
263
+ const valuesClause = findClause(clauses, 'values_clause');
264
+
265
+ if (!selectClause && valuesClause)
266
+ return convertValuesClause(valuesClause);
267
+
164
268
  const fromClause = findClause(clauses, 'from_clause');
165
269
  const whereClause = findClause(clauses, 'where_clause');
166
270
  const groupByClause = findClause(clauses, 'group_by_clause');
167
271
  const havingClause = findClause(clauses, 'having_clause');
168
272
  const orderByClause = findClause(clauses, 'order_by_clause');
273
+ const windowClause = findClause(clauses, 'window_clause');
169
274
  const limitClause = findClause(clauses, 'limit_clause');
275
+ const offsetClause = findClause(clauses, 'offset_clause');
276
+ const fetchClause = findClause(clauses, 'fetch_clause');
277
+ const forClause = findClause(clauses, 'for_clause');
170
278
 
171
279
  const cols = convertColumns(selectClause.columns);
172
- const selectArgs = isDistinct(selectClause) ? [
173
- callExpression(identifier('distinct'), cols),
174
- ] : cols;
280
+ const distinctOn = convertDistinctOn(selectClause);
281
+ const selectArgs = [];
282
+
283
+ if (distinctOn)
284
+ selectArgs.push(distinctOn);
285
+
286
+ if (isDistinct(selectClause))
287
+ selectArgs.push(callExpression(identifier('distinct'), cols));
288
+ else
289
+ selectArgs.push(...cols);
175
290
 
176
291
  const args = [
177
292
  ...selectArgs,
@@ -181,9 +296,27 @@ export const convertSelect = ({clauses}) => {
181
296
  groupByClause,
182
297
  havingClause,
183
298
  orderByClause,
299
+ windowClause,
184
300
  limitClause,
301
+ offsetClause,
302
+ fetchClause,
303
+ forClause,
185
304
  }),
186
305
  ].filter(Boolean);
187
306
 
307
+ if (!fromClause) {
308
+ if (limitClause)
309
+ args.push(convertLimit(limitClause));
310
+
311
+ if (offsetClause)
312
+ args.push(convertOffset(offsetClause));
313
+
314
+ if (fetchClause)
315
+ args.push(convertFetch(fetchClause));
316
+
317
+ if (forClause)
318
+ args.push(convertForUpdate());
319
+ }
320
+
188
321
  return callExpression(identifier('select'), args);
189
322
  };
@@ -0,0 +1,19 @@
1
+ import {types} from '@putout/babel';
2
+ import {convertOperand} from '#parser/clause/operand';
3
+
4
+ const {identifier, callExpression} = types;
5
+
6
+ export const convertSetParam = (stmt) => {
7
+ const args = [
8
+ identifier(stmt.name.name),
9
+ ];
10
+
11
+ for (const item of stmt.value.items)
12
+ args.push(convertOperand(item));
13
+
14
+ return callExpression(identifier('setParam'), args);
15
+ };
16
+
17
+ export const convertShowParam = (stmt) => callExpression(identifier('showParam'), [
18
+ identifier(stmt.name.name),
19
+ ]);
@@ -0,0 +1,27 @@
1
+ import {types} from '@putout/babel';
2
+
3
+ const {identifier, callExpression} = types;
4
+
5
+ export const convertConstraintColumn = (item) => {
6
+ if (item.expr)
7
+ return identifier(item.expr.name);
8
+
9
+ return identifier(item.name);
10
+ };
11
+
12
+ const convertConstraintColumns = ({columns}) => columns.expr.items.map(convertConstraintColumn);
13
+
14
+ export const TABLE_CONSTRAINTS = {
15
+ constraint_primary_key: (item) => callExpression(identifier('tablePrimaryKey'), convertConstraintColumns(item)),
16
+ constraint_unique: (item) => callExpression(identifier('tableUnique'), convertConstraintColumns(item)),
17
+ };
18
+
19
+ export const convertTableConstraint = (item) => {
20
+ if (item.type === 'constraint')
21
+ return callExpression(identifier('constraint'), [
22
+ identifier(item.name.name.name),
23
+ convertTableConstraint(item.constraint),
24
+ ]);
25
+
26
+ return TABLE_CONSTRAINTS[item.type](item);
27
+ };
@@ -10,6 +10,20 @@ const {
10
10
  callExpression,
11
11
  } = types;
12
12
 
13
+ const OR_ACTION_MAP = {
14
+ REPLACE: () => callExpression(identifier('orReplace'), []),
15
+ IGNORE: () => callExpression(identifier('orIgnore'), []),
16
+ ABORT: () => callExpression(identifier('orAbort'), []),
17
+ FAIL: () => callExpression(identifier('orFail'), []),
18
+ };
19
+
20
+ const convertOrAction = (orAction) => {
21
+ if (!orAction)
22
+ return null;
23
+
24
+ return OR_ACTION_MAP[orAction.actionKw.name]();
25
+ };
26
+
13
27
  export const convertUpdate = ({clauses}) => {
14
28
  const updateClause = findClause(clauses, 'update_clause');
15
29
  const setClause = findClause(clauses, 'set_clause');
@@ -26,7 +40,10 @@ export const convertUpdate = ({clauses}) => {
26
40
 
27
41
  const setCall = callExpression(identifier('set'), setArgs);
28
42
 
43
+ const orAction = convertOrAction(updateClause.orAction);
44
+
29
45
  const args = [
46
+ orAction,
30
47
  table,
31
48
  setCall,
32
49
  fromClause && convertFromClause(fromClause),
@@ -31,6 +31,20 @@ const isExists = (node) => node.type === 'prefix_op_expr' && node.operator.name
31
31
  const isNotExists = (node) => node.type === 'prefix_op_expr' && node.operator.name === 'NOT' && isExists(node.expr);
32
32
  const isParenExpr = (node) => node.type === 'paren_expr';
33
33
 
34
+ const POSTFIX_OP = {
35
+ ISNULL: 'isNull',
36
+ NOTNULL: 'isNotNull',
37
+ };
38
+
39
+ const convertPostfix = (node) => {
40
+ const {name} = node.operator;
41
+ const fn = POSTFIX_OP[name];
42
+
43
+ return callExpression(identifier(fn), [
44
+ convertOperand(node.expr),
45
+ ]);
46
+ };
47
+
34
48
  export const convertCondition = (node) => {
35
49
  if (node.operator && node.operator.name === 'AND')
36
50
  return convertAnd(node);
@@ -41,6 +55,9 @@ export const convertCondition = (node) => {
41
55
  if (node.type === 'between_expr')
42
56
  return convertBetween(node);
43
57
 
58
+ if (node.type === 'postfix_op_expr')
59
+ return convertPostfix(node);
60
+
44
61
  if (isNotExists(node))
45
62
  return callExpression(identifier('notExists'), [
46
63
  convertClause(node.expr.expr.expr),
@@ -0,0 +1,4 @@
1
+ export const accessMethod = (path, {write, traverse}) => {
2
+ write('USING ');
3
+ traverse(path.get('arguments.0'));
4
+ };
@@ -0,0 +1,10 @@
1
+ export const analyze = (path, {write, traverse}) => {
2
+ const args = path.get('arguments');
3
+
4
+ write('ANALYZE');
5
+
6
+ if (args.length) {
7
+ write.space();
8
+ traverse(args[0]);
9
+ }
10
+ };
@@ -0,0 +1,4 @@
1
+ export const arrayType = (path, {write, traverse}) => {
2
+ traverse(path.get('arguments')[0]);
3
+ write('[]');
4
+ };
@@ -36,7 +36,9 @@ import {max} from './max/max.js';
36
36
  import {orderBy} from './order-by/order-by.js';
37
37
  import {desc} from './desc/desc.js';
38
38
  import {limit} from './limit/limit.js';
39
+ import {namedWindow} from './named-window/named-window.js';
39
40
  import {distinct} from './distinct/distinct.js';
41
+ import {distinctOn} from './distinct-on/distinct-on.js';
40
42
  import {notInList} from './not-in-list/not-in-list.js';
41
43
  import {between} from './between/between.js';
42
44
  import {notBetween} from './not-between/not-between.js';
@@ -52,7 +54,31 @@ import {lateralJoin} from './lateral-join/lateral-join.js';
52
54
  import {lateralSubquery} from './lateral-subquery/lateral-subquery.js';
53
55
  import {createIndex} from './create-index/create-index.js';
54
56
  import {createUniqueIndex} from './create-index/create-unique-index.js';
57
+ import {concurrently} from './concurrently/concurrently.js';
58
+ import {ifNotExists} from './if-not-exists/if-not-exists.js';
59
+ import {explain} from './explain/explain.js';
60
+ import {explainAnalyze} from './explain-analyze/explain-analyze.js';
61
+ import {explainQueryPlan} from './explain-query-plan/explain-query-plan.js';
62
+ import {setParam} from './set-param/set-param.js';
63
+ import {showParam} from './show-param/show-param.js';
64
+ import {createView} from './create-view/create-view.js';
65
+ import {createMaterializedView} from './create-materialized-view/create-materialized-view.js';
66
+ import {dropView} from './drop-view/drop-view.js';
67
+ import {createExtension} from './create-extension/create-extension.js';
68
+ import {createSchema} from './create-schema/create-schema.js';
69
+ import {grant} from './grant/grant.js';
70
+ import {privilege} from './privilege/privilege.js';
71
+ import {grantOn} from './grant-on/grant-on.js';
72
+ import {to} from './to/to.js';
73
+ import {indexedBy} from './indexed-by/indexed-by.js';
74
+ import {notIndexed} from './not-indexed/not-indexed.js';
75
+ import {createVirtualTable} from './create-virtual-table/create-virtual-table.js';
76
+ import {reindex} from './reindex/reindex.js';
77
+ import {analyze} from './analyze/analyze.js';
78
+ import {releaseSavepoint} from './release-savepoint/release-savepoint.js';
79
+ import {doBlock} from './do-block/do-block.js';
55
80
  import {vacuum} from './vacuum/vacuum.js';
81
+ import {truncate} from './truncate/truncate.js';
56
82
  import {row} from './row/row.js';
57
83
  import {notNull} from './not-null/not-null.js';
58
84
  import {default_} from './default/default.js';
@@ -65,8 +91,21 @@ import {leftJoin} from './left-join/left-join.js';
65
91
  import {rightJoin} from './right-join/right-join.js';
66
92
  import {innerJoin} from './inner-join/inner-join.js';
67
93
  import {leftOuterJoin} from './left-outer-join/left-outer-join.js';
94
+ import {rightOuterJoin} from './right-outer-join/right-outer-join.js';
68
95
  import {crossJoin} from './cross-join/cross-join.js';
69
96
  import {createTable} from './create-table/create-table.js';
97
+ import {
98
+ limitAll,
99
+ offset,
100
+ fetchFirst,
101
+ forUpdate,
102
+ } from './limit-clauses.js';
103
+ import {
104
+ createTempTable,
105
+ createTempTableIfNotExists,
106
+ } from './create-temp-table/create-temp-table.js';
107
+ import {withoutRowid} from './without-rowid/without-rowid.js';
108
+ import {createTableAs} from './create-table-as/create-table-as.js';
70
109
  import {alterTable} from './alter-table/alter-table.js';
71
110
  import {addColumn} from './add-column/add-column.js';
72
111
  import {dropColumn} from './drop-column/drop-column.js';
@@ -80,6 +119,7 @@ import {savepoint} from './savepoint/savepoint.js';
80
119
  import {createSequence} from './create-sequence/create-sequence.js';
81
120
  import {extract} from './extract/extract.js';
82
121
  import {concat} from './concat/concat.js';
122
+ import {filter} from './filter/filter.js';
83
123
  import {array} from './array/array.js';
84
124
  import {over} from './over/over.js';
85
125
  import {partitionBy} from './partition-by/partition-by.js';
@@ -88,13 +128,14 @@ import {dropTable} from './drop-table/drop-table.js';
88
128
  import {dropIndex} from './drop-index/drop-index.js';
89
129
  import {pragma} from './pragma/pragma.js';
90
130
  import {attach} from './attach/attach.js';
131
+ import {detach} from './detach/detach.js';
91
132
  import {column} from './column/column.js';
92
133
  import {autoIncrement} from './auto-increment/auto-increment.js';
93
134
  import {serial} from './serial/serial.js';
94
135
  import {primaryKey} from './primary-key/primary-key.js';
95
136
  import {lastInsertRowid} from './last-insert-rowid/last-insert-rowid.js';
96
137
  import {lastval} from './lastval/lastval.js';
97
- import {nextval} from './nextval/nextval.js';
138
+ import {defaultNextval} from './default-nextval/default-nextval.js';
98
139
  import {like} from './like/like.js';
99
140
  import {isNull, isNotNull} from './is-null/is-null.js';
100
141
  import {orReplace} from './or-replace/or-replace.js';
@@ -104,6 +145,33 @@ import {
104
145
  identity,
105
146
  identityByDefault,
106
147
  } from './identity/identity.js';
148
+ import {not} from './not/not.js';
149
+ import {unaryMinus} from './unary-minus/unary-minus.js';
150
+ import {arrayType} from './array-type/array-type.js';
151
+ import {using} from './using/using.js';
152
+ import {defaultValues} from './default-values/default-values.js';
153
+ import {tablePrimaryKey} from './table-primary-key/table-primary-key.js';
154
+ import {tableUnique} from './table-unique/table-unique.js';
155
+ import {constraint} from './constraint/constraint.js';
156
+ import {renameTable} from './rename-table/rename-table.js';
157
+ import {
158
+ enableRowLevelSecurity,
159
+ disableRowLevelSecurity,
160
+ } from './row-level-security/row-level-security.js';
161
+ import {nullsFirst, nullsLast} from './nulls-order/nulls-order.js';
162
+ import {orAbort} from './or-abort/or-abort.js';
163
+ import {orFail} from './or-fail/or-fail.js';
164
+ import {countDistinct} from './count-distinct/count-distinct.js';
165
+ import {generatedAlwaysAs} from './generated-always-as/generated-always-as.js';
166
+ import {accessMethod} from './access-method/access-method.js';
167
+ import {onDelete, onUpdate} from './on-delete/on-delete.js';
168
+ import {collate} from './collate/collate.js';
169
+ import {
170
+ rowsBetween,
171
+ preceding,
172
+ following,
173
+ currentRow,
174
+ } from './window-frame/window-frame.js';
107
175
 
108
176
  export const clauses = {
109
177
  join,
@@ -124,7 +192,31 @@ export const clauses = {
124
192
  lateralSubquery,
125
193
  createIndex,
126
194
  createUniqueIndex,
195
+ concurrently,
196
+ ifNotExists,
197
+ explain,
198
+ explainAnalyze,
199
+ explainQueryPlan,
200
+ setParam,
201
+ showParam,
202
+ createView,
203
+ createMaterializedView,
204
+ dropView,
205
+ createExtension,
206
+ createSchema,
207
+ grant,
208
+ privilege,
209
+ grantOn,
210
+ to,
211
+ indexedBy,
212
+ notIndexed,
213
+ createVirtualTable,
214
+ reindex,
215
+ analyze,
216
+ releaseSavepoint,
217
+ doBlock,
127
218
  vacuum,
219
+ truncate,
128
220
  row,
129
221
  notNull,
130
222
  default_,
@@ -155,7 +247,13 @@ export const clauses = {
155
247
  orderBy,
156
248
  desc,
157
249
  limit,
250
+ limitAll,
251
+ offset,
252
+ fetchFirst,
253
+ forUpdate,
254
+ namedWindow,
158
255
  distinct,
256
+ distinctOn,
159
257
  notInList,
160
258
  notBetween,
161
259
  between,
@@ -169,10 +267,15 @@ export const clauses = {
169
267
  rightJoin,
170
268
  innerJoin,
171
269
  leftOuterJoin,
270
+ rightOuterJoin,
172
271
  fullOuterJoin,
173
272
  naturalJoin,
174
273
  crossJoin,
175
274
  createTable,
275
+ createTempTable,
276
+ createTempTableIfNotExists,
277
+ withoutRowid,
278
+ createTableAs,
176
279
  alterTable,
177
280
  addColumn,
178
281
  dropColumn,
@@ -186,6 +289,7 @@ export const clauses = {
186
289
  createSequence,
187
290
  extract,
188
291
  concat,
292
+ filter,
189
293
  array,
190
294
  over,
191
295
  partitionBy,
@@ -194,21 +298,47 @@ export const clauses = {
194
298
  dropIndex,
195
299
  pragma,
196
300
  attach,
301
+ detach,
197
302
  column,
198
303
  autoIncrement,
199
304
  serial,
200
305
  primaryKey,
201
306
  lastInsertRowid,
202
307
  lastval,
203
- nextval,
308
+ defaultNextval,
204
309
  like,
205
310
  notLike,
206
311
  ilike,
207
312
  similarTo,
208
313
  isDistinctFrom,
314
+ collate,
209
315
  isNull,
210
316
  isNotNull,
211
317
  inList,
212
318
  identity,
213
319
  identityByDefault,
320
+ not,
321
+ unaryMinus,
322
+ arrayType,
323
+ using,
324
+ defaultValues,
325
+ tablePrimaryKey,
326
+ tableUnique,
327
+ constraint,
328
+ renameTable,
329
+ enableRowLevelSecurity,
330
+ disableRowLevelSecurity,
331
+ nullsFirst,
332
+ nullsLast,
333
+ orAbort,
334
+ orFail,
335
+ countDistinct,
336
+ generatedAlwaysAs,
337
+ accessMethod,
338
+ onDelete,
339
+ onUpdate,
340
+ rowsBetween,
341
+ preceding,
342
+ following,
343
+ currentRow,
214
344
  };
@@ -0,0 +1,7 @@
1
+ export const collate = (path, {write, traverse}) => {
2
+ const [left, right] = path.get('arguments');
3
+
4
+ traverse(left);
5
+ write(' COLLATE ');
6
+ traverse(right);
7
+ };
@@ -0,0 +1,2 @@
1
+ // sentinel — consumed by createIndex/createUniqueIndex printer, never called
2
+ export const concurrently = null;
@@ -0,0 +1,11 @@
1
+ export const constraint = (path, {write, traverse}) => {
2
+ write('CONSTRAINT ');
3
+ const args = path.get('arguments');
4
+
5
+ for (const [i, arg] of args.entries()) {
6
+ if (i)
7
+ write(' ');
8
+
9
+ traverse(arg);
10
+ }
11
+ };
@@ -0,0 +1,13 @@
1
+ export const countDistinct = (path, {write, traverse}) => {
2
+ write('COUNT(DISTINCT ');
3
+ const args = path.get('arguments');
4
+
5
+ for (const [i, arg] of args.entries()) {
6
+ if (i)
7
+ write(', ');
8
+
9
+ traverse(arg);
10
+ }
11
+
12
+ write(')');
13
+ };
@@ -0,0 +1,4 @@
1
+ export const createExtension = (path, {write, traverse}) => {
2
+ write('CREATE EXTENSION ');
3
+ traverse(path.get('arguments')[0]);
4
+ };