happy-sql 2.0.7 → 2.1.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 (143) hide show
  1. package/ChangeLog +16 -0
  2. package/lib/happy-sql.js +5 -1
  3. package/lib/parser/fixture/comment-fix.js +6 -1
  4. package/lib/parser/fixture/section-multi-fix.js +22 -4
  5. package/lib/parser/fixture/select-fix.js +6 -1
  6. package/lib/parser/fixture/with-named-fix.js +41 -9
  7. package/lib/parser/fixture/with-named-insert-fix.js +42 -9
  8. package/lib/parser/parser.js +0 -1
  9. package/lib/parser/visitors/clause/count/fixture/count-fix.js +8 -1
  10. package/lib/parser/visitors/clause/count/fixture/count-one-fix.js +8 -1
  11. package/lib/parser/visitors/clause/create-sequence/fixture/create-sequence-fix.js +3 -1
  12. package/lib/parser/visitors/clause/create-table/fixture/create-table-autoincrement-fix.js +10 -3
  13. package/lib/parser/visitors/clause/create-table/fixture/create-table-default-fix.js +9 -3
  14. package/lib/parser/visitors/clause/create-table/fixture/create-table-identity-always-fix.js +10 -3
  15. package/lib/parser/visitors/clause/create-table/fixture/create-table-identity-by-default-fix.js +10 -3
  16. package/lib/parser/visitors/clause/create-table/fixture/create-table-nextval-fix.js +16 -4
  17. package/lib/parser/visitors/clause/create-table/fixture/create-table-not-null-fix.js +9 -3
  18. package/lib/parser/visitors/clause/create-table/fixture/create-table-serial-fix.js +9 -3
  19. package/lib/parser/visitors/clause/delete/fixture/delete-fix.js +8 -1
  20. package/lib/parser/visitors/clause/from/fixture/from-fix.js +6 -1
  21. package/lib/parser/visitors/clause/from/fixture/from-where-fix.js +10 -1
  22. package/lib/parser/visitors/clause/from/fixture/group-by-fix.js +14 -0
  23. package/lib/parser/visitors/clause/from/fixture/group-by-having-fix.js +22 -0
  24. package/lib/parser/visitors/clause/from/fixture/group-by-having.sql +1 -0
  25. package/lib/parser/visitors/clause/from/fixture/group-by-multi-fix.js +13 -0
  26. package/lib/parser/visitors/clause/from/fixture/group-by-multi.sql +1 -0
  27. package/lib/parser/visitors/clause/from/fixture/group-by.sql +1 -0
  28. package/lib/parser/visitors/clause/from/fixture/join-fix.js +12 -1
  29. package/lib/parser/visitors/clause/from/fixture/join-multi-fix.js +19 -1
  30. package/lib/parser/visitors/clause/from/fixture/join-on-in-fix.js +17 -1
  31. package/lib/parser/visitors/clause/from/fixture/join-on-is-not-null-fix.js +14 -1
  32. package/lib/parser/visitors/clause/from/fixture/join-on-is-null-fix.js +14 -1
  33. package/lib/parser/visitors/clause/from/fixture/join-on-like-fix.js +15 -1
  34. package/lib/parser/visitors/clause/from/fixture/join-on-not-eq-fix.js +12 -1
  35. package/lib/parser/visitors/clause/from/fixture/join-on-number-fix.js +12 -1
  36. package/lib/parser/visitors/clause/from/fixture/join-on-or-fix.js +12 -1
  37. package/lib/parser/visitors/clause/from/fixture/join-on-param-fix.js +12 -1
  38. package/lib/parser/visitors/clause/from/from.js +10 -27
  39. package/lib/parser/visitors/clause/from/group-by.js +6 -0
  40. package/lib/parser/visitors/clause/from/having.js +8 -0
  41. package/lib/parser/visitors/clause/index.js +12 -1
  42. package/lib/parser/visitors/clause/insert/fixture/insert-fix.js +9 -1
  43. package/lib/parser/visitors/clause/insert/fixture/insert-identifier-fix.js +15 -1
  44. package/lib/parser/visitors/clause/insert/fixture/insert-multi-fix.js +9 -1
  45. package/lib/parser/visitors/clause/insert/fixture/insert-number-fix.js +16 -1
  46. package/lib/parser/visitors/clause/insert/fixture/insert-returning-conflict-fix.js +18 -1
  47. package/lib/parser/visitors/clause/insert/fixture/insert-returning-fix.js +12 -5
  48. package/lib/parser/visitors/clause/insert/fixture/insert-returning-id-fix.js +12 -5
  49. package/lib/parser/visitors/clause/insert/fixture/insert-string-fix.js +15 -1
  50. package/lib/parser/visitors/clause/on-conflict/fixture/on-conflict-fix.js +15 -1
  51. package/lib/parser/visitors/clause/on-conflict/fixture/on-conflict-nothing-fix.js +12 -1
  52. package/lib/parser/visitors/clause/operand.js +4 -0
  53. package/lib/parser/visitors/clause/select/fixture/select-alias-fix.js +7 -1
  54. package/lib/parser/visitors/clause/select/fixture/select-alias-param-fix.js +6 -1
  55. package/lib/parser/visitors/clause/select/fixture/select-fix.js +6 -1
  56. package/lib/parser/visitors/clause/select/fixture/select-last-insert-rowid-fix.js +6 -1
  57. package/lib/parser/visitors/clause/select/fixture/select-lastval-fix.js +6 -1
  58. package/lib/parser/visitors/clause/select/fixture/select-number-fix.js +9 -1
  59. package/lib/parser/visitors/clause/select/fixture/select-param-fix.js +7 -1
  60. package/lib/parser/visitors/clause/select/select.js +16 -0
  61. package/lib/parser/visitors/clause/union/fixture/union-all-fix.js +10 -0
  62. package/lib/parser/visitors/clause/union/fixture/union-all.sql +1 -0
  63. package/lib/parser/visitors/clause/union/union.js +11 -0
  64. package/lib/parser/visitors/clause/update/fixture/update-fix.js +9 -1
  65. package/lib/parser/visitors/clause/update/fixture/update-identifier-fix.js +9 -1
  66. package/lib/parser/visitors/clause/update/fixture/update-no-where-fix.js +6 -1
  67. package/lib/parser/visitors/clause/update/fixture/update-number-fix.js +9 -1
  68. package/lib/parser/visitors/clause/update/fixture/update-string-fix.js +9 -1
  69. package/lib/parser/visitors/clause/update/fixture/update-where-and-fix.js +11 -0
  70. package/lib/parser/visitors/clause/update/fixture/update-where-and.sql +1 -0
  71. package/lib/parser/visitors/clause/update/fixture/update-where-in-fix.js +16 -0
  72. package/lib/parser/visitors/clause/update/fixture/update-where-in.sql +1 -0
  73. package/lib/parser/visitors/clause/update/fixture/update-where-is-not-null-fix.js +13 -0
  74. package/lib/parser/visitors/clause/update/fixture/update-where-is-not-null.sql +1 -0
  75. package/lib/parser/visitors/clause/update/fixture/update-where-is-null-fix.js +13 -0
  76. package/lib/parser/visitors/clause/update/fixture/update-where-is-null.sql +1 -0
  77. package/lib/parser/visitors/clause/update/fixture/update-where-like-fix.js +14 -0
  78. package/lib/parser/visitors/clause/update/fixture/update-where-like.sql +1 -0
  79. package/lib/parser/visitors/clause/update/fixture/update-where-or-fix.js +11 -0
  80. package/lib/parser/visitors/clause/update/fixture/update-where-or.sql +1 -0
  81. package/lib/parser/visitors/clause/where/fixture/where-boolean-fix.js +11 -0
  82. package/lib/parser/visitors/clause/where/fixture/where-boolean.sql +1 -0
  83. package/lib/parser/visitors/clause/where/fixture/where-compare-fix.js +9 -1
  84. package/lib/parser/visitors/clause/where/fixture/where-fix.js +9 -1
  85. package/lib/parser/visitors/clause/where/fixture/where-gte-fix.js +9 -1
  86. package/lib/parser/visitors/clause/where/fixture/where-in-fix.js +14 -1
  87. package/lib/parser/visitors/clause/where/fixture/where-is-not-null-fix.js +11 -1
  88. package/lib/parser/visitors/clause/where/fixture/where-is-null-fix.js +11 -1
  89. package/lib/parser/visitors/clause/where/fixture/where-like-fix.js +12 -1
  90. package/lib/parser/visitors/clause/where/fixture/where-member-fix.js +11 -0
  91. package/lib/parser/visitors/clause/where/fixture/where-member.sql +1 -0
  92. package/lib/parser/visitors/clause/where/fixture/where-not-eq-fix.js +9 -1
  93. package/lib/parser/visitors/clause/where/fixture/where-null-fix.js +11 -0
  94. package/lib/parser/visitors/clause/where/fixture/where-null.sql +1 -0
  95. package/lib/parser/visitors/clause/where/fixture/where-number-fix.js +9 -1
  96. package/lib/parser/visitors/clause/where/fixture/where-or-fix.js +9 -1
  97. package/lib/parser/visitors/clause/where/where.js +1 -1
  98. package/lib/parser/visitors/clause/with-named/fixture/with-named-select-fix.js +19 -0
  99. package/lib/parser/visitors/clause/with-named/fixture/with-named-select.sql +1 -0
  100. package/lib/parser/visitors/clause/with-named/fixture/with-recursive-fix.js +27 -0
  101. package/lib/parser/visitors/clause/with-named/fixture/with-recursive-multi-fix.js +38 -0
  102. package/lib/parser/visitors/clause/with-named/fixture/with-recursive-multi.sql +1 -0
  103. package/lib/parser/visitors/clause/with-named/fixture/with-recursive-no-columns-fix.js +20 -0
  104. package/lib/parser/visitors/clause/with-named/fixture/with-recursive-no-columns.sql +1 -0
  105. package/lib/parser/visitors/clause/with-named/fixture/with-recursive.sql +1 -0
  106. package/lib/parser/visitors/clause/with-named/with-named.js +15 -2
  107. package/lib/printer/visitors/array-expression.js +4 -2
  108. package/lib/printer/visitors/call-expression/clauses/clauses.js +8 -0
  109. package/lib/printer/visitors/call-expression/clauses/column/column.js +1 -1
  110. package/lib/printer/visitors/call-expression/clauses/create-table/create-table.js +7 -3
  111. package/lib/printer/visitors/call-expression/clauses/delete/delete.js +1 -1
  112. package/lib/printer/visitors/call-expression/clauses/from/fixture/group-by-having-fix.sql +5 -0
  113. package/lib/printer/visitors/call-expression/clauses/from/fixture/group-by-having.js +22 -0
  114. package/lib/printer/visitors/call-expression/clauses/from/from.js +13 -6
  115. package/lib/printer/visitors/call-expression/clauses/group-by/fixture/group-by-fix.sql +3 -0
  116. package/lib/printer/visitors/call-expression/clauses/group-by/fixture/group-by-multi-fix.sql +3 -0
  117. package/lib/printer/visitors/call-expression/clauses/group-by/fixture/group-by-multi.js +13 -0
  118. package/lib/printer/visitors/call-expression/clauses/group-by/fixture/group-by.js +14 -0
  119. package/lib/printer/visitors/call-expression/clauses/group-by/group-by.js +12 -0
  120. package/lib/printer/visitors/call-expression/clauses/having/fixture/having-fix.sql +3 -0
  121. package/lib/printer/visitors/call-expression/clauses/having/fixture/having.js +16 -0
  122. package/lib/printer/visitors/call-expression/clauses/having/having.js +4 -0
  123. package/lib/printer/visitors/call-expression/clauses/insert/insert.js +1 -1
  124. package/lib/printer/visitors/call-expression/clauses/into/into.js +1 -1
  125. package/lib/printer/visitors/call-expression/clauses/join/join.js +3 -2
  126. package/lib/printer/visitors/call-expression/clauses/select/select.js +1 -1
  127. package/lib/printer/visitors/call-expression/clauses/union-all/fixture/union-all-fix.sql +3 -0
  128. package/lib/printer/visitors/call-expression/clauses/union-all/fixture/union-all.js +1 -0
  129. package/lib/printer/visitors/call-expression/clauses/union-all/union-all.js +9 -0
  130. package/lib/printer/visitors/call-expression/clauses/update/update.js +2 -2
  131. package/lib/printer/visitors/call-expression/clauses/with-named/fixture/with-named-insert-fix.sql +3 -3
  132. package/lib/printer/visitors/call-expression/clauses/with-named/fixture/with-named-select-fix.sql +8 -0
  133. package/lib/printer/visitors/call-expression/clauses/with-named/fixture/with-named-select.js +19 -0
  134. package/lib/printer/visitors/call-expression/clauses/with-named/fixture/withNamed-fix.sql +3 -3
  135. package/lib/printer/visitors/call-expression/clauses/with-named/with-named.js +23 -6
  136. package/lib/printer/visitors/call-expression/clauses/with-recursive/fixture/with-recursive-fix.sql +10 -0
  137. package/lib/printer/visitors/call-expression/clauses/with-recursive/fixture/with-recursive-multi-fix.sql +14 -0
  138. package/lib/printer/visitors/call-expression/clauses/with-recursive/fixture/with-recursive-multi.js +38 -0
  139. package/lib/printer/visitors/call-expression/clauses/with-recursive/fixture/with-recursive-no-columns-fix.sql +8 -0
  140. package/lib/printer/visitors/call-expression/clauses/with-recursive/fixture/with-recursive-no-columns.js +20 -0
  141. package/lib/printer/visitors/call-expression/clauses/with-recursive/fixture/with-recursive.js +27 -0
  142. package/lib/printer/visitors/call-expression/clauses/with-recursive/with-recursive.js +57 -0
  143. package/package.json +2 -1
