happy-sql 2.3.0 → 2.4.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.
Files changed (112) hide show
  1. package/ChangeLog +88 -0
  2. package/bin/convert.js +3 -9
  3. package/lib/parser/parser.js +11 -11
  4. package/lib/parser/visitors/clause/alter-table/alter-table.js +24 -0
  5. package/lib/parser/visitors/clause/binary.js +31 -7
  6. package/lib/parser/visitors/clause/column-definition/column-definition.js +62 -8
  7. package/lib/parser/visitors/clause/count/count.js +5 -2
  8. package/lib/parser/visitors/clause/create-extension/create-extension.js +7 -0
  9. package/lib/parser/visitors/clause/create-index/create-index.js +36 -5
  10. package/lib/parser/visitors/clause/create-schema/create-schema.js +7 -0
  11. package/lib/parser/visitors/clause/create-table/create-table.js +63 -7
  12. package/lib/parser/visitors/clause/create-view/create-view.js +18 -0
  13. package/lib/parser/visitors/clause/drop-index/drop-index.js +3 -0
  14. package/lib/parser/visitors/clause/drop-view/drop-view.js +15 -0
  15. package/lib/parser/visitors/clause/explain/explain.js +16 -0
  16. package/lib/parser/visitors/clause/from/from.js +109 -13
  17. package/lib/parser/visitors/clause/from/group-by.js +8 -1
  18. package/lib/parser/visitors/clause/from/limit.js +13 -0
  19. package/lib/parser/visitors/clause/from/order-by.js +15 -3
  20. package/lib/parser/visitors/clause/from/table-func.js +10 -14
  21. package/lib/parser/visitors/clause/grant/grant.js +26 -0
  22. package/lib/parser/visitors/clause/index.js +66 -2
  23. package/lib/parser/visitors/clause/insert/insert.js +81 -9
  24. package/lib/parser/visitors/clause/operand.js +55 -1
  25. package/lib/parser/visitors/clause/pragma/pragma.js +52 -2
  26. package/lib/parser/visitors/clause/select/select.js +149 -9
  27. package/lib/parser/visitors/clause/set-param/set-param.js +19 -0
  28. package/lib/parser/visitors/clause/table-constraint.js +27 -0
  29. package/lib/parser/visitors/clause/update/update.js +17 -0
  30. package/lib/parser/visitors/clause/where/where.js +17 -0
  31. package/lib/parser/visitors/clause/with-named/with-named.js +15 -1
  32. package/lib/printer/visitors/call-expression/clauses/access-method/access-method.js +4 -0
  33. package/lib/printer/visitors/call-expression/clauses/add-constraint/add-constraint.js +4 -0
  34. package/lib/printer/visitors/call-expression/clauses/analyze/analyze.js +10 -0
  35. package/lib/printer/visitors/call-expression/clauses/array-type/array-type.js +4 -0
  36. package/lib/printer/visitors/call-expression/clauses/clauses.js +134 -2
  37. package/lib/printer/visitors/call-expression/clauses/collate/collate.js +7 -0
  38. package/lib/printer/visitors/call-expression/clauses/concurrently/concurrently.js +2 -0
  39. package/lib/printer/visitors/call-expression/clauses/constraint/constraint.js +11 -0
  40. package/lib/printer/visitors/call-expression/clauses/count-distinct/count-distinct.js +13 -0
  41. package/lib/printer/visitors/call-expression/clauses/create-extension/create-extension.js +4 -0
  42. package/lib/printer/visitors/call-expression/clauses/create-index/create-index.js +43 -9
  43. package/lib/printer/visitors/call-expression/clauses/create-index/create-unique-index.js +5 -19
  44. package/lib/printer/visitors/call-expression/clauses/create-materialized-view/create-materialized-view.js +8 -0
  45. package/lib/printer/visitors/call-expression/clauses/create-schema/create-schema.js +4 -0
  46. package/lib/printer/visitors/call-expression/clauses/create-table/create-table.js +16 -1
  47. package/lib/printer/visitors/call-expression/clauses/create-table-as/create-table-as.js +8 -0
  48. package/lib/printer/visitors/call-expression/clauses/create-temp-table/create-temp-table.js +11 -0
  49. package/lib/printer/visitors/call-expression/clauses/create-view/create-view.js +8 -0
  50. package/lib/printer/visitors/call-expression/clauses/create-virtual-table/create-virtual-table.js +8 -0
  51. package/lib/printer/visitors/call-expression/clauses/{nextval/nextval.js → default-nextval/default-nextval.js} +2 -1
  52. package/lib/printer/visitors/call-expression/clauses/default-values/default-values.js +3 -0
  53. package/lib/printer/visitors/call-expression/clauses/detach/detach.js +6 -0
  54. package/lib/printer/visitors/call-expression/clauses/distinct-on/distinct-on.js +14 -0
  55. package/lib/printer/visitors/call-expression/clauses/do-block/do-block.js +5 -0
  56. package/lib/printer/visitors/call-expression/clauses/drop-index/drop-index.js +13 -1
  57. package/lib/printer/visitors/call-expression/clauses/drop-view/drop-view.js +24 -0
  58. package/lib/printer/visitors/call-expression/clauses/explain/explain.js +4 -0
  59. package/lib/printer/visitors/call-expression/clauses/explain-analyze/explain-analyze.js +4 -0
  60. package/lib/printer/visitors/call-expression/clauses/explain-query-plan/explain-query-plan.js +4 -0
  61. package/lib/printer/visitors/call-expression/clauses/fetch-first/fetch-first.js +5 -0
  62. package/lib/printer/visitors/call-expression/clauses/filter/filter.js +8 -0
  63. package/lib/printer/visitors/call-expression/clauses/for-update/for-update.js +3 -0
  64. package/lib/printer/visitors/call-expression/clauses/from/from.js +49 -5
  65. package/lib/printer/visitors/call-expression/clauses/generated-always-as/generated-always-as.js +10 -0
  66. package/lib/printer/visitors/call-expression/clauses/grant/grant.js +10 -0
  67. package/lib/printer/visitors/call-expression/clauses/grant-on/grant-on.js +10 -0
  68. package/lib/printer/visitors/call-expression/clauses/if-not-exists/if-not-exists.js +2 -0
  69. package/lib/printer/visitors/call-expression/clauses/indexed-by/indexed-by.js +7 -0
  70. package/lib/printer/visitors/call-expression/clauses/into/into.js +34 -3
  71. package/lib/printer/visitors/call-expression/clauses/json-op.js +9 -1
  72. package/lib/printer/visitors/call-expression/clauses/lateral-join/lateral-join.js +26 -3
  73. package/lib/printer/visitors/call-expression/clauses/like/like.js +7 -0
  74. package/lib/printer/visitors/call-expression/clauses/limit-all/limit-all.js +3 -0
  75. package/lib/printer/visitors/call-expression/clauses/limit-clauses.js +4 -0
  76. package/lib/printer/visitors/call-expression/clauses/named-window/named-window.js +16 -0
  77. package/lib/printer/visitors/call-expression/clauses/not/not.js +4 -0
  78. package/lib/printer/visitors/call-expression/clauses/not-indexed/not-indexed.js +4 -0
  79. package/lib/printer/visitors/call-expression/clauses/nulls-order/nulls-order.js +9 -0
  80. package/lib/printer/visitors/call-expression/clauses/offset/offset.js +4 -0
  81. package/lib/printer/visitors/call-expression/clauses/on-conflict/on-conflict.js +24 -2
  82. package/lib/printer/visitors/call-expression/clauses/on-delete/on-delete.js +32 -0
  83. package/lib/printer/visitors/call-expression/clauses/or-abort/or-abort.js +3 -0
  84. package/lib/printer/visitors/call-expression/clauses/or-fail/or-fail.js +3 -0
  85. package/lib/printer/visitors/call-expression/clauses/over/over.js +12 -0
  86. package/lib/printer/visitors/call-expression/clauses/pragma/pragma.js +14 -5
  87. package/lib/printer/visitors/call-expression/clauses/privilege/privilege.js +10 -0
  88. package/lib/printer/visitors/call-expression/clauses/references/references.js +26 -4
  89. package/lib/printer/visitors/call-expression/clauses/reindex/reindex.js +10 -0
  90. package/lib/printer/visitors/call-expression/clauses/release-savepoint/release-savepoint.js +4 -0
  91. package/lib/printer/visitors/call-expression/clauses/rename-table/rename-table.js +4 -0
  92. package/lib/printer/visitors/call-expression/clauses/right-outer-join/right-outer-join.js +8 -0
  93. package/lib/printer/visitors/call-expression/clauses/row-level-security/row-level-security.js +7 -0
  94. package/lib/printer/visitors/call-expression/clauses/section/section.js +5 -1
  95. package/lib/printer/visitors/call-expression/clauses/select/select.js +37 -9
  96. package/lib/printer/visitors/call-expression/clauses/set-param/set-param.js +14 -0
  97. package/lib/printer/visitors/call-expression/clauses/show-param/show-param.js +4 -0
  98. package/lib/printer/visitors/call-expression/clauses/table-primary-key/table-primary-key.js +13 -0
  99. package/lib/printer/visitors/call-expression/clauses/table-unique/table-unique.js +13 -0
  100. package/lib/printer/visitors/call-expression/clauses/to/to.js +10 -0
  101. package/lib/printer/visitors/call-expression/clauses/truncate/truncate.js +12 -0
  102. package/lib/printer/visitors/call-expression/clauses/unary-minus/unary-minus.js +4 -0
  103. package/lib/printer/visitors/call-expression/clauses/update/update.js +24 -3
  104. package/lib/printer/visitors/call-expression/clauses/using/using.js +13 -0
  105. package/lib/printer/visitors/call-expression/clauses/vacuum/vacuum.js +8 -1
  106. package/lib/printer/visitors/call-expression/clauses/window-frame/window-frame.js +38 -0
  107. package/lib/printer/visitors/call-expression/clauses/with-named/with-named.js +8 -20
  108. package/lib/printer/visitors/call-expression/clauses/without-rowid/without-rowid.js +1 -0
  109. package/lib/printer/visitors/logical-expression.js +4 -1
  110. package/lib/printer/visitors/member-expression.js +14 -0
  111. package/lib/printer/visitors/string-literal.js +9 -5
  112. package/package.json +11 -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,10 +91,24 @@ 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';
