happy-sql 2.0.8 → 2.1.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 (145) hide show
  1. package/ChangeLog +17 -0
  2. package/lib/parser/visitors/clause/count/count.js +4 -0
  3. package/lib/parser/visitors/clause/delete/fixture/delete-where-between-fix.js +14 -0
  4. package/lib/parser/visitors/clause/delete/fixture/delete-where-between.sql +1 -0
  5. package/lib/parser/visitors/clause/from/fixture/generate-series-fix.js +12 -0
  6. package/lib/parser/visitors/clause/from/fixture/generate-series.sql +1 -0
  7. package/lib/parser/visitors/clause/from/fixture/group-by-fix.js +14 -0
  8. package/lib/parser/visitors/clause/from/fixture/group-by-having-fix.js +22 -0
  9. package/lib/parser/visitors/clause/from/fixture/group-by-having.sql +1 -0
  10. package/lib/parser/visitors/clause/from/fixture/group-by-multi-fix.js +13 -0
  11. package/lib/parser/visitors/clause/from/fixture/group-by-multi.sql +1 -0
  12. package/lib/parser/visitors/clause/from/fixture/group-by-order-by-fix.js +17 -0
  13. package/lib/parser/visitors/clause/from/fixture/group-by-order-by.sql +1 -0
  14. package/lib/parser/visitors/clause/from/fixture/group-by-sum-fix.js +14 -0
  15. package/lib/parser/visitors/clause/from/fixture/group-by-sum-having-fix.js +19 -0
  16. package/lib/parser/visitors/clause/from/fixture/group-by-sum-having.sql +1 -0
  17. package/lib/parser/visitors/clause/from/fixture/group-by-sum.sql +1 -0
  18. package/lib/parser/visitors/clause/from/fixture/group-by.sql +1 -0
  19. package/lib/parser/visitors/clause/from/fixture/json-each-fix.js +10 -0
  20. package/lib/parser/visitors/clause/from/fixture/json-each.sql +1 -0
  21. package/lib/parser/visitors/clause/from/fixture/limit-fix.js +11 -0
  22. package/lib/parser/visitors/clause/from/fixture/limit-offset-fix.js +12 -0
  23. package/lib/parser/visitors/clause/from/fixture/limit-offset.sql +1 -0
  24. package/lib/parser/visitors/clause/from/fixture/limit.sql +1 -0
  25. package/lib/parser/visitors/clause/from/fixture/order-by-desc-fix.js +13 -0
  26. package/lib/parser/visitors/clause/from/fixture/order-by-desc.sql +1 -0
  27. package/lib/parser/visitors/clause/from/fixture/order-by-fix.js +11 -0
  28. package/lib/parser/visitors/clause/from/fixture/order-by-multi-fix.js +14 -0
  29. package/lib/parser/visitors/clause/from/fixture/order-by-multi.sql +1 -0
  30. package/lib/parser/visitors/clause/from/fixture/order-by.sql +1 -0
  31. package/lib/parser/visitors/clause/from/fixture/unnest-fix.js +10 -0
  32. package/lib/parser/visitors/clause/from/fixture/unnest.sql +1 -0
  33. package/lib/parser/visitors/clause/from/from.js +37 -1
  34. package/lib/parser/visitors/clause/from/group-by.js +6 -0
  35. package/lib/parser/visitors/clause/from/having.js +8 -0
  36. package/lib/parser/visitors/clause/from/limit.js +18 -0
  37. package/lib/parser/visitors/clause/from/order-by.js +20 -0
  38. package/lib/parser/visitors/clause/from/table-func.js +28 -0
  39. package/lib/parser/visitors/clause/index.js +12 -1
  40. package/lib/parser/visitors/clause/operand.js +14 -0
  41. package/lib/parser/visitors/clause/select/fixture/select-abs-fix.js +8 -0
  42. package/lib/parser/visitors/clause/select/fixture/select-abs.sql +1 -0
  43. package/lib/parser/visitors/clause/select/fixture/select-avg-fix.js +10 -0
  44. package/lib/parser/visitors/clause/select/fixture/select-avg.sql +1 -0
  45. package/lib/parser/visitors/clause/select/fixture/select-count-col-fix.js +10 -0
  46. package/lib/parser/visitors/clause/select/fixture/select-count-col.sql +1 -0
  47. package/lib/parser/visitors/clause/select/fixture/select-distinct-fix.js +10 -0
  48. package/lib/parser/visitors/clause/select/fixture/select-distinct-multi-fix.js +11 -0
  49. package/lib/parser/visitors/clause/select/fixture/select-distinct-multi.sql +1 -0
  50. package/lib/parser/visitors/clause/select/fixture/select-distinct.sql +1 -0
  51. package/lib/parser/visitors/clause/select/fixture/select-min-max-fix.js +13 -0
  52. package/lib/parser/visitors/clause/select/fixture/select-min-max.sql +1 -0
  53. package/lib/parser/visitors/clause/select/fixture/select-sum-fix.js +10 -0
  54. package/lib/parser/visitors/clause/select/fixture/select-sum.sql +1 -0
  55. package/lib/parser/visitors/clause/select/select.js +47 -2
  56. package/lib/parser/visitors/clause/union/fixture/union-all-fix.js +10 -0
  57. package/lib/parser/visitors/clause/union/fixture/union-all.sql +1 -0
  58. package/lib/parser/visitors/clause/union/union.js +11 -0
  59. package/lib/parser/visitors/clause/update/fixture/update-where-not-in-fix.js +16 -0
  60. package/lib/parser/visitors/clause/update/fixture/update-where-not-in.sql +1 -0
  61. package/lib/parser/visitors/clause/where/fixture/where-between-fix.js +15 -0
  62. package/lib/parser/visitors/clause/where/fixture/where-between.sql +1 -0
  63. package/lib/parser/visitors/clause/where/fixture/where-not-in-fix.js +16 -0
  64. package/lib/parser/visitors/clause/where/fixture/where-not-in.sql +1 -0
  65. package/lib/parser/visitors/clause/where/where.js +19 -1
  66. package/lib/parser/visitors/clause/with-named/fixture/with-named-select-fix.js +19 -0
  67. package/lib/parser/visitors/clause/with-named/fixture/with-named-select.sql +1 -0
  68. package/lib/parser/visitors/clause/with-named/fixture/with-recursive-fix.js +27 -0
  69. package/lib/parser/visitors/clause/with-named/fixture/with-recursive-multi-fix.js +38 -0
  70. package/lib/parser/visitors/clause/with-named/fixture/with-recursive-multi.sql +1 -0
  71. package/lib/parser/visitors/clause/with-named/fixture/with-recursive-no-columns-fix.js +20 -0
  72. package/lib/parser/visitors/clause/with-named/fixture/with-recursive-no-columns.sql +1 -0
  73. package/lib/parser/visitors/clause/with-named/fixture/with-recursive.sql +1 -0
  74. package/lib/parser/visitors/clause/with-named/with-named.js +15 -2
  75. package/lib/printer/visitors/call-expression/clauses/avg/avg.js +5 -0
  76. package/lib/printer/visitors/call-expression/clauses/avg/fixture/avg-fix.sql +2 -0
  77. package/lib/printer/visitors/call-expression/clauses/avg/fixture/avg.js +1 -0
  78. package/lib/printer/visitors/call-expression/clauses/between/between.js +9 -0
  79. package/lib/printer/visitors/call-expression/clauses/between/fixture/between-fix.sql +3 -0
  80. package/lib/printer/visitors/call-expression/clauses/between/fixture/between.js +3 -0
  81. package/lib/printer/visitors/call-expression/clauses/clauses.js +28 -0
  82. package/lib/printer/visitors/call-expression/clauses/desc/desc.js +4 -0
  83. package/lib/printer/visitors/call-expression/clauses/desc/fixture/desc-fix.sql +3 -0
  84. package/lib/printer/visitors/call-expression/clauses/desc/fixture/desc.js +13 -0
  85. package/lib/printer/visitors/call-expression/clauses/distinct/distinct.js +12 -0
  86. package/lib/printer/visitors/call-expression/clauses/distinct/fixture/distinct-fix.sql +2 -0
  87. package/lib/printer/visitors/call-expression/clauses/distinct/fixture/distinct-multi-fix.sql +2 -0
  88. package/lib/printer/visitors/call-expression/clauses/distinct/fixture/distinct-multi.js +11 -0
  89. package/lib/printer/visitors/call-expression/clauses/distinct/fixture/distinct.js +10 -0
  90. package/lib/printer/visitors/call-expression/clauses/from/fixture/generate-series-fix.sql +2 -0
  91. package/lib/printer/visitors/call-expression/clauses/from/fixture/generate-series.js +3 -0
  92. package/lib/printer/visitors/call-expression/clauses/from/fixture/group-by-having-fix.sql +5 -0
  93. package/lib/printer/visitors/call-expression/clauses/from/fixture/group-by-having.js +22 -0
  94. package/lib/printer/visitors/call-expression/clauses/from/from.js +58 -11
  95. package/lib/printer/visitors/call-expression/clauses/group-by/fixture/group-by-fix.sql +3 -0
  96. package/lib/printer/visitors/call-expression/clauses/group-by/fixture/group-by-multi-fix.sql +3 -0
  97. package/lib/printer/visitors/call-expression/clauses/group-by/fixture/group-by-multi.js +13 -0
  98. package/lib/printer/visitors/call-expression/clauses/group-by/fixture/group-by-sum-fix.sql +4 -0
  99. package/lib/printer/visitors/call-expression/clauses/group-by/fixture/group-by-sum.js +19 -0
  100. package/lib/printer/visitors/call-expression/clauses/group-by/fixture/group-by.js +14 -0
  101. package/lib/printer/visitors/call-expression/clauses/group-by/group-by.js +12 -0
  102. package/lib/printer/visitors/call-expression/clauses/having/fixture/having-fix.sql +3 -0
  103. package/lib/printer/visitors/call-expression/clauses/having/fixture/having.js +16 -0
  104. package/lib/printer/visitors/call-expression/clauses/having/having.js +4 -0
  105. package/lib/printer/visitors/call-expression/clauses/insert/insert.js +1 -1
  106. package/lib/printer/visitors/call-expression/clauses/join/join.js +6 -4
  107. package/lib/printer/visitors/call-expression/clauses/limit/fixture/limit-fix.sql +3 -0
  108. package/lib/printer/visitors/call-expression/clauses/limit/fixture/limit-offset-fix.sql +4 -0
  109. package/lib/printer/visitors/call-expression/clauses/limit/fixture/limit-offset.js +12 -0
  110. package/lib/printer/visitors/call-expression/clauses/limit/fixture/limit.js +11 -0
  111. package/lib/printer/visitors/call-expression/clauses/limit/limit.js +12 -0
  112. package/lib/printer/visitors/call-expression/clauses/max/fixture/max-fix.sql +2 -0
  113. package/lib/printer/visitors/call-expression/clauses/max/fixture/max.js +1 -0
  114. package/lib/printer/visitors/call-expression/clauses/max/max.js +5 -0
  115. package/lib/printer/visitors/call-expression/clauses/min/fixture/min-fix.sql +2 -0
  116. package/lib/printer/visitors/call-expression/clauses/min/fixture/min.js +1 -0
  117. package/lib/printer/visitors/call-expression/clauses/min/min.js +5 -0
  118. package/lib/printer/visitors/call-expression/clauses/not-in-list/fixture/not-in-list-fix.sql +3 -0
  119. package/lib/printer/visitors/call-expression/clauses/not-in-list/fixture/not-in-list.js +3 -0
  120. package/lib/printer/visitors/call-expression/clauses/not-in-list/not-in-list.js +15 -0
  121. package/lib/printer/visitors/call-expression/clauses/order-by/fixture/order-by-fix.sql +3 -0
  122. package/lib/printer/visitors/call-expression/clauses/order-by/fixture/order-by-multi-fix.sql +3 -0
  123. package/lib/printer/visitors/call-expression/clauses/order-by/fixture/order-by-multi.js +14 -0
  124. package/lib/printer/visitors/call-expression/clauses/order-by/fixture/order-by.js +11 -0
  125. package/lib/printer/visitors/call-expression/clauses/order-by/order-by.js +12 -0
  126. package/lib/printer/visitors/call-expression/clauses/returning/returning.js +5 -3
  127. package/lib/printer/visitors/call-expression/clauses/select/select.js +10 -9
  128. package/lib/printer/visitors/call-expression/clauses/sum/fixture/sum-fix.sql +2 -0
  129. package/lib/printer/visitors/call-expression/clauses/sum/fixture/sum.js +1 -0
  130. package/lib/printer/visitors/call-expression/clauses/sum/sum.js +5 -0
  131. package/lib/printer/visitors/call-expression/clauses/union-all/fixture/union-all-fix.sql +3 -0
  132. package/lib/printer/visitors/call-expression/clauses/union-all/fixture/union-all.js +1 -0
  133. package/lib/printer/visitors/call-expression/clauses/union-all/union-all.js +9 -0
  134. package/lib/printer/visitors/call-expression/clauses/with-named/fixture/with-named-insert-fix.sql +3 -3
  135. package/lib/printer/visitors/call-expression/clauses/with-named/fixture/with-named-select-fix.sql +8 -0
  136. package/lib/printer/visitors/call-expression/clauses/with-named/fixture/with-named-select.js +19 -0
  137. package/lib/printer/visitors/call-expression/clauses/with-named/fixture/withNamed-fix.sql +3 -3
  138. package/lib/printer/visitors/call-expression/clauses/with-recursive/fixture/with-recursive-fix.sql +10 -0
  139. package/lib/printer/visitors/call-expression/clauses/with-recursive/fixture/with-recursive-multi-fix.sql +14 -0
  140. package/lib/printer/visitors/call-expression/clauses/with-recursive/fixture/with-recursive-multi.js +38 -0
  141. package/lib/printer/visitors/call-expression/clauses/with-recursive/fixture/with-recursive-no-columns-fix.sql +8 -0
  142. package/lib/printer/visitors/call-expression/clauses/with-recursive/fixture/with-recursive-no-columns.js +20 -0
  143. package/lib/printer/visitors/call-expression/clauses/with-recursive/fixture/with-recursive.js +27 -0
  144. package/lib/printer/visitors/call-expression/clauses/with-recursive/with-recursive.js +57 -0
  145. package/package.json +2 -1
