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.
- package/ChangeLog +16 -0
- package/lib/happy-sql.js +5 -1
- package/lib/parser/fixture/comment-fix.js +6 -1
- package/lib/parser/fixture/section-multi-fix.js +22 -4
- package/lib/parser/fixture/select-fix.js +6 -1
- package/lib/parser/fixture/with-named-fix.js +41 -9
- package/lib/parser/fixture/with-named-insert-fix.js +42 -9
- package/lib/parser/parser.js +0 -1
- package/lib/parser/visitors/clause/count/fixture/count-fix.js +8 -1
- package/lib/parser/visitors/clause/count/fixture/count-one-fix.js +8 -1
- package/lib/parser/visitors/clause/create-sequence/fixture/create-sequence-fix.js +3 -1
- package/lib/parser/visitors/clause/create-table/fixture/create-table-autoincrement-fix.js +10 -3
- package/lib/parser/visitors/clause/create-table/fixture/create-table-default-fix.js +9 -3
- package/lib/parser/visitors/clause/create-table/fixture/create-table-identity-always-fix.js +10 -3
- package/lib/parser/visitors/clause/create-table/fixture/create-table-identity-by-default-fix.js +10 -3
- package/lib/parser/visitors/clause/create-table/fixture/create-table-nextval-fix.js +16 -4
- package/lib/parser/visitors/clause/create-table/fixture/create-table-not-null-fix.js +9 -3
- package/lib/parser/visitors/clause/create-table/fixture/create-table-serial-fix.js +9 -3
- package/lib/parser/visitors/clause/delete/fixture/delete-fix.js +8 -1
- package/lib/parser/visitors/clause/from/fixture/from-fix.js +6 -1
- package/lib/parser/visitors/clause/from/fixture/from-where-fix.js +10 -1
- package/lib/parser/visitors/clause/from/fixture/group-by-fix.js +14 -0
- package/lib/parser/visitors/clause/from/fixture/group-by-having-fix.js +22 -0
- package/lib/parser/visitors/clause/from/fixture/group-by-having.sql +1 -0
- package/lib/parser/visitors/clause/from/fixture/group-by-multi-fix.js +13 -0
- package/lib/parser/visitors/clause/from/fixture/group-by-multi.sql +1 -0
- package/lib/parser/visitors/clause/from/fixture/group-by.sql +1 -0
- package/lib/parser/visitors/clause/from/fixture/join-fix.js +12 -1
- package/lib/parser/visitors/clause/from/fixture/join-multi-fix.js +19 -1
- package/lib/parser/visitors/clause/from/fixture/join-on-in-fix.js +17 -1
- package/lib/parser/visitors/clause/from/fixture/join-on-is-not-null-fix.js +14 -1
- package/lib/parser/visitors/clause/from/fixture/join-on-is-null-fix.js +14 -1
- package/lib/parser/visitors/clause/from/fixture/join-on-like-fix.js +15 -1
- package/lib/parser/visitors/clause/from/fixture/join-on-not-eq-fix.js +12 -1
- package/lib/parser/visitors/clause/from/fixture/join-on-number-fix.js +12 -1
- package/lib/parser/visitors/clause/from/fixture/join-on-or-fix.js +12 -1
- package/lib/parser/visitors/clause/from/fixture/join-on-param-fix.js +12 -1
- package/lib/parser/visitors/clause/from/from.js +10 -27
- package/lib/parser/visitors/clause/from/group-by.js +6 -0
- package/lib/parser/visitors/clause/from/having.js +8 -0
- package/lib/parser/visitors/clause/index.js +12 -1
- package/lib/parser/visitors/clause/insert/fixture/insert-fix.js +9 -1
- package/lib/parser/visitors/clause/insert/fixture/insert-identifier-fix.js +15 -1
- package/lib/parser/visitors/clause/insert/fixture/insert-multi-fix.js +9 -1
- package/lib/parser/visitors/clause/insert/fixture/insert-number-fix.js +16 -1
- package/lib/parser/visitors/clause/insert/fixture/insert-returning-conflict-fix.js +18 -1
- package/lib/parser/visitors/clause/insert/fixture/insert-returning-fix.js +12 -5
- package/lib/parser/visitors/clause/insert/fixture/insert-returning-id-fix.js +12 -5
- package/lib/parser/visitors/clause/insert/fixture/insert-string-fix.js +15 -1
- package/lib/parser/visitors/clause/on-conflict/fixture/on-conflict-fix.js +15 -1
- package/lib/parser/visitors/clause/on-conflict/fixture/on-conflict-nothing-fix.js +12 -1
- package/lib/parser/visitors/clause/operand.js +4 -0
- package/lib/parser/visitors/clause/select/fixture/select-alias-fix.js +7 -1
- package/lib/parser/visitors/clause/select/fixture/select-alias-param-fix.js +6 -1
- package/lib/parser/visitors/clause/select/fixture/select-fix.js +6 -1
- package/lib/parser/visitors/clause/select/fixture/select-last-insert-rowid-fix.js +6 -1
- package/lib/parser/visitors/clause/select/fixture/select-lastval-fix.js +6 -1
- package/lib/parser/visitors/clause/select/fixture/select-number-fix.js +9 -1
- package/lib/parser/visitors/clause/select/fixture/select-param-fix.js +7 -1
- package/lib/parser/visitors/clause/select/select.js +16 -0
- package/lib/parser/visitors/clause/union/fixture/union-all-fix.js +10 -0
- package/lib/parser/visitors/clause/union/fixture/union-all.sql +1 -0
- package/lib/parser/visitors/clause/union/union.js +11 -0
- package/lib/parser/visitors/clause/update/fixture/update-fix.js +9 -1
- package/lib/parser/visitors/clause/update/fixture/update-identifier-fix.js +9 -1
- package/lib/parser/visitors/clause/update/fixture/update-no-where-fix.js +6 -1
- package/lib/parser/visitors/clause/update/fixture/update-number-fix.js +9 -1
- package/lib/parser/visitors/clause/update/fixture/update-string-fix.js +9 -1
- package/lib/parser/visitors/clause/update/fixture/update-where-and-fix.js +11 -0
- package/lib/parser/visitors/clause/update/fixture/update-where-and.sql +1 -0
- package/lib/parser/visitors/clause/update/fixture/update-where-in-fix.js +16 -0
- package/lib/parser/visitors/clause/update/fixture/update-where-in.sql +1 -0
- package/lib/parser/visitors/clause/update/fixture/update-where-is-not-null-fix.js +13 -0
- package/lib/parser/visitors/clause/update/fixture/update-where-is-not-null.sql +1 -0
- package/lib/parser/visitors/clause/update/fixture/update-where-is-null-fix.js +13 -0
- package/lib/parser/visitors/clause/update/fixture/update-where-is-null.sql +1 -0
- package/lib/parser/visitors/clause/update/fixture/update-where-like-fix.js +14 -0
- package/lib/parser/visitors/clause/update/fixture/update-where-like.sql +1 -0
- package/lib/parser/visitors/clause/update/fixture/update-where-or-fix.js +11 -0
- package/lib/parser/visitors/clause/update/fixture/update-where-or.sql +1 -0
- package/lib/parser/visitors/clause/where/fixture/where-boolean-fix.js +11 -0
- package/lib/parser/visitors/clause/where/fixture/where-boolean.sql +1 -0
- package/lib/parser/visitors/clause/where/fixture/where-compare-fix.js +9 -1
- package/lib/parser/visitors/clause/where/fixture/where-fix.js +9 -1
- package/lib/parser/visitors/clause/where/fixture/where-gte-fix.js +9 -1
- package/lib/parser/visitors/clause/where/fixture/where-in-fix.js +14 -1
- package/lib/parser/visitors/clause/where/fixture/where-is-not-null-fix.js +11 -1
- package/lib/parser/visitors/clause/where/fixture/where-is-null-fix.js +11 -1
- package/lib/parser/visitors/clause/where/fixture/where-like-fix.js +12 -1
- package/lib/parser/visitors/clause/where/fixture/where-member-fix.js +11 -0
- package/lib/parser/visitors/clause/where/fixture/where-member.sql +1 -0
- package/lib/parser/visitors/clause/where/fixture/where-not-eq-fix.js +9 -1
- package/lib/parser/visitors/clause/where/fixture/where-null-fix.js +11 -0
- package/lib/parser/visitors/clause/where/fixture/where-null.sql +1 -0
- package/lib/parser/visitors/clause/where/fixture/where-number-fix.js +9 -1
- package/lib/parser/visitors/clause/where/fixture/where-or-fix.js +9 -1
- package/lib/parser/visitors/clause/where/where.js +1 -1
- package/lib/parser/visitors/clause/with-named/fixture/with-named-select-fix.js +19 -0
- package/lib/parser/visitors/clause/with-named/fixture/with-named-select.sql +1 -0
- package/lib/parser/visitors/clause/with-named/fixture/with-recursive-fix.js +27 -0
- package/lib/parser/visitors/clause/with-named/fixture/with-recursive-multi-fix.js +38 -0
- package/lib/parser/visitors/clause/with-named/fixture/with-recursive-multi.sql +1 -0
- package/lib/parser/visitors/clause/with-named/fixture/with-recursive-no-columns-fix.js +20 -0
- package/lib/parser/visitors/clause/with-named/fixture/with-recursive-no-columns.sql +1 -0
- package/lib/parser/visitors/clause/with-named/fixture/with-recursive.sql +1 -0
- package/lib/parser/visitors/clause/with-named/with-named.js +15 -2
- package/lib/printer/visitors/array-expression.js +4 -2
- package/lib/printer/visitors/call-expression/clauses/clauses.js +8 -0
- package/lib/printer/visitors/call-expression/clauses/column/column.js +1 -1
- package/lib/printer/visitors/call-expression/clauses/create-table/create-table.js +7 -3
- package/lib/printer/visitors/call-expression/clauses/delete/delete.js +1 -1
- package/lib/printer/visitors/call-expression/clauses/from/fixture/group-by-having-fix.sql +5 -0
- package/lib/printer/visitors/call-expression/clauses/from/fixture/group-by-having.js +22 -0
- package/lib/printer/visitors/call-expression/clauses/from/from.js +13 -6
- package/lib/printer/visitors/call-expression/clauses/group-by/fixture/group-by-fix.sql +3 -0
- package/lib/printer/visitors/call-expression/clauses/group-by/fixture/group-by-multi-fix.sql +3 -0
- package/lib/printer/visitors/call-expression/clauses/group-by/fixture/group-by-multi.js +13 -0
- package/lib/printer/visitors/call-expression/clauses/group-by/fixture/group-by.js +14 -0
- package/lib/printer/visitors/call-expression/clauses/group-by/group-by.js +12 -0
- package/lib/printer/visitors/call-expression/clauses/having/fixture/having-fix.sql +3 -0
- package/lib/printer/visitors/call-expression/clauses/having/fixture/having.js +16 -0
- package/lib/printer/visitors/call-expression/clauses/having/having.js +4 -0
- package/lib/printer/visitors/call-expression/clauses/insert/insert.js +1 -1
- package/lib/printer/visitors/call-expression/clauses/into/into.js +1 -1
- package/lib/printer/visitors/call-expression/clauses/join/join.js +3 -2
- package/lib/printer/visitors/call-expression/clauses/select/select.js +1 -1
- package/lib/printer/visitors/call-expression/clauses/union-all/fixture/union-all-fix.sql +3 -0
- package/lib/printer/visitors/call-expression/clauses/union-all/fixture/union-all.js +1 -0
- package/lib/printer/visitors/call-expression/clauses/union-all/union-all.js +9 -0
- package/lib/printer/visitors/call-expression/clauses/update/update.js +2 -2
- package/lib/printer/visitors/call-expression/clauses/with-named/fixture/with-named-insert-fix.sql +3 -3
- package/lib/printer/visitors/call-expression/clauses/with-named/fixture/with-named-select-fix.sql +8 -0
- package/lib/printer/visitors/call-expression/clauses/with-named/fixture/with-named-select.js +19 -0
- package/lib/printer/visitors/call-expression/clauses/with-named/fixture/withNamed-fix.sql +3 -3
- package/lib/printer/visitors/call-expression/clauses/with-named/with-named.js +23 -6
- package/lib/printer/visitors/call-expression/clauses/with-recursive/fixture/with-recursive-fix.sql +10 -0
- package/lib/printer/visitors/call-expression/clauses/with-recursive/fixture/with-recursive-multi-fix.sql +14 -0
- package/lib/printer/visitors/call-expression/clauses/with-recursive/fixture/with-recursive-multi.js +38 -0
- package/lib/printer/visitors/call-expression/clauses/with-recursive/fixture/with-recursive-no-columns-fix.sql +8 -0
- package/lib/printer/visitors/call-expression/clauses/with-recursive/fixture/with-recursive-no-columns.js +20 -0
- package/lib/printer/visitors/call-expression/clauses/with-recursive/fixture/with-recursive.js +27 -0
- package/lib/printer/visitors/call-expression/clauses/with-recursive/with-recursive.js +57 -0
- package/package.json +2 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
SELECT * FROM t WHERE a.b = 1
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
SELECT * FROM t WHERE x = NULL
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
WITH recent AS (SELECT id FROM users WHERE kind = 'const') SELECT id FROM recent
|
|
@@ -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,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 @@
|
|
|
1
|
+
WITH RECURSIVE t AS (SELECT 1 UNION ALL SELECT 2), u(a, b) AS (SELECT 1, 2 UNION ALL SELECT a, b FROM t) SELECT a, b FROM u
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
WITH RECURSIVE t AS (SELECT 1 UNION ALL SELECT 2) SELECT * FROM t
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
WITH RECURSIVE numbers(value) AS (SELECT 1 UNION ALL SELECT value + 1 FROM numbers WHERE value < 10) SELECT value FROM numbers
|
|
@@ -6,6 +6,7 @@ const {
|
|
|
6
6
|
identifier,
|
|
7
7
|
assignmentExpression,
|
|
8
8
|
callExpression,
|
|
9
|
+
stringLiteral,
|
|
9
10
|
} = types;
|
|
10
11
|
|
|
11
12
|
const isWithClause = (clause) => clause.type !== 'with_clause';
|
|
@@ -14,18 +15,30 @@ const convertTable = ({table, expr}) => {
|
|
|
14
15
|
return assignmentExpression('=', identifier(table.name), convertClause(expr.expr));
|
|
15
16
|
};
|
|
16
17
|
|
|
18
|
+
// recursive CTE: numbers('value', unionAll(...))
|
|
19
|
+
const convertRecursiveTable = ({table, columns, expr}) => {
|
|
20
|
+
const colArgs = columns ? columns.expr.items.map((column) => stringLiteral(column.name)) : [];
|
|
21
|
+
const body = convertClause(expr.expr);
|
|
22
|
+
|
|
23
|
+
return callExpression(identifier(table.name), [...colArgs, body]);
|
|
24
|
+
};
|
|
25
|
+
|
|
17
26
|
export const convertWithNamed = (stmt) => {
|
|
18
27
|
const withClause = findClause(stmt.clauses, 'with_clause');
|
|
28
|
+
const isRecursive = Boolean(withClause.recursiveKw);
|
|
29
|
+
const fnName = isRecursive ? 'withRecursive' : 'withNamed';
|
|
19
30
|
|
|
20
31
|
const finalStatement = convertClause({
|
|
21
32
|
...stmt,
|
|
22
33
|
clauses: stmt.clauses.filter(isWithClause),
|
|
23
34
|
});
|
|
24
35
|
|
|
36
|
+
const convertCte = isRecursive ? convertRecursiveTable : convertTable;
|
|
37
|
+
|
|
25
38
|
const args = [
|
|
26
|
-
...withClause.tables.items.map(
|
|
39
|
+
...withClause.tables.items.map(convertCte),
|
|
27
40
|
finalStatement,
|
|
28
41
|
];
|
|
29
42
|
|
|
30
|
-
return callExpression(identifier(
|
|
43
|
+
return callExpression(identifier(fnName), args);
|
|
31
44
|
};
|
|
@@ -14,6 +14,10 @@ import {section} from './section/section.js';
|
|
|
14
14
|
import {count} from './count/count.js';
|
|
15
15
|
import {returning} from './returning/returning.js';
|
|
16
16
|
import {withNamed} from './with-named/with-named.js';
|
|
17
|
+
import {withRecursive} from './with-recursive/with-recursive.js';
|
|
18
|
+
import {unionAll} from './union-all/union-all.js';
|
|
19
|
+
import {groupBy} from './group-by/group-by.js';
|
|
20
|
+
import {having} from './having/having.js';
|
|
17
21
|
import {createTable} from './create-table/create-table.js';
|
|
18
22
|
import {createSequence} from './create-sequence/create-sequence.js';
|
|
19
23
|
import {column} from './column/column.js';
|
|
@@ -48,6 +52,10 @@ export const clauses = {
|
|
|
48
52
|
section,
|
|
49
53
|
returning,
|
|
50
54
|
withNamed,
|
|
55
|
+
withRecursive,
|
|
56
|
+
unionAll,
|
|
57
|
+
groupBy,
|
|
58
|
+
having,
|
|
51
59
|
createTable,
|
|
52
60
|
createSequence,
|
|
53
61
|
column,
|
|
@@ -3,13 +3,17 @@ export const createTable = (path, {write, traverse}) => {
|
|
|
3
3
|
|
|
4
4
|
write('CREATE TABLE ');
|
|
5
5
|
traverse(name);
|
|
6
|
-
write(
|
|
6
|
+
write.space();
|
|
7
|
+
write('(');
|
|
8
|
+
write.newline();
|
|
7
9
|
|
|
8
10
|
const elements = columns.get('elements');
|
|
9
11
|
|
|
10
12
|
for (const [i, element] of elements.entries()) {
|
|
11
|
-
if (i > 0)
|
|
12
|
-
write('
|
|
13
|
+
if (i > 0) {
|
|
14
|
+
write(',');
|
|
15
|
+
write.newline();
|
|
16
|
+
}
|
|
13
17
|
|
|
14
18
|
traverse(element);
|
|
15
19
|
}
|
|
@@ -7,6 +7,14 @@ const printAsExpression = (path, {write, traverse}) => {
|
|
|
7
7
|
write(` AS ${path.node.typeAnnotation.literal.value}`);
|
|
8
8
|
};
|
|
9
9
|
|
|
10
|
+
const CLAUSE_NAMES = [
|
|
11
|
+
'where',
|
|
12
|
+
'groupBy',
|
|
13
|
+
'having',
|
|
14
|
+
];
|
|
15
|
+
|
|
16
|
+
const isClause = ({node}) => node.type === 'CallExpression' && CLAUSE_NAMES.includes(node.callee?.name);
|
|
17
|
+
|
|
10
18
|
const printArg = (path, ctx) => {
|
|
11
19
|
if (isTSAsExpression(path.node))
|
|
12
20
|
return printAsExpression(path, ctx);
|
|
@@ -16,9 +24,8 @@ const printArg = (path, ctx) => {
|
|
|
16
24
|
|
|
17
25
|
export const from = (path, {write, traverse}) => {
|
|
18
26
|
const args = path.get('arguments');
|
|
19
|
-
const
|
|
20
|
-
const
|
|
21
|
-
const tableArgs = hasWhere ? args.slice(0, -1) : args;
|
|
27
|
+
const tableArgs = args.filter((arg) => !isClause(arg));
|
|
28
|
+
const clauseArgs = args.filter(isClause);
|
|
22
29
|
|
|
23
30
|
write('FROM ');
|
|
24
31
|
printArg(tableArgs[0], {
|
|
@@ -32,8 +39,8 @@ export const from = (path, {write, traverse}) => {
|
|
|
32
39
|
traverse,
|
|
33
40
|
});
|
|
34
41
|
|
|
35
|
-
|
|
36
|
-
write(
|
|
37
|
-
traverse(
|
|
42
|
+
for (const clause of clauseArgs) {
|
|
43
|
+
write.breakline();
|
|
44
|
+
traverse(clause);
|
|
38
45
|
}
|
|
39
46
|
};
|
|
@@ -17,11 +17,12 @@ const printTable = (path, ctx) => {
|
|
|
17
17
|
export const join = (path, {write, traverse}) => {
|
|
18
18
|
const [table, onClause] = path.get('arguments');
|
|
19
19
|
|
|
20
|
-
write(
|
|
20
|
+
write.breakline();
|
|
21
|
+
write('JOIN ');
|
|
21
22
|
printTable(table, {
|
|
22
23
|
write,
|
|
23
24
|
traverse,
|
|
24
25
|
});
|
|
25
|
-
write(
|
|
26
|
+
write.space();
|
|
26
27
|
traverse(onClause);
|
|
27
28
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[unionAll(select(1), select(2))];
|