111
+ import {addConstraint} from './add-constraint/add-constraint.js';
72
112
  import {dropColumn} from './drop-column/drop-column.js';
73
113
  import {renameColumn} from './rename-column/rename-column.js';
74
114
  import {alterColumnType} from './alter-column-type/alter-column-type.js';
@@ -80,6 +120,7 @@ import {savepoint} from './savepoint/savepoint.js';
80
120
  import {createSequence} from './create-sequence/create-sequence.js';
81
121
  import {extract} from './extract/extract.js';
82
122
  import {concat} from './concat/concat.js';
123
+ import {filter} from './filter/filter.js';
83
124
  import {array} from './array/array.js';
84
125
  import {over} from './over/over.js';
85
126
  import {partitionBy} from './partition-by/partition-by.js';
@@ -88,13 +129,14 @@ import {dropTable} from './drop-table/drop-table.js';
88
129
  import {dropIndex} from './drop-index/drop-index.js';
89
130
  import {pragma} from './pragma/pragma.js';
90
131
  import {attach} from './attach/attach.js';
132
+ import {detach} from './detach/detach.js';
91
133
  import {column} from './column/column.js';
92
134
  import {autoIncrement} from './auto-increment/auto-increment.js';
93
135
  import {serial} from './serial/serial.js';
