Skip to content

Commit aacd1b6

Browse files
authored
Merge pull request #418 from outerbase/rewrite-sqlite-script-parser
Rewrite the sqlite create script parser.
2 parents bc7e670 + 58c8b20 commit aacd1b6

File tree

7 files changed

+645
-511
lines changed

7 files changed

+645
-511
lines changed
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
import type { DatabaseTableColumnConstraint } from "@/drivers/base-driver";
2+
import { tokenizeSql } from "@outerbase/sdk-transform";
3+
import { CursorV2, parseColumnConstraint } from "./sql-parse-table";
4+
5+
// Parse column constraint
6+
function pcc(sql: string) {
7+
return parseColumnConstraint(
8+
"main",
9+
new CursorV2(tokenizeSql(sql, "sqlite"))
10+
);
11+
}
12+
13+
describe("parse column constraint", () => {
14+
test("constraint this_is_primary_key primary key autoincrement", () => {
15+
expect(
16+
pcc("constraint this_is_primary_key primary key autoincrement")
17+
).toEqual({
18+
name: "this_is_primary_key",
19+
primaryKey: true,
20+
autoIncrement: true,
21+
} as DatabaseTableColumnConstraint);
22+
});
23+
test("primary key with multiple columns", () => {
24+
expect(pcc("primary key(first_name, last_name)")).toEqual({
25+
primaryKey: true,
26+
autoIncrement: false,
27+
primaryColumns: ["first_name", "last_name"],
28+
} as DatabaseTableColumnConstraint);
29+
});
30+
31+
test("primary key with conflict clause and not null", () => {
32+
expect(pcc("primary key on conflict rollback not null")).toEqual({
33+
primaryKey: true,
34+
autoIncrement: false,
35+
primaryKeyConflict: "ROLLBACK",
36+
notNull: true,
37+
} as DatabaseTableColumnConstraint);
38+
});
39+
40+
test("not null before primary key with conflict clause", () => {
41+
expect(pcc("not null primary key on conflict rollback")).toEqual({
42+
primaryKey: true,
43+
autoIncrement: false,
44+
primaryKeyConflict: "ROLLBACK",
45+
notNull: true,
46+
} as DatabaseTableColumnConstraint);
47+
});
48+
49+
test("unique with conflict clause", () => {
50+
expect(pcc("unique on conflict rollback")).toEqual({
51+
unique: true,
52+
uniqueConflict: "ROLLBACK",
53+
} as DatabaseTableColumnConstraint);
54+
});
55+
56+
test("default with string value", () => {
57+
expect(pcc(`default 'Visal'`)).toEqual({
58+
defaultValue: "Visal",
59+
} as DatabaseTableColumnConstraint);
60+
});
61+
62+
test("default with negative number", () => {
63+
expect(pcc(`default -5`)).toEqual({
64+
defaultValue: -5,
65+
} as DatabaseTableColumnConstraint);
66+
});
67+
68+
test("default with positive decimal", () => {
69+
expect(pcc(`default +5.5`)).toEqual({
70+
defaultValue: 5.5,
71+
} as DatabaseTableColumnConstraint);
72+
});
73+
74+
test("default with decimal", () => {
75+
expect(pcc(`default 5.5`)).toEqual({
76+
defaultValue: 5.5,
77+
} as DatabaseTableColumnConstraint);
78+
});
79+
80+
test("default with function", () => {
81+
expect(pcc(`default current_timestamp`)).toEqual({
82+
defaultExpression: "current_timestamp",
83+
} as DatabaseTableColumnConstraint);
84+
});
85+
86+
test("default with expression", () => {
87+
expect(pcc(`default (round(julianday('now')))`)).toEqual({
88+
defaultExpression: `round(julianday('now'))`,
89+
} as DatabaseTableColumnConstraint);
90+
});
91+
92+
test("foreign key with references", () => {
93+
expect(
94+
pcc(`foreign key ("user_id") references "users" on delete cascade ("id")`)
95+
).toEqual({
96+
foreignKey: {
97+
foreignSchemaName: "main",
98+
columns: ["user_id"],
99+
foreignTableName: "users",
100+
foreignColumns: ["id"],
101+
},
102+
} as DatabaseTableColumnConstraint);
103+
});
104+
105+
test("references shorthand", () => {
106+
expect(pcc(`references "users" on delete cascade ("id")`)).toEqual({
107+
foreignKey: {
108+
foreignSchemaName: "main",
109+
foreignTableName: "users",
110+
foreignColumns: ["id"],
111+
},
112+
} as DatabaseTableColumnConstraint);
113+
});
114+
115+
test("generated column", () => {
116+
expect(pcc(`generated always as (price * qty) virtual`)).toEqual({
117+
generatedExpression: "price * qty",
118+
generatedType: "VIRTUAL",
119+
} as DatabaseTableColumnConstraint);
120+
});
121+
});

0 commit comments

Comments
 (0)