@@ -1,43 +1,20 @@
1
1
  import {types} from '@putout/babel';
2
+ import {convertOperand} from '#parser/clause/operand';
3
+ import {convertGroupBy} from './group-by.js';
4
+ import {convertHaving} from './having.js';
2
5
 
3
6
  const isString = (a) => typeof a === 'string';
4
7
 
5
8
  const {
6
9
  identifier,
7
10
  callExpression,
8
- memberExpression,
9
11
  binaryExpression,
10
12
  logicalExpression,
11
13
  stringLiteral,
12
- numericLiteral,
13
- booleanLiteral,
14
- nullLiteral,
15
14
  tsAsExpression,
16
15
  tsLiteralType,
17
16
  } = types;
18
17
 
19
- const convertOperand = (node) => {
20
- if (node.type === 'member_expr')
21
- return memberExpression(identifier(node.object.name), identifier(node.property.name));
22
-
23
- if (node.type === 'parameter')
24
- return stringLiteral(node.text);
25
-
26
- if (node.type === 'number_literal')
27
- return numericLiteral(node.value);
28
-
29
- if (node.type === 'string_literal')
30
- return stringLiteral(node.value);
31
-
32
- if (node.type === 'boolean_literal')
33
- return booleanLiteral(node.value);
34
-
35
- if (node.type === 'null_literal')
36
- return nullLiteral(node.value);
37
-
38
- return identifier(node.name);
39
- };
40
-
41
18
  const opName = (op) => {
42
19
  if (Array.isArray(op))
43
20
  return op
@@ -133,7 +110,7 @@ const flattenJoins = (node, joins = []) => {
133
110
  return joins;
134
111
  };
135
112
 
136
- export const convertFrom = ({expr, whereClause}) => {
113
+ export const convertFrom = ({expr, whereClause, groupByClause, havingClause}) => {
137
114
  const fromArgs = [];
138
115
 
139
116
  if (whereClause)
@@ -141,6 +118,12 @@ export const convertFrom = ({expr, whereClause}) => {
141
118
  convertCondition(whereClause.expr),
142
119
  ]));
143
120
 
121
+ if (groupByClause)
122
+ fromArgs.push(convertGroupBy(groupByClause));
123
+
124
+ if (havingClause)
125
+ fromArgs.push(convertHaving(havingClause));
126
+
144
127
  if (expr.type === 'join_expr') {
145
128
  const parts = flattenJoins(expr);
146
129
  return callExpression(identifier('from'), parts);
@@ -0,0 +1,6 @@
1
+ import {types} from '@putout/babel';
2
+ import {convertOperand} from '#parser/clause/operand';
3
+
4
+ const {callExpression, identifier} = types;
5
+
6
+ export const convertGroupBy = (clause) => callExpression(identifier('groupBy'), clause.columns.items.map(convertOperand));
@@ -0,0 +1,8 @@
1
+ import {types} from '@putout/babel';
2
+ import {convertCondition} from '#parser/clause/where';
3
+
4
+ const {callExpression, identifier} = types;
5
+
6
+ export const convertHaving = (clause) => callExpression(identifier('having'), [
7
+ convertCondition(clause.expr),
8
+ ]);
@@ -5,6 +5,7 @@ import {convertDelete} from '#parser/clause/delete';
5
5
  import {convertWithNamed} from '#parser/clause/with-named';
6
6
  import {convertCreateTable} from '#parser/clause/create-table';
7
7
  import {convertCreateSequence} from '#parser/clause/create-sequence';
8
+ import {convertUnionAll} from '#parser/clause/union';
8
9
  import {findClause} from '#parser/clause/find';
9
10
 
10
11
  export const convertClause = (stmt) => {
@@ -26,11 +27,21 @@ const convertInsertOrNamed = (stmt) => {
26
27
  return convertInsert(stmt);
27
28
  };
28
29
 
30
+ const convertSelectOrNamed = (stmt) => {
31
+ const {clauses} = stmt;
32
+
33
+ if (findClause(clauses, 'with_clause'))
34
+ return convertWithNamed(stmt);
35
+
36
+ return convertSelect(stmt);
37
+ };
38
+
29
39
  const clauseVisitors = {
30
- select_stmt: convertSelect,
40
+ select_stmt: convertSelectOrNamed,
31
41
  insert_stmt: convertInsertOrNamed,
32
42
  update_stmt: convertUpdate,
33
43
  delete_stmt: convertDelete,
34
44
  create_table_stmt: convertCreateTable,
35
45
  create_sequence_stmt: convertCreateSequence,
46
+ compound_select_stmt: convertUnionAll,
36
47
  };
@@ -1,3 +1,11 @@
1
1
  [
2
- insert(into(t, x, values(':x'))),
2
+ insert(
3
+ into(
4
+ t,
5
+ x,
6
+ values(
7
+ ':x',
8
+ ),
9
+ ),
10
+ ),
3
11
  ];
@@ -1,3 +1,17 @@
1
1
  [
2
- insert(into(t, x, values(':x')), onConflict(x, set(y === x))),
2
+ insert(
3
+ into(
4
+ t,
5
+ x,
6
+ values(
7
+ ':x',
8
+ ),
9
+ ),
10
+ onConflict(
11
+ x,
12
+ set(
13
+ y === x,
14
+ ),
15
+ ),
16
+ ),
3
17
  ];
@@ -1,3 +1,11 @@
1
1
  [
2
- insert(into(t, [x, y], values(':x', ':y'))),
2
+ insert(
3
+ into(
4
+ t, [x, y],
5
+ values(
6
+ ':x',
7
+ ':y',
8
+ ),
9
+ ),
10
+ ),
3
11
  ];
@@ -1,3 +1,18 @@
1
1
  [
2
- insert(into(t, x, values(':x')), onConflict(x, y, set(count === 1))),
2
+ insert(
3
+ into(
4
+ t,
5
+ x,
6
+ values(
7
+ ':x',
8
+ ),
9
+ ),
10
+ onConflict(
11
+ x,
12
+ y,
13
+ set(
14
+ count === 1,
15
+ ),
16
+ ),
17
+ ),
3
18
  ];
@@ -1,3 +1,20 @@
1
1
  [
2
- insert(into(t, x, values(':x')), onConflict(x, set(y === ':y')), returning(id)),
2
+ insert(
3
+ into(
4
+ t,
5
+ x,
6
+ values(
7
+ ':x',
8
+ ),
9
+ ),
10
+ onConflict(
11
+ x,
12
+ set(
13
+ y === ':y',
14
+ ),
15
+ ),
16
+ returning(
17
+ id,
18
+ ),
19
+ ),
3
20
  ];
@@ -1,7 +1,14 @@
1
1
  [
2
- insert(into(
3
- CallExpression,
4
- parent_id,
5
- values(':parent_id'),
6
- ), returning(id as 'call_id')),
2
+ insert(
3
+ into(
4
+ CallExpression,
5
+ parent_id,
6
+ values(
7
+ ':parent_id',
8
+ ),
9
+ ),
10
+ returning(
11
+ id as 'call_id',
12
+ ),
13
+ ),
7
14
  ];
@@ -1,7 +1,14 @@
1
1
  [
2
- insert(into(
3
- CallExpression,
4
- parent_id,
5
- values(':parent_id'),
6
- ), returning(id)),
2
+ insert(
3
+ into(
4
+ CallExpression,
5
+ parent_id,
6
+ values(
7
+ ':parent_id',
8
+ ),
9
+ ),
10
+ returning(
11
+ id,
12
+ ),
13
+ ),
7
14
  ];
@@ -1,3 +1,17 @@
1
1
  [
2
- insert(into(t, x, values(':x')), onConflict(x, set(name === 'hello'))),
2
+ insert(
3
+ into(
4
+ t,
5
+ x,
6
+ values(
7
+ ':x',
8
+ ),
9
+ ),
10
+ onConflict(
11
+ x,
12
+ set(
13
+ name === 'hello',
14
+ ),
15
+ ),
16
+ ),
3
17
  ];
@@ -1,3 +1,17 @@
1
1
  [
2
- insert(into(t, x, values(':x')), onConflict(x, set(x === ':x'))),
2
+ insert(
3
+ into(
4
+ t,
5
+ x,
6
+ values(
7
+ ':x',
8
+ ),
9
+ ),
10
+ onConflict(
11
+ x,
12
+ set(
13
+ x === ':x',
14
+ ),
15
+ ),
16
+ ),
3
17
  ];
@@ -1,3 +1,14 @@
1
1
  [
2
- insert(into(t, x, values(':x')), onConflict(nothing)),
2
+ insert(
3
+ into(
4
+ t,
5
+ x,
6
+ values(
7
+ ':x',
8
+ ),
9
+ ),
10
+ onConflict(
11
+ nothing,
12
+ ),
13
+ ),
3
14
  ];
@@ -1,4 +1,5 @@
1
1
  import {types} from '@putout/babel';
2
+ import {convertCount, isCount} from '#parser/clause/count';
2
3
 
3
4
  const {
4
5
  identifier,
@@ -10,6 +11,9 @@ const {
10
11
  } = types;
11
12
 
12
13
  export const convertOperand = (node) => {
14
+ if (isCount(node))
15
+ return convertCount(node);
16
+
13
17
  if (node.type === 'member_expr')
14
18
  return memberExpression(identifier(node.object.name), identifier(node.property.name));
15
19
 
@@ -1,3 +1,9 @@
1
1
  [
2
- select('msg' as 'message', 42 as 'num', from(t)),
2
+ select(
3
+ 'msg' as 'message',
4
+ 42 as 'num',
5
+ from(
6
+ t,
7
+ ),
8
+ ),
3
9
  ];
@@ -1,3 +1,8 @@
1
1
  [
2
- select(':file' as 'file', from(t)),
2
+ select(
3
+ ':file' as 'file',
4
+ from(
5
+ t,
6
+ ),
7
+ ),
3
8
  ];
@@ -1,3 +1,8 @@
1
1
  [
2
- select('*', from(users)),
2
+ select(
3
+ '*',
4
+ from(
5
+ users,
6
+ ),
7
+ ),
3
8
  ];
@@ -1,3 +1,8 @@
1
1
  [
2
- select(lastInsertRowid(), from(users)),
2
+ select(
3
+ lastInsertRowid(),
4
+ from(
5
+ users,
6
+ ),
7
+ ),
3
8
  ];
@@ -1,3 +1,8 @@
1
1
  [
2
- select(lastval(), from(users)),
2
+ select(
3
+ lastval(),
4
+ from(
5
+ users,
6
+ ),
7
+ ),
3
8
  ];
@@ -1,3 +1,11 @@
1
1
  [
2
- select('*', from(t, where(num === 42))),
2
+ select(
3
+ '*',
4
+ from(
5
+ t,
6
+ where(
7
+ num === 42,
8
+ ),
9
+ ),
10
+ ),
3
11
  ];
@@ -1,3 +1,9 @@
1
1
  [
2
- select(':arg_name', id, from(t)),
2
+ select(
3
+ ':arg_name',
4
+ id,
5
+ from(
6
+ t,
7
+ ),
8
+ ),
3
9
  ];
@@ -11,6 +11,8 @@ const {
11
11
  tsLiteralType,
12
12
  callExpression,
13
13
  memberExpression,
14
+ numericLiteral,
15
+ binaryExpression,
14
16
  } = types;
15
17
 
16
18
  const convertColumn = (column) => {
@@ -32,6 +34,16 @@ const convertColumn = (column) => {
32
34
  if (column.type === 'parameter')
33
35
  return stringLiteral(column.text);
34
36
 
37
+ if (column.type === 'number_literal')
38
+ return numericLiteral(column.value);
39
+
40
+ if (column.type === 'binary_expr')
41
+ return binaryExpression(
42
+ column.operator,
43
+ convertOperand(column.left),
44
+ convertOperand(column.right),
45
+ );
46
+
35
47
  return identifier(column.name);
36
48
  };
37
49
 
@@ -57,12 +69,16 @@ export const convertSelect = ({clauses}) => {
57
69
  const selectClause = findClause(clauses, 'select_clause');
58
70
  const fromClause = findClause(clauses, 'from_clause');
59
71
  const whereClause = findClause(clauses, 'where_clause');
72
+ const groupByClause = findClause(clauses, 'group_by_clause');
73
+ const havingClause = findClause(clauses, 'having_clause');
60
74
 
61
75
  const args = [
62
76
  ...convertColumns(selectClause.columns),
63
77
  fromClause && convertFrom({
64
78
  expr: fromClause.expr,
65
79
  whereClause,
80
+ groupByClause,
81
+ havingClause,
66
82
  }),
67
83
  ].filter(Boolean);
68
84
 
@@ -0,0 +1,10 @@
1
+ [
2
+ unionAll(
3
+ select(
4
+ 1,
5
+ ),
6
+ select(
7
+ 2,
8
+ ),
9
+ ),
10
+ ];
@@ -0,0 +1 @@
1
+ SELECT 1 UNION ALL SELECT 2
@@ -0,0 +1,11 @@
1
+ import {types} from '@putout/babel';
2
+ import {convertClause} from '#parser/clause';
3
+
4
+ const {callExpression, identifier} = types;
5
+
6
+ export const convertUnionAll = (stmt) => {
7
+ return callExpression(identifier('unionAll'), [
8
+ convertClause(stmt.left),
9
+ convertClause(stmt.right),
10
+ ]);
11
+ };
@@ -1,3 +1,11 @@
1
1
  [
2
- update(t, set(x === ':x'), where(id === ':id')),
2
+ update(
3
+ t,
4
+ set(
5
+ x === ':x',
6
+ ),
7
+ where(
8
+ id === ':id',
9
+ ),
10
+ ),
3
11
  ];
@@ -1,3 +1,11 @@
1
1
  [
2
- update(t, set(x === y), where(id === ':id')),
2
+ update(
3
+ t,
4
+ set(
5
+ x === y,
6
+ ),
7
+ where(
8
+ id === ':id',
9
+ ),
10
+ ),
3
11
  ];
@@ -1,3 +1,8 @@
1
1
  [
2
- update(t, set(x === ':x')),
2
+ update(
3
+ t,
4
+ set(
5
+ x === ':x',
6
+ ),
7
+ ),
3
8
  ];
@@ -1,3 +1,11 @@
1
1
  [
2
- update(t, set(x === 1), where(id === ':id')),
2
+ update(
3
+ t,
4
+ set(
5
+ x === 1,
6
+ ),
7
+ where(
8
+ id === ':id',
9
+ ),
10
+ ),
3
11
  ];
@@ -1,3 +1,11 @@
1
1
  [
2
- update(t, set(name === 'hello'), where(id === ':id')),
2
+ update(
3
+ t,
4
+ set(
5
+ name === 'hello',
6
+ ),
7
+ where(
8
+ id === ':id',
9
+ ),
10
+ ),
3
11
  ];
@@ -0,0 +1,11 @@
1
+ [
2
+ update(
3
+ t,
4
+ set(
5
+ x === 1,
6
+ ),
7
+ where(
8
+ a === 1 && b === 2,
9
+ ),
10
+ ),
11
+ ];
@@ -0,0 +1 @@
1
+ UPDATE t SET x = 1 WHERE a = 1 AND b = 2
@@ -0,0 +1,16 @@
1
+ [
2
+ update(
3
+ t,
4
+ set(
5
+ x === 1,
6
+ ),
7
+ where(
8
+ inList(
9
+ y,
10
+ 1,
11
+ 2,
12
+ 3,
13
+ ),
14
+ ),
15
+ ),
16
+ ];
@@ -0,0 +1 @@
1
+ UPDATE t SET x = 1 WHERE y IN (1, 2, 3)
@@ -0,0 +1,13 @@
1
+ [
2
+ update(
3
+ t,
4
+ set(
5
+ x === 1,
6
+ ),
7
+ where(
8
+ isNotNull(
9
+ y,
10
+ ),
11
+ ),
12
+ ),
13
+ ];
@@ -0,0 +1 @@
1
+ UPDATE t SET x = 1 WHERE y IS NOT NULL
@@ -0,0 +1,13 @@
1
+ [
2
+ update(
3
+ t,
4
+ set(
5
+ x === 1,
6
+ ),
7
+ where(
8
+ isNull(
9
+ y,
10
+ ),
11
+ ),
12
+ ),
13
+ ];
@@ -0,0 +1 @@
1
+ UPDATE t SET x = 1 WHERE y IS NULL
@@ -0,0 +1,14 @@
1
+ [
2
+ update(
3
+ t,
4
+ set(
5
+ x === 1,
6
+ ),
7
+ where(
8
+ like(
9
+ y,
10
+ '%a%',
11
+ ),
12
+ ),
13
+ ),
14
+ ];
@@ -0,0 +1 @@
1
+ UPDATE t SET x = 1 WHERE y LIKE '%a%'
@@ -0,0 +1,11 @@
1
+ [
2
+ update(
3
+ t,
4
+ set(
5
+ x === 1,
6
+ ),
7
+ where(
8
+ a === 1 || b === 2,
9
+ ),
10
+ ),
11
+ ];
@@ -0,0 +1 @@
1
+ UPDATE t SET x = 1 WHERE a = 1 OR b = 2
@@ -0,0 +1,11 @@
1
+ [
2
+ select(
3
+ '*',
4
+ from(
5
+ t,
6
+ where(
7
+ x === true,
8
+ ),
9
+ ),
10
+ ),
11
+ ];
@@ -0,0 +1 @@
1
+ SELECT * FROM t WHERE x = true