94
136
  import {primaryKey} from './primary-key/primary-key.js';
95
137
  import {lastInsertRowid} from './last-insert-rowid/last-insert-rowid.js';
96
138
  import {lastval} from './lastval/lastval.js';
97
- import {nextval} from './nextval/nextval.js';
139
+ import {defaultNextval} from './default-nextval/default-nextval.js';
98
140
  import {like} from './like/like.js';
99
141
  import {isNull, isNotNull} from './is-null/is-null.js';
100
142
  import {orReplace} from './or-replace/or-replace.js';
@@ -104,6 +146,33 @@ import {
104
146
  identity,
105
147
  identityByDefault,
106
148
  } from './identity/identity.js';
149
+ import {not} from './not/not.js';
150
+ import {unaryMinus} from './unary-minus/unary-minus.js';
151
+ import {arrayType} from './array-type/array-type.js';
152
+ import {using} from './using/using.js';
153
+ import {defaultValues} from './default-values/default-values.js';
154
+ import {tablePrimaryKey} from './table-primary-key/table-primary-key.js';
155
+ import {tableUnique} from './table-unique/table-unique.js';
156
+ import {constraint} from './constraint/constraint.js';
157
+ import {renameTable} from './rename-table/rename-table.js';
158
+ import {
159
+ enableRowLevelSecurity,
160
+ disableRowLevelSecurity,
161
+ } from './row-level-security/row-level-security.js';
162
+ import {nullsFirst, nullsLast} from './nulls-order/nulls-order.js';
163
+ import {orAbort} from './or-abort/or-abort.js';
164
+ import {orFail} from './or-fail/or-fail.js';
165
+ import {countDistinct} from './count-distinct/count-distinct.js';
166
+ import {generatedAlwaysAs} from './generated-always-as/generated-always-as.js';
167
+ import {accessMethod} from './access-method/access-method.js';
168
+ import {onDelete, onUpdate} from './on-delete/on-delete.js';
169
+ import {collate} from './collate/collate.js';
170
+ import {
171
+ rowsBetween,
172
+ preceding,
173
+ following,
174
+ currentRow,
175
+ } from './window-frame/window-frame.js';
107
176
 