@@ -0,0 +1,3 @@
1
+ SELECT kind, name
2
+ FROM VariableDeclaration
3
+ GROUP BY kind, name
@@ -0,0 +1,13 @@
1
+ [
2
+ select(
3
+ kind,
4
+ name,
5
+ from(
6
+ VariableDeclaration,
7
+ groupBy(
8
+ kind,
9
+ name,
10
+ ),
11
+ ),
12
+ ),
13
+ ];
@@ -0,0 +1,4 @@
1
+ SELECT dept, SUM(salary)
2
+ FROM emp
3
+ GROUP BY dept
4
+ HAVING SUM(salary) > 1000
@@ -0,0 +1,19 @@
1
+ [
2
+ select(
3
+ dept,
4
+ sum(
5
+ salary,
6
+ ),
7
+ from(
8
+ emp,
9
+ groupBy(
10
+ dept,
11
+ ),
12
+ having(
13
+ sum(
14
+ salary,
15
+ ) > 1000,
16
+ ),
17
+ ),
18
+ ),
19
+ ];
@@ -0,0 +1,14 @@
1
+ [
2
+ select(
3
+ kind,
4
+ count(
5
+ '*',
6
+ ),
7
+ from(
8
+ VariableDeclaration,
9
+ groupBy(
10
+ kind,
11
+ ),
12
+ ),
13
+ ),
14
+ ];
@@ -0,0 +1,12 @@
1
+ export const groupBy = (path, {write, traverse}) => {
2
+ const args = path.get('arguments');
3
+
4
+ write('GROUP BY ');
5
+
6
+ for (const [i, arg] of args.entries()) {
7
+ if (i > 0)
8
+ write(', ');
9
+
10
+ traverse(arg);
11
+ }
12
+ };
@@ -0,0 +1,3 @@
1
+ SELECT kind, COUNT(*)
2
+ FROM VariableDeclaration
3
+ HAVING COUNT(*) > 1
@@ -0,0 +1,16 @@
1
+ [
2
+ select(
3
+ kind,
4
+ count(
5
+ '*',
6
+ ),
7
+ from(
8
+ VariableDeclaration,
9
+ having(
10
+ count(
11
+ '*',
12
+ ) > 1,
13
+ ),
14
+ ),
15
+ ),
16
+ ];
@@ -0,0 +1,4 @@
1
+ export const having = (path, {write, traverse}) => {
2
+ write('HAVING ');
3
+ traverse(path.get('arguments')[0]);
4
+ };
@@ -6,7 +6,7 @@ export const insert = (path, {write, traverse}) => {
6
6
  traverse(intoArg);
7
7
 
8
8
  for (const arg of rest) {
9
- write.newline();
9
+ write.breakline();
10
10
  traverse(arg);
11
11
  }
12
12
  };