108
177
  export const clauses = {
109
178
  join,
@@ -124,7 +193,31 @@ export const clauses = {
124
193
  lateralSubquery,
125
194
  createIndex,
126
195
  createUniqueIndex,
196
+ concurrently,
197
+ ifNotExists,
198
+ explain,
199
+ explainAnalyze,
200
+ explainQueryPlan,
201
+ setParam,
202
+ showParam,
203
+ createView,
204
+ createMaterializedView,
205
+ dropView,
206
+ createExtension,
207
+ createSchema,
208
+ grant,
209
+ privilege,
210
+ grantOn,
211
+ to,
212
+ indexedBy,
213
+ notIndexed,
214
+ createVirtualTable,
215
+ reindex,
216
+ analyze,
217
+ releaseSavepoint,
218
+ doBlock,
127
219
  vacuum,
220
+ truncate,
128
221
  row,
129
222
  notNull,
130
223
  default_,
@@ -155,7 +248,13 @@ export const clauses = {
155
248
  orderBy,
156
249
  desc,
157
250
  limit,
251
+ limitAll,
252
+ offset,
253
+ fetchFirst,
254
+ forUpdate,
255
+ namedWindow,
158
256
  distinct,
257
+ distinctOn,
159
258
  notInList,
160
259
  notBetween,
161
260
  between,
@@ -169,12 +268,18 @@ export const clauses = {
169
268
  rightJoin,
170
269
  innerJoin,
171
270
  leftOuterJoin,
271
+ rightOuterJoin,
172
272
  fullOuterJoin,
173
273
  naturalJoin,
174
274
  crossJoin,
175
275
  createTable,
276
+ createTempTable,
277
+ createTempTableIfNotExists,
278
+ withoutRowid,
279
+ createTableAs,
176
280
  alterTable,
177
281
  addColumn,
282
+ addConstraint,
178
283
  dropColumn,
179
284
  renameColumn,
180
285
  alterColumnType,
@@ -186,6 +291,7 @@ export const clauses = {
186
291
  createSequence,
187
292
  extract,
188
293
  concat,
294
+ filter,
189
295
  array,
190
296
  over,
191
297
  partitionBy,
@@ -194,21 +300,47 @@ export const clauses = {
194
300
  dropIndex,
195
301
  pragma,
196
302
  attach,
303
+ detach,
197
304
  column,
198
305
  autoIncrement,
199
306
  serial,
200
307
  primaryKey,
201
308
  lastInsertRowid,
202
309
  lastval,
203
- nextval,
310
+ defaultNextval,
204
311
  like,
205
312
  notLike,
206
313
  ilike,
207
314
  similarTo,
208
315
  isDistinctFrom,
316
+ collate,
209
317
  isNull,
210
318
  isNotNull,
211
319
  inList,
212
320
  identity,
213
321
  identityByDefault,
322
+ not,
323
+ unaryMinus,
324
+ arrayType,
325
+ using,
326
+ defaultValues,
327
+ tablePrimaryKey,
328
+ tableUnique,
329
+ constraint,
330
+ renameTable,
331
+ enableRowLevelSecurity,
332
+ disableRowLevelSecurity,
333
+ nullsFirst,
334
+ nullsLast,
335
+ orAbort,
336
+ orFail,
337
+ countDistinct,
338
+ generatedAlwaysAs,
339
+ accessMethod,
340
+ onDelete,
341
+ onUpdate,
342
+ rowsBetween,
343
+ preceding,
344
+ following,
345
+ currentRow,
214
346
  };
@@ -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
+ };
@@ -1,20 +1,54 @@
1
- export const createIndex = (path, {write, traverse}) => {
2
- const args = path.get('arguments');
1
+ import {types} from '@putout/babel';
2
+
3
+ const {isCallExpression} = types;
4
+
5
+ const isConcurrently = (arg) => isCallExpression(arg.node) && arg.node.callee.name === 'concurrently';
6
+ const isIfNotExists = (arg) => isCallExpression(arg.node) && arg.node.callee.name === 'ifNotExists';
7
+ const isWhere = (arg) => isCallExpression(arg.node) && arg.node.callee.name === 'where';
8
+ const isAccessMethod = (arg) => isCallExpression(arg.node) && arg.node.callee.name === 'accessMethod';
9
+ const isCol = (arg) => !isConcurrently(arg) && !isIfNotExists(arg) && !isWhere(arg) && !isAccessMethod(arg);
10
+
11
+ export const printIndexBody = (path, {write, traverse}) => {
12
+ const [name, table, ...rest] = path.get('arguments');
13
+ const cols = rest.filter(isCol);
14
+ const hasIfNotExists = rest.some(isIfNotExists);
15
+ const hasConcurrently = rest.some(isConcurrently);
16
+ const whereArg = rest.find(isWhere);
17
+ const accessMethod = rest.find(isAccessMethod);
3
18
 
4
- write('CREATE INDEX ');
5
- traverse(args[0]);
19
+ if (hasIfNotExists)
20
+ write('IF NOT EXISTS ');
21
+
22
+ if (hasConcurrently)
23
+ write('CONCURRENTLY ');
24
+
25
+ traverse(name);
6
26
  write(' ON ');
7
- traverse(args[1]);
27
+ traverse(table);
28
+
29
+ if (accessMethod) {
30
+ write(' USING ');
31
+ traverse(accessMethod.get('arguments.0'));
32
+ }
33
+
8
34
  write(' (');
9
35
 
10
- for (const [i, arg] of args
11
- .slice(2)
12
- .entries()) {
36
+ for (const [i, col] of cols.entries()) {
13
37
  if (i > 0)
14
38
  write(', ');
15
39
 
16
- traverse(arg);
40
+ traverse(col);
17
41
  }
18
42
 
19
43
  write(')');
44
+
45
+ if (whereArg) {
46
+ write.newline();
47
+ traverse(whereArg);
48
+ }
49
+ };
50
+
51
+ export const createIndex = (path, printer) => {
52
+ printer.write('CREATE INDEX ');
53
+ printIndexBody(path, printer);
20
54
  };
@@ -1,20 +1,6 @@
1
- export const createUniqueIndex = (path, {write, traverse}) => {
2
- const args = path.get('arguments');
3
-
4
- write('CREATE UNIQUE INDEX ');
5
- traverse(args[0]);
6
- write(' ON ');
7
- traverse(args[1]);
8
- write(' (');
9
-
10
- for (const [i, arg] of args
11
- .slice(2)
12
- .entries()) {
13
- if (i > 0)
14
- write(', ');
15
-
16
- traverse(arg);
17
- }
18
-
19
- write(')');
1
+ import {printIndexBody} from './create-index.js';
2
+
3
+ export const createUniqueIndex = (path, printer) => {
4
+ printer.write('CREATE UNIQUE INDEX ');
5
+ printIndexBody(path, printer);
20
6
  };
@@ -0,0 +1,8 @@
1
+ export const createMaterializedView = (path, {write, traverse}) => {
2
+ const [name, stmt] = path.get('arguments');
3
+
4
+ write('CREATE MATERIALIZED VIEW ');
5
+ traverse(name);
6
+ write(' AS ');
7
+ traverse(stmt);
8
+ };
@@ -0,0 +1,4 @@
1
+ export const createSchema = (path, {write, traverse}) => {
2
+ write('CREATE SCHEMA ');
3
+ traverse(path.get('arguments')[0]);
4
+ };
@@ -1,3 +1,7 @@
1
+ import {types} from '@putout/babel';
2
+
3
+ const {isCallExpression} = types;
4
+
1
5
  export const printTableBody = (path, {write, traverse}) => {
2
6
  const [name, columns] = path.get('arguments');
3
7
 
@@ -7,9 +11,17 @@ export const printTableBody = (path, {write, traverse}) => {
7
11
  write.newline();
8
12
 
9
13
  const elements = columns.get('elements');
14
+ let wroteRowid = false;
10
15
 
11
16
  for (const [i, element] of elements.entries()) {
12
- if (i > 0) {
17
+ const isRowid = isCallExpression(element.node) && element.node.callee.name === 'withoutRowid';
18
+
19
+ if (isRowid) {
20
+ wroteRowid = true;
21
+ continue;
22
+ }
23
+
24
+ if (i > 0 && !wroteRowid) {
13
25
  write(',');
14
26
  write.newline();
15
27
  }
@@ -18,6 +30,9 @@ export const printTableBody = (path, {write, traverse}) => {
18
30
  }
19
31
 
20
32
  write(')');
33
+
34
+ if (wroteRowid)
35
+ write(' WITHOUT ROWID');
21
36
  };
22
37
 
23
38
  export const createTable = (path, printer) => {
@@ -0,0 +1,8 @@
1
+ export const createTableAs = (path, {write, traverse}) => {
2
+ const [name, stmt] = path.get('arguments');
3
+
4
+ write('CREATE TABLE ');
5
+ traverse(name);
6
+ write(' AS ');
7
+ traverse(stmt);
8
+ };
@@ -0,0 +1,11 @@
1
+ import {printTableBody} from '../create-table/create-table.js';
2
+
3
+ export const createTempTable = (path, printer) => {
4
+ printer.write('CREATE TEMP TABLE ');
5
+ printTableBody(path, printer);
6
+ };
7
+
8
+ export const createTempTableIfNotExists = (path, printer) => {
9
+ printer.write('CREATE TEMP TABLE IF NOT EXISTS ');
10
+ printTableBody(path, printer);
11
+ };
@@ -0,0 +1,8 @@
1
+ export const createView = (path, {write, traverse}) => {
2
+ const [name, stmt] = path.get('arguments');
3
+
4
+ write('CREATE VIEW ');
5
+ traverse(name);
6
+ write(' AS ');
7
+ traverse(stmt);
8
+ };
@@ -0,0 +1,8 @@
1
+ export const createVirtualTable = (path, {write, traverse}) => {
2
+ const [name, module] = path.get('arguments');
3
+
4
+ write('CREATE VIRTUAL TABLE ');
5
+ traverse(name);
6
+ write(' USING ');
7
+ traverse(module);
8
+ };
@@ -1,4 +1,5 @@
1
- export const nextval = (path, {write}) => {
1
+ export const defaultNextval = (path, {write}) => {
2
2
  const [seq] = path.node.arguments;
3
+
3
4
  write(`DEFAULT nextval('${seq.name}')`);
4
5
  };
@@ -0,0 +1,3 @@
1
+ export const defaultValues = (path, {write}) => {
2
+ write('DEFAULT VALUES');
3
+ };
@@ -0,0 +1,6 @@
1
+ export const detach = (path, {write, traverse}) => {
2
+ const [schema] = path.get('arguments');
3
+
4
+ write('DETACH DATABASE ');
5
+ traverse(schema);
6
+ };
@@ -0,0 +1,14 @@
1
+ export const distinctOn = (path, {write, traverse}) => {
2
+ write('DISTINCT ON (');
3
+
4
+ const args = path.get('arguments');
5
+
6
+ for (const [i, arg] of args.entries()) {
7
+ if (i > 0)
8
+ write(', ');
9
+
10
+ traverse(arg);
11
+ }
12
+
13
+ write(')');
14
+ };
@@ -0,0 +1,5 @@
1
+ export const doBlock = (path, {write}) => {
2
+ const [arg] = path.get('arguments');
3
+
4
+ write(`DO $$${arg.node.value}$$`);
5
+ };
@@ -1,9 +1,21 @@
1
+ import {types} from '@putout/babel';
2
+
3
+ const {isCallExpression} = types;
4
+
5
+ const isIfExists = (arg) => isCallExpression(arg.node) && arg.node.callee.name === 'ifExists';
6
+
1
7
  export const dropIndex = (path, {write, traverse}) => {
2
8
  const args = path.get('arguments');
9
+ let rest = args;
3
10
 
4
11
  write('DROP INDEX ');
5
12
 
6
- for (const [i, arg] of args.entries()) {
13
+ if (args.length > 0 && isIfExists(args[0])) {
14
+ write('IF EXISTS ');
15
+ rest = args.slice(1);
16
+ }
17
+
18
+ for (const [i, arg] of rest.entries()) {
7
19
  if (i > 0)
8
20
  write(', ');
9
21
 
@@ -0,0 +1,24 @@
1
+ import {types} from '@putout/babel';
2
+
3
+ const {isCallExpression} = types;
4
+
5
+ const isIfExists = (arg) => isCallExpression(arg.node) && arg.node.callee.name === 'ifExists';
6
+
7
+ export const dropView = (path, {write, traverse}) => {
8
+ const args = path.get('arguments');
9
+ let rest = args;
10
+
11
+ write('DROP VIEW ');
12
+
13
+ if (args.length > 0 && isIfExists(args[0])) {
14
+ write('IF EXISTS ');
15
+ rest = args.slice(1);
16
+ }
17
+
18
+ for (const [i, arg] of rest.entries()) {
19
+ if (i > 0)
20
+ write(', ');
21
+
22
+ traverse(arg);
23
+ }
24
+ };
@@ -0,0 +1,4 @@
1
+ export const explain = (path, {write, traverse}) => {
2
+ write('EXPLAIN ');
3
+ traverse(path.get('arguments')[0]);
4
+ };
@@ -0,0 +1,4 @@
1
+ export const explainAnalyze = (path, {write, traverse}) => {
2
+ write('EXPLAIN ANALYZE ');
3
+ traverse(path.get('arguments')[0]);
4
+ };
@@ -0,0 +1,4 @@
1
+ export const explainQueryPlan = (path, {write, traverse}) => {
2
+ write('EXPLAIN QUERY PLAN ');
3
+ traverse(path.get('arguments')[0]);
4
+ };
@@ -0,0 +1,5 @@
1
+ export const fetchFirst = (path, {write, traverse}) => {
2
+ write('FETCH FIRST ');
3
+ traverse(path.get('arguments')[0]);
4
+ write(' ROWS ONLY');
5
+ };
@@ -0,0 +1,8 @@
1
+ export const filter = (path, {write, traverse}) => {
2
+ const [fn, condition] = path.get('arguments');
3
+
4
+ traverse(fn);
5
+ write(' FILTER (WHERE ');
6
+ traverse(condition);
7
+ write(')');
8
+ };
@@ -0,0 +1,3 @@
1
+ export const forUpdate = (path, {write}) => {
2
+ write('FOR UPDATE');
3
+ };