@@ -7,17 +7,19 @@ const printAsExpression = (path, {write, traverse}) => {
7
7
  write(` AS ${path.node.typeAnnotation.literal.value}`);
8
8
  };
9
9
 
10
- const printTable = (path, ctx) => {
10
+ const printTable = (path, printer) => {
11
+ const {traverse} = printer;
12
+
11
13
  if (isTSAsExpression(path.node))
12
- return printAsExpression(path, ctx);
14
+ return printAsExpression(path, printer);
13
15
 
14
- ctx.traverse(path);
16
+ traverse(path);
15
17
  };
16
18
 
17
19
  export const join = (path, {write, traverse}) => {
18
20
  const [table, onClause] = path.get('arguments');
19
21
 
20
- write.newline();
22
+ write.breakline();
21
23
  write('JOIN ');
22
24
  printTable(table, {
23
25
  write,
@@ -0,0 +1,3 @@
1
+ SELECT id
2
+ FROM users
3
+ LIMIT 10
@@ -0,0 +1,4 @@
1
+ SELECT id
2
+ FROM users
3
+ LIMIT 10
4
+ OFFSET 5
@@ -0,0 +1,12 @@
1
+ [
2
+ select(
3
+ id,
4
+ from(
5
+ users,
6
+ limit(
7
+ 10,
8
+ 5,
9
+ ),
10
+ ),
11
+ ),
12
+ ];
@@ -0,0 +1,11 @@
1
+ [
2
+ select(
3
+ id,
4
+ from(
5
+ users,
6
+ limit(
7
+ 10,
8
+ ),
9
+ ),
10
+ ),
11
+ ];
@@ -0,0 +1,12 @@
1
+ export const limit = (path, {write, traverse}) => {
2
+ const args = path.get('arguments');
3
+
4
+ write('LIMIT ');
5
+ traverse(args[0]);
6
+
7
+ if (args.length > 1) {
8
+ write.breakline();
9
+ write('OFFSET ');
10
+ traverse(args[1]);
11
+ }
12
+ };
@@ -0,0 +1,2 @@
1
+ SELECT MAX(price)
2
+ FROM products
@@ -0,0 +1 @@
1
+ select(max(price), from(products));
@@ -0,0 +1,5 @@
1
+ export const max = (path, {write, traverse}) => {
2
+ write('MAX(');
3
+ traverse(path.get('arguments')[0]);
4
+ write(')');
5
+ };
@@ -0,0 +1,2 @@
1
+ SELECT MIN(price)
2
+ FROM products
@@ -0,0 +1 @@
1
+ select(min(price), from(products));
@@ -0,0 +1,5 @@
1
+ export const min = (path, {write, traverse}) => {
2
+ write('MIN(');
3
+ traverse(path.get('arguments')[0]);
4
+ write(')');
5
+ };
@@ -0,0 +1,3 @@
1
+ SELECT *
2
+ FROM users
3
+ WHERE id NOT IN (1, 2, 3)
@@ -0,0 +1,3 @@
1
+ [
2
+ select('*', from(users, where(notInList(id, 1, 2, 3)))),
3
+ ];
@@ -0,0 +1,15 @@
1
+ export const notInList = (path, {write, traverse}) => {
2
+ const [head, ...items] = path.get('arguments');
3
+
4
+ traverse(head);
5
+ write(' NOT IN (');
6
+
7
+ for (let i = 0; i < items.length; i++) {
8
+ if (i > 0)
9
+ write(', ');
10
+
11
+ traverse(items[i]);
12
+ }
13
+
14
+ write(')');
15
+ };
@@ -0,0 +1,3 @@
1
+ SELECT id
2
+ FROM users
3
+ ORDER BY name
@@ -0,0 +1,3 @@
1
+ SELECT id
2
+ FROM users
3
+ ORDER BY name, id DESC
@@ -0,0 +1,14 @@
1
+ [
2
+ select(
3
+ id,
4
+ from(
5
+ users,
6
+ orderBy(
7
+ name,
8
+ desc(
9
+ id,
10
+ ),
11
+ ),
12
+ ),
13
+ ),
14
+ ];
@@ -0,0 +1,11 @@
1
+ [
2
+ select(
3
+ id,
4
+ from(
5
+ users,
6
+ orderBy(
7
+ name,
8
+ ),
9
+ ),
10
+ ),
11
+ ];
@@ -0,0 +1,12 @@
1
+ export const orderBy = (path, {write, traverse}) => {
2
+ const args = path.get('arguments');
3
+
4
+ write('ORDER BY ');
5
+
6
+ for (const [i, arg] of args.entries()) {
7
+ if (i > 0)
8
+ write(', ');
9
+
10
+ traverse(arg);
11
+ }
12
+ };
@@ -7,11 +7,13 @@ const printAsExpression = (path, {write, traverse}) => {
7
7
  write(` AS ${path.node.typeAnnotation.literal.value}`);
8
8
  };
9
9
 
10
- const printItem = (path, ctx) => {
10
+ const printItem = (path, printer) => {
11
+ const {traverse} = printer;
12
+
11
13
  if (isTSAsExpression(path.node))
12
- return printAsExpression(path, ctx);
14
+ return printAsExpression(path, printer);
13
15
 
14
- ctx.traverse(path);
16
+ traverse(path);
15
17
  };
16
18
 
17
19
  export const returning = (path, {write, traverse}) => {
@@ -7,14 +7,17 @@ const printAsExpression = (path, {write, traverse}) => {
7
7
  write(` AS ${path.node.typeAnnotation.literal.value}`);
8
8
  };
9
9
 
10
- const printItem = (path, ctx) => {
10
+ const printItem = (path, printer) => {
11
+ const {traverse} = printer;
12
+
11
13
  if (isTSAsExpression(path.node))
12
- return printAsExpression(path, ctx);
14
+ return printAsExpression(path, printer);
13
15
 
14
- ctx.traverse(path);
16
+ traverse(path);
15
17
  };
16
18
 
17
- export const select = (path, {write, traverse}) => {
19
+ export const select = (path, printer) => {
20
+ const {write, traverse} = printer;
18
21
  const args = path.get('arguments');
19
22
  const lastArg = args.at(-1);
20
23
  const hasFrom = lastArg?.node?.callee?.name === 'from';
@@ -27,14 +30,12 @@ export const select = (path, {write, traverse}) => {
27
30
  if (i > 0)
28
31
  write(', ');
29
32
 
30
- printItem(cols[i], {
31
- write,
32
- traverse,
33
- });
33
+ printItem(cols[i], printer);
34
34
  }
35
35
 
36
36
  if (fromArg) {
37
- write.newline();
37
+ write.breakline();
38
38
  traverse(fromArg);
39
39
  }
40
40
  };
41
+
@@ -0,0 +1,2 @@
1
+ SELECT SUM(amount)
2
+ FROM orders
@@ -0,0 +1 @@
1
+ select(sum(amount), from(orders));
@@ -0,0 +1,5 @@
1
+ export const sum = (path, {write, traverse}) => {
2
+ write('SUM(');
3
+ traverse(path.get('arguments')[0]);
4
+ write(')');
5
+ };
@@ -0,0 +1 @@
1
+ [unionAll(select(1), select(2))];
@@ -0,0 +1,9 @@
1
+ export const unionAll = (path, {write, traverse}) => {
2
+ const [left, right] = path.get('arguments');
3
+
4
+ traverse(left);
5
+ write.breakline();
6
+ write('UNION ALL');
7
+ write.breakline();
8
+ traverse(right);
9
+ };
@@ -1,12 +1,12 @@
1
1
  WITH
2
2
  call AS (
3
3
  INSERT INTO CallExpression (file, parent_id) VALUES (:file, :parent_id)
4
- RETURNING id
4
+ RETURNING id
5
5
  ),
6
6
  member AS (
7
7
  INSERT INTO MemberExpression (file, parent_id) SELECT :file, id
8
- FROM call
9
- RETURNING id
8
+ FROM call
9
+ RETURNING id
10
10
  )
11
11
  INSERT INTO Identifier (file, name, parent_id) SELECT :file, 'isNaN', id
12
12
  FROM member
@@ -0,0 +1,8 @@
1
+ WITH
2
+ recent AS (
3
+ SELECT id
4
+ FROM users
5
+ WHERE kind = 'const'
6
+ )
7
+ SELECT id
8
+ FROM recent
@@ -0,0 +1,19 @@
1
+ [
2
+ withNamed(
3
+ recent = select(
4
+ id,
5
+ from(
6
+ users,
7
+ where(
8
+ kind === 'const',
9
+ ),
10
+ ),
11
+ ),
12
+ select(
13
+ id,
14
+ from(
15
+ recent,
16
+ ),
17
+ ),
18
+ ),
19
+ ];
@@ -1,12 +1,12 @@
1
1
  WITH
2
2
  call AS (
3
3
  INSERT INTO CallExpression (parent_id) VALUES (:parent_id)
4
- RETURNING id
4
+ RETURNING id
5
5
  ),
6
6
  member AS (
7
7
  INSERT INTO MemberExpression (parent_id) SELECT id
8
- FROM call
9
- RETURNING id
8
+ FROM call
9
+ RETURNING id
10
10
  )
11
11
  INSERT INTO Identifier (name, parent_id) SELECT 'x', id
12
12
  FROM member
@@ -0,0 +1,10 @@
1
+ WITH RECURSIVE
2
+ numbers(value) AS (
3
+ SELECT 1
4
+ UNION ALL
5
+ SELECT value + 1
6
+ FROM numbers
7
+ WHERE value < 10
8
+ )
9
+ SELECT value
10
+ FROM numbers
@@ -0,0 +1,14 @@
1
+ WITH RECURSIVE
2
+ t AS (
3
+ SELECT 1
4
+ UNION ALL
5
+ SELECT 2
6
+ ),
7
+ u(a, b) AS (
8
+ SELECT 1, 2
9
+ UNION ALL
10
+ SELECT a, b
11
+ FROM t
12
+ )
13
+ SELECT a, b
14
+ FROM u
@@ -0,0 +1,38 @@
1
+ [
2
+ withRecursive(
3
+ t(
4
+ unionAll(
5
+ select(
6
+ 1,
7
+ ),
8
+ select(
9
+ 2,
10
+ ),
11
+ ),
12
+ ),
13
+ u(
14
+ 'a',
15
+ 'b',
16
+ unionAll(
17
+ select(
18
+ 1,
19
+ 2,
20
+ ),
21
+ select(
22
+ a,
23
+ b,
24
+ from(
25
+ t,
26
+ ),
27
+ ),
28
+ ),
29
+ ),
30
+ select(
31
+ a,
32
+ b,
33
+ from(
34
+ u,
35
+ ),
36
+ ),
37
+ ),
38
+ ];
@@ -0,0 +1,8 @@
1
+ WITH RECURSIVE
2
+ t AS (
3
+ SELECT 1
4
+ UNION ALL
5
+ SELECT 2
6
+ )
7
+ SELECT *
8
+ FROM t
@@ -0,0 +1,20 @@
1
+ [
2
+ withRecursive(
3
+ t(
4
+ unionAll(
5
+ select(
6
+ 1,
7
+ ),
8
+ select(
9
+ 2,
10
+ ),
11
+ ),
12
+ ),
13
+ select(
14
+ '*',
15
+ from(
16
+ t,
17
+ ),
18
+ ),
19
+ ),
20
+ ];
@@ -0,0 +1,27 @@
1
+ [
2
+ withRecursive(
3
+ numbers(
4
+ 'value',
5
+ unionAll(
6
+ select(
7
+ 1,
8
+ ),
9
+ select(
10
+ value + 1,
11
+ from(
12
+ numbers,
13
+ where(
14
+ value < 10,
15
+ ),
16
+ ),
17
+ ),
18
+ ),
19
+ ),
20
+ select(
21
+ value,
22
+ from(
23
+ numbers,
24
+ ),
25
+ ),
26
+ ),
27
+ ];
@@ -0,0 +1,57 @@
1
+ const isStringLiteral = ({type}) => type === 'StringLiteral';
2
+
3
+ export const withRecursive = (path, {write, indent, traverse}) => {
4
+ const args = path.get('arguments');
5
+ const ctes = args.slice(0, -1);
6
+ const finalStatement = args.at(-1);
7
+
8
+ write('WITH RECURSIVE');
9
+ write.newline();
10
+
11
+ const last = ctes.length - 1;
12
+
13
+ for (const [i, cte] of ctes.entries()) {
14
+ const {name} = cte.node.callee;
15
+ const cteArgs = cte.get('arguments');
16
+ const colArgs = cteArgs.filter(isStringLiteral);
17
+
18
+ indent.inc();
19
+ write.indent();
20
+ indent.dec();
21
+ write(name);
22
+
23
+ if (colArgs.length) {
24
+ write('(');
25
+
26
+ for (const [j, col] of colArgs.entries()) {
27
+ if (j > 0)
28
+ write(', ');
29
+
30
+ write(col.node.value);
31
+ }
32
+
33
+ write(')');
34
+ }
35
+
36
+ write(' AS (');
37
+ write.newline();
38
+ indent.inc();
39
+ indent.inc();
40
+ write.indent();
41
+ traverse(cteArgs.at(-1));
42
+ indent.dec();
43
+ indent.dec();
44
+ write.newline();
45
+ indent.inc();
46
+ write.indent();
47
+ indent.dec();
48
+ write(')');
49
+
50
+ if (i < last)
51
+ write(',');
52
+
53
+ write.newline();
54
+ }
55
+
56
+ traverse(finalStatement);
57
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "happy-sql",
3
- "version": "2.0.8",
3
+ "version": "2.1.1",
4
4
  "type": "module",
5
5
  "description": "sql to js ast parser and printer",
6
6
  "exports": {
@@ -25,6 +25,7 @@
25
25
  "#parser/clause/update": "./lib/parser/visitors/clause/update/update.js",
26
26
  "#parser/clause/delete": "./lib/parser/visitors/clause/delete/delete.js",
27
27
  "#parser/clause/with-named": "./lib/parser/visitors/clause/with-named/with-named.js",
28
+ "#parser/clause/union": "./lib/parser/visitors/clause/union/union.js",
28
29
  "#parser/clause/create-table": "./lib/parser/visitors/clause/create-table/create-table.js",
29
30
  "#parser/clause/create-sequence": "./lib/parser/visitors/clause/create-sequence/create-sequence.js",
30
31
  "#parser/clause/column-definition": "./lib/parser/visitors/clause/column-definition/column-definition.js",