relq 1.0.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/LICENSE +21 -0
- package/README.md +862 -0
- package/dist/addons/buffer.js +1869 -0
- package/dist/addons/pg-cursor.js +1425 -0
- package/dist/addons/pg-format.js +2248 -0
- package/dist/addons/pg.js +4790 -0
- package/dist/bin/relq.js +2 -0
- package/dist/cjs/cache/index.cjs +9 -0
- package/dist/cjs/cache/query-cache.cjs +311 -0
- package/dist/cjs/cli/commands/add.cjs +82 -0
- package/dist/cjs/cli/commands/commit.cjs +145 -0
- package/dist/cjs/cli/commands/diff.cjs +84 -0
- package/dist/cjs/cli/commands/export.cjs +333 -0
- package/dist/cjs/cli/commands/fetch.cjs +59 -0
- package/dist/cjs/cli/commands/generate.cjs +242 -0
- package/dist/cjs/cli/commands/history.cjs +165 -0
- package/dist/cjs/cli/commands/import.cjs +524 -0
- package/dist/cjs/cli/commands/init.cjs +437 -0
- package/dist/cjs/cli/commands/introspect.cjs +142 -0
- package/dist/cjs/cli/commands/log.cjs +62 -0
- package/dist/cjs/cli/commands/migrate.cjs +167 -0
- package/dist/cjs/cli/commands/pull.cjs +410 -0
- package/dist/cjs/cli/commands/push.cjs +165 -0
- package/dist/cjs/cli/commands/rollback.cjs +169 -0
- package/dist/cjs/cli/commands/status.cjs +110 -0
- package/dist/cjs/cli/commands/sync.cjs +79 -0
- package/dist/cjs/cli/index.cjs +275 -0
- package/dist/cjs/cli/utils/change-tracker.cjs +446 -0
- package/dist/cjs/cli/utils/commit-manager.cjs +239 -0
- package/dist/cjs/cli/utils/config-loader.cjs +127 -0
- package/dist/cjs/cli/utils/env-loader.cjs +62 -0
- package/dist/cjs/cli/utils/fast-introspect.cjs +398 -0
- package/dist/cjs/cli/utils/git-utils.cjs +404 -0
- package/dist/cjs/cli/utils/migration-generator.cjs +269 -0
- package/dist/cjs/cli/utils/relqignore.cjs +114 -0
- package/dist/cjs/cli/utils/repo-manager.cjs +515 -0
- package/dist/cjs/cli/utils/schema-comparator.cjs +313 -0
- package/dist/cjs/cli/utils/schema-diff.cjs +284 -0
- package/dist/cjs/cli/utils/schema-hash.cjs +108 -0
- package/dist/cjs/cli/utils/schema-introspect.cjs +455 -0
- package/dist/cjs/cli/utils/snapshot-manager.cjs +223 -0
- package/dist/cjs/cli/utils/spinner.cjs +108 -0
- package/dist/cjs/cli/utils/sql-generator.cjs +520 -0
- package/dist/cjs/cli/utils/sql-parser.cjs +999 -0
- package/dist/cjs/cli/utils/type-generator.cjs +2061 -0
- package/dist/cjs/condition/array-condition-builder.cjs +503 -0
- package/dist/cjs/condition/array-numeric-condition-builder.cjs +186 -0
- package/dist/cjs/condition/array-specialized-condition-builder.cjs +206 -0
- package/dist/cjs/condition/array-string-condition-builder.cjs +146 -0
- package/dist/cjs/condition/base-condition-builder.cjs +2 -0
- package/dist/cjs/condition/condition-collector.cjs +284 -0
- package/dist/cjs/condition/fulltext-condition-builder.cjs +61 -0
- package/dist/cjs/condition/geometric-condition-builder.cjs +208 -0
- package/dist/cjs/condition/index.cjs +25 -0
- package/dist/cjs/condition/jsonb-condition-builder.cjs +160 -0
- package/dist/cjs/condition/network-condition-builder.cjs +230 -0
- package/dist/cjs/condition/range-condition-builder.cjs +82 -0
- package/dist/cjs/config/config.cjs +190 -0
- package/dist/cjs/config/index.cjs +9 -0
- package/dist/cjs/constants/pg-values.cjs +68 -0
- package/dist/cjs/copy/copy-builder.cjs +316 -0
- package/dist/cjs/copy/index.cjs +6 -0
- package/dist/cjs/core/query-builder.cjs +440 -0
- package/dist/cjs/core/relq-client.cjs +1831 -0
- package/dist/cjs/core/typed-kuery-client.cjs +2 -0
- package/dist/cjs/count/count-builder.cjs +88 -0
- package/dist/cjs/count/index.cjs +5 -0
- package/dist/cjs/cte/cte-builder.cjs +89 -0
- package/dist/cjs/cte/index.cjs +5 -0
- package/dist/cjs/ddl/function.cjs +48 -0
- package/dist/cjs/ddl/index.cjs +7 -0
- package/dist/cjs/ddl/sql.cjs +54 -0
- package/dist/cjs/delete/delete-builder.cjs +135 -0
- package/dist/cjs/delete/index.cjs +5 -0
- package/dist/cjs/errors/relq-errors.cjs +329 -0
- package/dist/cjs/examples/fulltext-search-test.cjs +122 -0
- package/dist/cjs/explain/explain-builder.cjs +99 -0
- package/dist/cjs/explain/index.cjs +5 -0
- package/dist/cjs/function/create-function-builder.cjs +196 -0
- package/dist/cjs/function/index.cjs +6 -0
- package/dist/cjs/functions/advanced-functions.cjs +241 -0
- package/dist/cjs/functions/case-builder.cjs +66 -0
- package/dist/cjs/functions/geometric-functions.cjs +104 -0
- package/dist/cjs/functions/index.cjs +184 -0
- package/dist/cjs/functions/network-functions.cjs +86 -0
- package/dist/cjs/functions/sql-functions.cjs +431 -0
- package/dist/cjs/index.cjs +164 -0
- package/dist/cjs/indexing/create-index-builder.cjs +187 -0
- package/dist/cjs/indexing/drop-index-builder.cjs +89 -0
- package/dist/cjs/indexing/index-types.cjs +2 -0
- package/dist/cjs/indexing/index.cjs +8 -0
- package/dist/cjs/insert/conflict-builder.cjs +173 -0
- package/dist/cjs/insert/index.cjs +5 -0
- package/dist/cjs/insert/insert-builder.cjs +254 -0
- package/dist/cjs/introspect/index.cjs +229 -0
- package/dist/cjs/maintenance/index.cjs +6 -0
- package/dist/cjs/maintenance/vacuum-builder.cjs +166 -0
- package/dist/cjs/pubsub/index.cjs +7 -0
- package/dist/cjs/pubsub/listen-notify-builder.cjs +57 -0
- package/dist/cjs/pubsub/listener-connection.cjs +180 -0
- package/dist/cjs/raw/index.cjs +5 -0
- package/dist/cjs/raw/raw-query-builder.cjs +27 -0
- package/dist/cjs/schema/index.cjs +15 -0
- package/dist/cjs/schema/schema-builder.cjs +1167 -0
- package/dist/cjs/schema-builder.cjs +21 -0
- package/dist/cjs/schema-definition/column-types.cjs +829 -0
- package/dist/cjs/schema-definition/index.cjs +62 -0
- package/dist/cjs/schema-definition/introspection.cjs +620 -0
- package/dist/cjs/schema-definition/partitions.cjs +129 -0
- package/dist/cjs/schema-definition/pg-enum.cjs +76 -0
- package/dist/cjs/schema-definition/pg-function.cjs +91 -0
- package/dist/cjs/schema-definition/pg-sequence.cjs +56 -0
- package/dist/cjs/schema-definition/pg-trigger.cjs +108 -0
- package/dist/cjs/schema-definition/relations.cjs +98 -0
- package/dist/cjs/schema-definition/sql-expressions.cjs +202 -0
- package/dist/cjs/schema-definition/table-definition.cjs +636 -0
- package/dist/cjs/select/aggregate-builder.cjs +179 -0
- package/dist/cjs/select/index.cjs +5 -0
- package/dist/cjs/select/select-builder.cjs +233 -0
- package/dist/cjs/sequence/index.cjs +7 -0
- package/dist/cjs/sequence/sequence-builder.cjs +264 -0
- package/dist/cjs/table/alter-table-builder.cjs +146 -0
- package/dist/cjs/table/constraint-builder.cjs +102 -0
- package/dist/cjs/table/create-table-builder.cjs +248 -0
- package/dist/cjs/table/index.cjs +17 -0
- package/dist/cjs/table/partition-builder.cjs +131 -0
- package/dist/cjs/table/truncate-builder.cjs +70 -0
- package/dist/cjs/transaction/index.cjs +6 -0
- package/dist/cjs/transaction/transaction-builder.cjs +78 -0
- package/dist/cjs/trigger/create-trigger-builder.cjs +174 -0
- package/dist/cjs/trigger/index.cjs +6 -0
- package/dist/cjs/types/aggregate-types.cjs +2 -0
- package/dist/cjs/types/config-types.cjs +40 -0
- package/dist/cjs/types/inference-types.cjs +18 -0
- package/dist/cjs/types/pagination-types.cjs +7 -0
- package/dist/cjs/types/result-types.cjs +2 -0
- package/dist/cjs/types/schema-types.cjs +2 -0
- package/dist/cjs/types/subscription-types.cjs +2 -0
- package/dist/cjs/types.cjs +2 -0
- package/dist/cjs/update/array-update-builder.cjs +205 -0
- package/dist/cjs/update/index.cjs +13 -0
- package/dist/cjs/update/update-builder.cjs +195 -0
- package/dist/cjs/utils/case-converter.cjs +58 -0
- package/dist/cjs/utils/environment-detection.cjs +120 -0
- package/dist/cjs/utils/index.cjs +10 -0
- package/dist/cjs/utils/pool-defaults.cjs +106 -0
- package/dist/cjs/utils/type-coercion.cjs +118 -0
- package/dist/cjs/view/create-view-builder.cjs +180 -0
- package/dist/cjs/view/index.cjs +7 -0
- package/dist/cjs/window/index.cjs +5 -0
- package/dist/cjs/window/window-builder.cjs +80 -0
- package/dist/config.cjs +1 -0
- package/dist/config.d.ts +655 -0
- package/dist/config.js +1 -0
- package/dist/esm/cache/index.js +1 -0
- package/dist/esm/cache/query-cache.js +303 -0
- package/dist/esm/cli/commands/add.js +78 -0
- package/dist/esm/cli/commands/commit.js +109 -0
- package/dist/esm/cli/commands/diff.js +81 -0
- package/dist/esm/cli/commands/export.js +297 -0
- package/dist/esm/cli/commands/fetch.js +56 -0
- package/dist/esm/cli/commands/generate.js +206 -0
- package/dist/esm/cli/commands/history.js +129 -0
- package/dist/esm/cli/commands/import.js +488 -0
- package/dist/esm/cli/commands/init.js +401 -0
- package/dist/esm/cli/commands/introspect.js +106 -0
- package/dist/esm/cli/commands/log.js +59 -0
- package/dist/esm/cli/commands/migrate.js +131 -0
- package/dist/esm/cli/commands/pull.js +374 -0
- package/dist/esm/cli/commands/push.js +129 -0
- package/dist/esm/cli/commands/rollback.js +133 -0
- package/dist/esm/cli/commands/status.js +107 -0
- package/dist/esm/cli/commands/sync.js +76 -0
- package/dist/esm/cli/index.js +240 -0
- package/dist/esm/cli/utils/change-tracker.js +405 -0
- package/dist/esm/cli/utils/commit-manager.js +191 -0
- package/dist/esm/cli/utils/config-loader.js +86 -0
- package/dist/esm/cli/utils/env-loader.js +57 -0
- package/dist/esm/cli/utils/fast-introspect.js +362 -0
- package/dist/esm/cli/utils/git-utils.js +347 -0
- package/dist/esm/cli/utils/migration-generator.js +263 -0
- package/dist/esm/cli/utils/relqignore.js +74 -0
- package/dist/esm/cli/utils/repo-manager.js +444 -0
- package/dist/esm/cli/utils/schema-comparator.js +307 -0
- package/dist/esm/cli/utils/schema-diff.js +276 -0
- package/dist/esm/cli/utils/schema-hash.js +69 -0
- package/dist/esm/cli/utils/schema-introspect.js +418 -0
- package/dist/esm/cli/utils/snapshot-manager.js +179 -0
- package/dist/esm/cli/utils/spinner.js +101 -0
- package/dist/esm/cli/utils/sql-generator.js +504 -0
- package/dist/esm/cli/utils/sql-parser.js +992 -0
- package/dist/esm/cli/utils/type-generator.js +2058 -0
- package/dist/esm/condition/array-condition-builder.js +495 -0
- package/dist/esm/condition/array-numeric-condition-builder.js +182 -0
- package/dist/esm/condition/array-specialized-condition-builder.js +200 -0
- package/dist/esm/condition/array-string-condition-builder.js +142 -0
- package/dist/esm/condition/base-condition-builder.js +1 -0
- package/dist/esm/condition/condition-collector.js +275 -0
- package/dist/esm/condition/fulltext-condition-builder.js +53 -0
- package/dist/esm/condition/geometric-condition-builder.js +200 -0
- package/dist/esm/condition/index.js +7 -0
- package/dist/esm/condition/jsonb-condition-builder.js +152 -0
- package/dist/esm/condition/network-condition-builder.js +222 -0
- package/dist/esm/condition/range-condition-builder.js +74 -0
- package/dist/esm/config/config.js +150 -0
- package/dist/esm/config/index.js +1 -0
- package/dist/esm/constants/pg-values.js +63 -0
- package/dist/esm/copy/copy-builder.js +308 -0
- package/dist/esm/copy/index.js +1 -0
- package/dist/esm/core/query-builder.js +426 -0
- package/dist/esm/core/relq-client.js +1791 -0
- package/dist/esm/core/typed-kuery-client.js +1 -0
- package/dist/esm/count/count-builder.js +81 -0
- package/dist/esm/count/index.js +1 -0
- package/dist/esm/cte/cte-builder.js +82 -0
- package/dist/esm/cte/index.js +1 -0
- package/dist/esm/ddl/function.js +45 -0
- package/dist/esm/ddl/index.js +2 -0
- package/dist/esm/ddl/sql.js +51 -0
- package/dist/esm/delete/delete-builder.js +128 -0
- package/dist/esm/delete/index.js +1 -0
- package/dist/esm/errors/relq-errors.js +310 -0
- package/dist/esm/examples/fulltext-search-test.js +117 -0
- package/dist/esm/explain/explain-builder.js +95 -0
- package/dist/esm/explain/index.js +1 -0
- package/dist/esm/function/create-function-builder.js +188 -0
- package/dist/esm/function/index.js +1 -0
- package/dist/esm/functions/advanced-functions.js +231 -0
- package/dist/esm/functions/case-builder.js +58 -0
- package/dist/esm/functions/geometric-functions.js +97 -0
- package/dist/esm/functions/index.js +171 -0
- package/dist/esm/functions/network-functions.js +79 -0
- package/dist/esm/functions/sql-functions.js +421 -0
- package/dist/esm/index.js +34 -0
- package/dist/esm/indexing/create-index-builder.js +180 -0
- package/dist/esm/indexing/drop-index-builder.js +81 -0
- package/dist/esm/indexing/index-types.js +1 -0
- package/dist/esm/indexing/index.js +2 -0
- package/dist/esm/insert/conflict-builder.js +162 -0
- package/dist/esm/insert/index.js +1 -0
- package/dist/esm/insert/insert-builder.js +247 -0
- package/dist/esm/introspect/index.js +224 -0
- package/dist/esm/maintenance/index.js +1 -0
- package/dist/esm/maintenance/vacuum-builder.js +158 -0
- package/dist/esm/pubsub/index.js +1 -0
- package/dist/esm/pubsub/listen-notify-builder.js +48 -0
- package/dist/esm/pubsub/listener-connection.js +173 -0
- package/dist/esm/raw/index.js +1 -0
- package/dist/esm/raw/raw-query-builder.js +20 -0
- package/dist/esm/schema/index.js +1 -0
- package/dist/esm/schema/schema-builder.js +1150 -0
- package/dist/esm/schema-builder.js +2 -0
- package/dist/esm/schema-definition/column-types.js +738 -0
- package/dist/esm/schema-definition/index.js +10 -0
- package/dist/esm/schema-definition/introspection.js +614 -0
- package/dist/esm/schema-definition/partitions.js +123 -0
- package/dist/esm/schema-definition/pg-enum.js +70 -0
- package/dist/esm/schema-definition/pg-function.js +85 -0
- package/dist/esm/schema-definition/pg-sequence.js +50 -0
- package/dist/esm/schema-definition/pg-trigger.js +102 -0
- package/dist/esm/schema-definition/relations.js +90 -0
- package/dist/esm/schema-definition/sql-expressions.js +193 -0
- package/dist/esm/schema-definition/table-definition.js +630 -0
- package/dist/esm/select/aggregate-builder.js +172 -0
- package/dist/esm/select/index.js +1 -0
- package/dist/esm/select/select-builder.js +226 -0
- package/dist/esm/sequence/index.js +1 -0
- package/dist/esm/sequence/sequence-builder.js +255 -0
- package/dist/esm/table/alter-table-builder.js +138 -0
- package/dist/esm/table/constraint-builder.js +95 -0
- package/dist/esm/table/create-table-builder.js +241 -0
- package/dist/esm/table/index.js +5 -0
- package/dist/esm/table/partition-builder.js +121 -0
- package/dist/esm/table/truncate-builder.js +63 -0
- package/dist/esm/transaction/index.js +1 -0
- package/dist/esm/transaction/transaction-builder.js +70 -0
- package/dist/esm/trigger/create-trigger-builder.js +166 -0
- package/dist/esm/trigger/index.js +1 -0
- package/dist/esm/types/aggregate-types.js +1 -0
- package/dist/esm/types/config-types.js +36 -0
- package/dist/esm/types/inference-types.js +12 -0
- package/dist/esm/types/pagination-types.js +4 -0
- package/dist/esm/types/result-types.js +1 -0
- package/dist/esm/types/schema-types.js +1 -0
- package/dist/esm/types/subscription-types.js +1 -0
- package/dist/esm/types.js +1 -0
- package/dist/esm/update/array-update-builder.js +192 -0
- package/dist/esm/update/index.js +2 -0
- package/dist/esm/update/update-builder.js +188 -0
- package/dist/esm/utils/case-converter.js +55 -0
- package/dist/esm/utils/environment-detection.js +113 -0
- package/dist/esm/utils/index.js +2 -0
- package/dist/esm/utils/pool-defaults.js +100 -0
- package/dist/esm/utils/type-coercion.js +110 -0
- package/dist/esm/view/create-view-builder.js +171 -0
- package/dist/esm/view/index.js +1 -0
- package/dist/esm/window/index.js +1 -0
- package/dist/esm/window/window-builder.js +73 -0
- package/dist/index.cjs +1 -0
- package/dist/index.d.ts +10341 -0
- package/dist/index.js +1 -0
- package/dist/schema-builder.cjs +1 -0
- package/dist/schema-builder.d.ts +2272 -0
- package/dist/schema-builder.js +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,630 @@
|
|
|
1
|
+
import format from "../../addons/pg-format.js";
|
|
2
|
+
import { partitionStrategyFactory } from "./partitions.js";
|
|
3
|
+
import { sqlFunctions, expressionBuilder } from "./sql-expressions.js";
|
|
4
|
+
function formatWhereValue(val) {
|
|
5
|
+
if (val === null)
|
|
6
|
+
return 'NULL';
|
|
7
|
+
if (typeof val === 'number')
|
|
8
|
+
return String(val);
|
|
9
|
+
if (typeof val === 'boolean')
|
|
10
|
+
return val ? 'TRUE' : 'FALSE';
|
|
11
|
+
if (typeof val === 'string')
|
|
12
|
+
return `'${val.replace(/'/g, "''")}'`;
|
|
13
|
+
if (val && typeof val === 'object' && '$sql' in val)
|
|
14
|
+
return val.$sql;
|
|
15
|
+
return String(val);
|
|
16
|
+
}
|
|
17
|
+
function whereCondition(sql) {
|
|
18
|
+
return {
|
|
19
|
+
$sql: sql,
|
|
20
|
+
$expr: true,
|
|
21
|
+
and(other) {
|
|
22
|
+
return whereCondition(`(${this.$sql}) AND (${other.$sql})`);
|
|
23
|
+
},
|
|
24
|
+
or(other) {
|
|
25
|
+
return whereCondition(`(${this.$sql}) OR (${other.$sql})`);
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function createColumnExpr(colName) {
|
|
30
|
+
const sql = colName.startsWith('"') ? colName : `"${colName}"`;
|
|
31
|
+
const self = {
|
|
32
|
+
$sql: sql,
|
|
33
|
+
$expr: true,
|
|
34
|
+
eq(value) {
|
|
35
|
+
return whereCondition(`${this.$sql} = ${formatWhereValue(value)}`);
|
|
36
|
+
},
|
|
37
|
+
neq(value) {
|
|
38
|
+
return whereCondition(`${this.$sql} != ${formatWhereValue(value)}`);
|
|
39
|
+
},
|
|
40
|
+
gt(value) {
|
|
41
|
+
return whereCondition(`${this.$sql} > ${formatWhereValue(value)}`);
|
|
42
|
+
},
|
|
43
|
+
gte(value) {
|
|
44
|
+
return whereCondition(`${this.$sql} >= ${formatWhereValue(value)}`);
|
|
45
|
+
},
|
|
46
|
+
lt(value) {
|
|
47
|
+
return whereCondition(`${this.$sql} < ${formatWhereValue(value)}`);
|
|
48
|
+
},
|
|
49
|
+
lte(value) {
|
|
50
|
+
return whereCondition(`${this.$sql} <= ${formatWhereValue(value)}`);
|
|
51
|
+
},
|
|
52
|
+
isNull() {
|
|
53
|
+
return whereCondition(`${this.$sql} IS NULL`);
|
|
54
|
+
},
|
|
55
|
+
isNotNull() {
|
|
56
|
+
return whereCondition(`${this.$sql} IS NOT NULL`);
|
|
57
|
+
},
|
|
58
|
+
in(values) {
|
|
59
|
+
return whereCondition(`${this.$sql} IN (${values.map(formatWhereValue).join(', ')})`);
|
|
60
|
+
},
|
|
61
|
+
notIn(values) {
|
|
62
|
+
return whereCondition(`${this.$sql} NOT IN (${values.map(formatWhereValue).join(', ')})`);
|
|
63
|
+
},
|
|
64
|
+
between(min, max) {
|
|
65
|
+
return whereCondition(`${this.$sql} BETWEEN ${formatWhereValue(min)} AND ${formatWhereValue(max)}`);
|
|
66
|
+
},
|
|
67
|
+
like(pattern) {
|
|
68
|
+
return whereCondition(`${this.$sql} LIKE '${pattern.replace(/'/g, "''")}'`);
|
|
69
|
+
},
|
|
70
|
+
ilike(pattern) {
|
|
71
|
+
return whereCondition(`${this.$sql} ILIKE '${pattern.replace(/'/g, "''")}'`);
|
|
72
|
+
},
|
|
73
|
+
plus(value) {
|
|
74
|
+
const valSql = typeof value === 'number' ? String(value) : value.$sql;
|
|
75
|
+
return createColumnExprFromSql(`(${this.$sql} + ${valSql})`);
|
|
76
|
+
},
|
|
77
|
+
minus(value) {
|
|
78
|
+
const valSql = typeof value === 'number' ? String(value) : value.$sql;
|
|
79
|
+
return createColumnExprFromSql(`(${this.$sql} - ${valSql})`);
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
return self;
|
|
83
|
+
}
|
|
84
|
+
function createColumnExprFromSql(sql) {
|
|
85
|
+
const expr = createColumnExpr('dummy');
|
|
86
|
+
expr.$sql = sql;
|
|
87
|
+
return expr;
|
|
88
|
+
}
|
|
89
|
+
function createIndexWhereBuilder() {
|
|
90
|
+
return {
|
|
91
|
+
col(name) {
|
|
92
|
+
const colName = String(name);
|
|
93
|
+
return createColumnExpr(colName);
|
|
94
|
+
},
|
|
95
|
+
eq(col, value) {
|
|
96
|
+
return createColumnExpr(String(col)).eq(value);
|
|
97
|
+
},
|
|
98
|
+
neq(col, value) {
|
|
99
|
+
return createColumnExpr(String(col)).neq(value);
|
|
100
|
+
},
|
|
101
|
+
gt(col, value) {
|
|
102
|
+
return createColumnExpr(String(col)).gt(value);
|
|
103
|
+
},
|
|
104
|
+
gte(col, value) {
|
|
105
|
+
return createColumnExpr(String(col)).gte(value);
|
|
106
|
+
},
|
|
107
|
+
lt(col, value) {
|
|
108
|
+
return createColumnExpr(String(col)).lt(value);
|
|
109
|
+
},
|
|
110
|
+
lte(col, value) {
|
|
111
|
+
return createColumnExpr(String(col)).lte(value);
|
|
112
|
+
},
|
|
113
|
+
isNull(col) {
|
|
114
|
+
return createColumnExpr(String(col)).isNull();
|
|
115
|
+
},
|
|
116
|
+
isNotNull(col) {
|
|
117
|
+
return createColumnExpr(String(col)).isNotNull();
|
|
118
|
+
},
|
|
119
|
+
between(col, min, max) {
|
|
120
|
+
const colName = String(col);
|
|
121
|
+
const sql = colName.startsWith('"') ? colName : `"${colName}"`;
|
|
122
|
+
return whereCondition(`${sql} BETWEEN ${formatWhereValue(min)} AND ${formatWhereValue(max)}`);
|
|
123
|
+
},
|
|
124
|
+
fn: sqlFunctions,
|
|
125
|
+
currentDate() {
|
|
126
|
+
return createColumnExprFromSql('CURRENT_DATE');
|
|
127
|
+
},
|
|
128
|
+
currentTimestamp() {
|
|
129
|
+
return createColumnExprFromSql('CURRENT_TIMESTAMP');
|
|
130
|
+
},
|
|
131
|
+
now() {
|
|
132
|
+
return createColumnExprFromSql('NOW()');
|
|
133
|
+
},
|
|
134
|
+
interval(value) {
|
|
135
|
+
return { $sql: `INTERVAL '${value}'`, $expr: true };
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
function createCheckExpr(sql) {
|
|
140
|
+
const formatVal = (val) => {
|
|
141
|
+
if (val === null)
|
|
142
|
+
return 'NULL';
|
|
143
|
+
if (typeof val === 'number')
|
|
144
|
+
return String(val);
|
|
145
|
+
if (typeof val === 'boolean')
|
|
146
|
+
return val ? 'TRUE' : 'FALSE';
|
|
147
|
+
if (typeof val === 'string')
|
|
148
|
+
return `'${val.replace(/'/g, "''")}'`;
|
|
149
|
+
if (val && typeof val === 'object' && '$sql' in val)
|
|
150
|
+
return val.$sql;
|
|
151
|
+
return String(val);
|
|
152
|
+
};
|
|
153
|
+
const expr = {
|
|
154
|
+
$sql: sql,
|
|
155
|
+
$expr: true,
|
|
156
|
+
gte(value) {
|
|
157
|
+
return createCheckWhereCondition(`${this.$sql} >= ${formatVal(value)}`);
|
|
158
|
+
},
|
|
159
|
+
lte(value) {
|
|
160
|
+
return createCheckWhereCondition(`${this.$sql} <= ${formatVal(value)}`);
|
|
161
|
+
},
|
|
162
|
+
gt(value) {
|
|
163
|
+
return createCheckWhereCondition(`${this.$sql} > ${formatVal(value)}`);
|
|
164
|
+
},
|
|
165
|
+
lt(value) {
|
|
166
|
+
return createCheckWhereCondition(`${this.$sql} < ${formatVal(value)}`);
|
|
167
|
+
},
|
|
168
|
+
eq(value) {
|
|
169
|
+
return createCheckWhereCondition(`${this.$sql} = ${formatVal(value)}`);
|
|
170
|
+
},
|
|
171
|
+
neq(value) {
|
|
172
|
+
return createCheckWhereCondition(`${this.$sql} != ${formatVal(value)}`);
|
|
173
|
+
},
|
|
174
|
+
isNull() {
|
|
175
|
+
return createCheckWhereCondition(`${this.$sql} IS NULL`);
|
|
176
|
+
},
|
|
177
|
+
isNotNull() {
|
|
178
|
+
return createCheckWhereCondition(`${this.$sql} IS NOT NULL`);
|
|
179
|
+
},
|
|
180
|
+
in(values) {
|
|
181
|
+
return createCheckWhereCondition(`${this.$sql} IN (${values.map(formatVal).join(', ')})`);
|
|
182
|
+
},
|
|
183
|
+
notIn(values) {
|
|
184
|
+
return createCheckWhereCondition(`${this.$sql} NOT IN (${values.map(formatVal).join(', ')})`);
|
|
185
|
+
},
|
|
186
|
+
between(min, max) {
|
|
187
|
+
return createCheckWhereCondition(`${this.$sql} BETWEEN ${formatVal(min)} AND ${formatVal(max)}`);
|
|
188
|
+
},
|
|
189
|
+
like(pattern) {
|
|
190
|
+
return createCheckWhereCondition(`${this.$sql} LIKE '${pattern.replace(/'/g, "''")}'`);
|
|
191
|
+
},
|
|
192
|
+
ilike(pattern) {
|
|
193
|
+
return createCheckWhereCondition(`${this.$sql} ILIKE '${pattern.replace(/'/g, "''")}'`);
|
|
194
|
+
},
|
|
195
|
+
matches(pattern) {
|
|
196
|
+
return createCheckWhereCondition(`${this.$sql} ~ '${pattern.replace(/'/g, "''")}'`);
|
|
197
|
+
},
|
|
198
|
+
matchesInsensitive(pattern) {
|
|
199
|
+
return createCheckWhereCondition(`${this.$sql} ~* '${pattern.replace(/'/g, "''")}'`);
|
|
200
|
+
},
|
|
201
|
+
plus(value) {
|
|
202
|
+
const valSql = typeof value === 'number' ? String(value) : value.$sql;
|
|
203
|
+
return createCheckExpr(`(${this.$sql} + ${valSql})`);
|
|
204
|
+
},
|
|
205
|
+
minus(value) {
|
|
206
|
+
const valSql = typeof value === 'number' ? String(value) : value.$sql;
|
|
207
|
+
return createCheckExpr(`(${this.$sql} - ${valSql})`);
|
|
208
|
+
},
|
|
209
|
+
times(value) {
|
|
210
|
+
const valSql = typeof value === 'number' ? String(value) : value.$sql;
|
|
211
|
+
return createCheckExpr(`(${this.$sql} * ${valSql})`);
|
|
212
|
+
},
|
|
213
|
+
dividedBy(value) {
|
|
214
|
+
const valSql = typeof value === 'number' ? String(value) : value.$sql;
|
|
215
|
+
return createCheckExpr(`(${this.$sql} / ${valSql})`);
|
|
216
|
+
},
|
|
217
|
+
length() {
|
|
218
|
+
return createCheckExpr(`LENGTH(${this.$sql})`);
|
|
219
|
+
},
|
|
220
|
+
asText() {
|
|
221
|
+
return createCheckExpr(`(${this.$sql})::TEXT`);
|
|
222
|
+
},
|
|
223
|
+
abs() {
|
|
224
|
+
return createCheckExpr(`ABS(${this.$sql})`);
|
|
225
|
+
},
|
|
226
|
+
};
|
|
227
|
+
return expr;
|
|
228
|
+
}
|
|
229
|
+
function createCheckWhereCondition(sql) {
|
|
230
|
+
return {
|
|
231
|
+
$sql: sql,
|
|
232
|
+
$expr: true,
|
|
233
|
+
and(other) {
|
|
234
|
+
return createCheckWhereCondition(`(${this.$sql}) AND (${other.$sql})`);
|
|
235
|
+
},
|
|
236
|
+
or(other) {
|
|
237
|
+
return createCheckWhereCondition(`(${this.$sql}) OR (${other.$sql})`);
|
|
238
|
+
},
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
function createCheckTableRefs(columns) {
|
|
242
|
+
const refs = {};
|
|
243
|
+
for (const key of Object.keys(columns)) {
|
|
244
|
+
const col = columns[key];
|
|
245
|
+
const colName = col.$columnName || key;
|
|
246
|
+
refs[key] = createCheckExpr(`"${colName}"`);
|
|
247
|
+
}
|
|
248
|
+
return refs;
|
|
249
|
+
}
|
|
250
|
+
function createCheckConstraintBuilder() {
|
|
251
|
+
return {
|
|
252
|
+
col(name) {
|
|
253
|
+
return createCheckExpr(`"${String(name)}"`);
|
|
254
|
+
},
|
|
255
|
+
constraint(name, condition) {
|
|
256
|
+
return { name, expression: condition.$sql };
|
|
257
|
+
},
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
function createColumnRefs(columns) {
|
|
261
|
+
const refs = {};
|
|
262
|
+
for (const key of Object.keys(columns)) {
|
|
263
|
+
const col = columns[key];
|
|
264
|
+
const colName = col.$columnName || key;
|
|
265
|
+
refs[key] = colName;
|
|
266
|
+
}
|
|
267
|
+
return refs;
|
|
268
|
+
}
|
|
269
|
+
function createIndexFactory() {
|
|
270
|
+
const factory = (name) => {
|
|
271
|
+
const def = {
|
|
272
|
+
name,
|
|
273
|
+
columns: [],
|
|
274
|
+
};
|
|
275
|
+
const chain = {
|
|
276
|
+
...def,
|
|
277
|
+
unique() {
|
|
278
|
+
def.unique = true;
|
|
279
|
+
return Object.assign(this, { unique: true });
|
|
280
|
+
},
|
|
281
|
+
using(method) {
|
|
282
|
+
def.using = method;
|
|
283
|
+
return Object.assign(this, { using: method });
|
|
284
|
+
},
|
|
285
|
+
where(condition) {
|
|
286
|
+
if (typeof condition === 'function') {
|
|
287
|
+
const whereBuilder = createIndexWhereBuilder();
|
|
288
|
+
const result = condition(whereBuilder);
|
|
289
|
+
def.where = result.$sql;
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
def.where = condition.$sql;
|
|
293
|
+
}
|
|
294
|
+
return Object.assign(this, { where: def.where });
|
|
295
|
+
},
|
|
296
|
+
with(options) {
|
|
297
|
+
def.with = options;
|
|
298
|
+
return Object.assign(this, { with: options });
|
|
299
|
+
},
|
|
300
|
+
tablespace(name) {
|
|
301
|
+
def.tablespace = name;
|
|
302
|
+
return Object.assign(this, { tablespace: name });
|
|
303
|
+
},
|
|
304
|
+
nullsFirst() {
|
|
305
|
+
def.nulls = 'first';
|
|
306
|
+
return Object.assign(this, { nulls: 'first' });
|
|
307
|
+
},
|
|
308
|
+
nullsLast() {
|
|
309
|
+
def.nulls = 'last';
|
|
310
|
+
return Object.assign(this, { nulls: 'last' });
|
|
311
|
+
},
|
|
312
|
+
asc() {
|
|
313
|
+
def.order = 'asc';
|
|
314
|
+
return Object.assign(this, { order: 'asc' });
|
|
315
|
+
},
|
|
316
|
+
desc() {
|
|
317
|
+
def.order = 'desc';
|
|
318
|
+
return Object.assign(this, { order: 'desc' });
|
|
319
|
+
},
|
|
320
|
+
include(...columns) {
|
|
321
|
+
def.include = columns;
|
|
322
|
+
return Object.assign(this, { include: columns });
|
|
323
|
+
},
|
|
324
|
+
opclass(opclass) {
|
|
325
|
+
def._opclass = opclass;
|
|
326
|
+
return Object.assign(this, { _opclass: opclass });
|
|
327
|
+
},
|
|
328
|
+
};
|
|
329
|
+
return {
|
|
330
|
+
on(...columns) {
|
|
331
|
+
def.columns = columns.map(c => {
|
|
332
|
+
if (typeof c === 'string')
|
|
333
|
+
return c;
|
|
334
|
+
return c.$sql;
|
|
335
|
+
});
|
|
336
|
+
return Object.assign(chain, def);
|
|
337
|
+
},
|
|
338
|
+
expression(callback) {
|
|
339
|
+
const result = callback(expressionBuilder);
|
|
340
|
+
def.expression = result.$sql;
|
|
341
|
+
def.columns = [result.$sql];
|
|
342
|
+
return Object.assign(chain, def);
|
|
343
|
+
},
|
|
344
|
+
};
|
|
345
|
+
};
|
|
346
|
+
return factory;
|
|
347
|
+
}
|
|
348
|
+
const indexFactory = createIndexFactory();
|
|
349
|
+
export function defineTable(name, columns, options) {
|
|
350
|
+
const columnRefs = createColumnRefs(columns);
|
|
351
|
+
let resolvedIndexes;
|
|
352
|
+
if (options?.indexes) {
|
|
353
|
+
if (typeof options.indexes === 'function') {
|
|
354
|
+
const rawIndexes = options.indexes(columnRefs, indexFactory, sqlFunctions);
|
|
355
|
+
resolvedIndexes = rawIndexes.map(normalizeIndexDef);
|
|
356
|
+
}
|
|
357
|
+
else {
|
|
358
|
+
resolvedIndexes = options.indexes.map(normalizeIndexDef);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
let resolvedPartitionBy;
|
|
362
|
+
if (options?.partitionBy) {
|
|
363
|
+
resolvedPartitionBy = options.partitionBy(columnRefs, partitionStrategyFactory);
|
|
364
|
+
}
|
|
365
|
+
let resolvedCheckConstraints;
|
|
366
|
+
if (options?.checkConstraints) {
|
|
367
|
+
const checkTableRefs = createCheckTableRefs(columns);
|
|
368
|
+
const checkBuilder = createCheckConstraintBuilder();
|
|
369
|
+
const constraints = options.checkConstraints(checkTableRefs, checkBuilder);
|
|
370
|
+
resolvedCheckConstraints = constraints.map(c => ({ expression: c.expression, name: c.name }));
|
|
371
|
+
}
|
|
372
|
+
const definition = {
|
|
373
|
+
$name: name,
|
|
374
|
+
$schema: options?.schema,
|
|
375
|
+
$columns: columns,
|
|
376
|
+
$primaryKey: options?.primaryKey,
|
|
377
|
+
$uniqueConstraints: options?.uniqueConstraints,
|
|
378
|
+
$checkConstraints: resolvedCheckConstraints,
|
|
379
|
+
$foreignKeys: options?.foreignKeys,
|
|
380
|
+
$indexes: resolvedIndexes,
|
|
381
|
+
$inherits: options?.inherits,
|
|
382
|
+
$partitionBy: resolvedPartitionBy,
|
|
383
|
+
$tablespace: options?.tablespace,
|
|
384
|
+
$withOptions: options?.withOptions,
|
|
385
|
+
$inferSelect: {},
|
|
386
|
+
$inferInsert: {},
|
|
387
|
+
toSQL() {
|
|
388
|
+
return generateCreateTableSQL(this);
|
|
389
|
+
},
|
|
390
|
+
toCreateIndexSQL() {
|
|
391
|
+
return generateIndexSQL(this);
|
|
392
|
+
}
|
|
393
|
+
};
|
|
394
|
+
return definition;
|
|
395
|
+
}
|
|
396
|
+
function normalizeIndexDef(idx) {
|
|
397
|
+
const unique = typeof idx.unique === 'function' ? true : (idx.unique || idx.isUnique || false);
|
|
398
|
+
const using = typeof idx.using === 'function' ? undefined : (idx.using || idx.method);
|
|
399
|
+
const where = typeof idx.where === 'function' ? undefined : idx.where;
|
|
400
|
+
const withOpts = typeof idx.with === 'function' ? undefined : idx.with;
|
|
401
|
+
const tablespace = typeof idx.tablespace === 'function' ? undefined : idx.tablespace;
|
|
402
|
+
return {
|
|
403
|
+
name: idx.name,
|
|
404
|
+
columns: idx.columns || [],
|
|
405
|
+
unique,
|
|
406
|
+
using,
|
|
407
|
+
where,
|
|
408
|
+
with: withOpts,
|
|
409
|
+
tablespace,
|
|
410
|
+
nulls: idx.nulls,
|
|
411
|
+
order: idx.order,
|
|
412
|
+
include: idx.include,
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
function generateCreateTableSQL(def) {
|
|
416
|
+
const tableName = def.$schema
|
|
417
|
+
? `${format.ident(def.$schema)}.${format.ident(def.$name)}`
|
|
418
|
+
: format.ident(def.$name);
|
|
419
|
+
const parts = [`CREATE TABLE ${tableName} (`];
|
|
420
|
+
const columnDefs = [];
|
|
421
|
+
const constraints = [];
|
|
422
|
+
for (const [colName, colConfig] of Object.entries(def.$columns)) {
|
|
423
|
+
columnDefs.push(generateColumnSQL(colName, colConfig));
|
|
424
|
+
if (colConfig.$check) {
|
|
425
|
+
constraints.push(`CHECK (${colConfig.$check})`);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
if (def.$primaryKey && def.$primaryKey.length > 0) {
|
|
429
|
+
const pkCols = def.$primaryKey.map(c => format.ident(c)).join(', ');
|
|
430
|
+
constraints.push(`PRIMARY KEY (${pkCols})`);
|
|
431
|
+
}
|
|
432
|
+
if (def.$uniqueConstraints) {
|
|
433
|
+
for (const uc of def.$uniqueConstraints) {
|
|
434
|
+
const cols = uc.columns.map(c => format.ident(c)).join(', ');
|
|
435
|
+
if (uc.name) {
|
|
436
|
+
constraints.push(`CONSTRAINT ${format.ident(uc.name)} UNIQUE (${cols})`);
|
|
437
|
+
}
|
|
438
|
+
else {
|
|
439
|
+
constraints.push(`UNIQUE (${cols})`);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
if (def.$checkConstraints) {
|
|
444
|
+
for (const cc of def.$checkConstraints) {
|
|
445
|
+
if (cc.name) {
|
|
446
|
+
constraints.push(`CONSTRAINT ${format.ident(cc.name)} CHECK (${cc.expression})`);
|
|
447
|
+
}
|
|
448
|
+
else {
|
|
449
|
+
constraints.push(`CHECK (${cc.expression})`);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
if (def.$foreignKeys) {
|
|
454
|
+
for (const fk of def.$foreignKeys) {
|
|
455
|
+
const cols = fk.columns.map(c => format.ident(c)).join(', ');
|
|
456
|
+
const refCols = fk.references.columns.map(c => format.ident(c)).join(', ');
|
|
457
|
+
let fkDef = `FOREIGN KEY (${cols}) REFERENCES ${format.ident(fk.references.table)} (${refCols})`;
|
|
458
|
+
if (fk.onDelete) {
|
|
459
|
+
fkDef += ` ON DELETE ${fk.onDelete}`;
|
|
460
|
+
}
|
|
461
|
+
if (fk.onUpdate) {
|
|
462
|
+
fkDef += ` ON UPDATE ${fk.onUpdate}`;
|
|
463
|
+
}
|
|
464
|
+
if (fk.name) {
|
|
465
|
+
constraints.push(`CONSTRAINT ${format.ident(fk.name)} ${fkDef}`);
|
|
466
|
+
}
|
|
467
|
+
else {
|
|
468
|
+
constraints.push(fkDef);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
parts.push([...columnDefs, ...constraints].join(',\n '));
|
|
473
|
+
parts.push(')');
|
|
474
|
+
if (def.$inherits && def.$inherits.length > 0) {
|
|
475
|
+
parts.push(`INHERITS (${def.$inherits.map(t => format.ident(t)).join(', ')})`);
|
|
476
|
+
}
|
|
477
|
+
if (def.$partitionBy) {
|
|
478
|
+
const col = format.ident(def.$partitionBy.$column);
|
|
479
|
+
parts.push(`PARTITION BY ${def.$partitionBy.$type} (${col})`);
|
|
480
|
+
}
|
|
481
|
+
if (def.$withOptions && Object.keys(def.$withOptions).length > 0) {
|
|
482
|
+
const opts = Object.entries(def.$withOptions)
|
|
483
|
+
.map(([k, v]) => `${k} = ${v}`)
|
|
484
|
+
.join(', ');
|
|
485
|
+
parts.push(`WITH (${opts})`);
|
|
486
|
+
}
|
|
487
|
+
if (def.$tablespace) {
|
|
488
|
+
parts.push(`TABLESPACE ${format.ident(def.$tablespace)}`);
|
|
489
|
+
}
|
|
490
|
+
return parts.join(' ');
|
|
491
|
+
}
|
|
492
|
+
function generateColumnSQL(name, config) {
|
|
493
|
+
const actualName = config.$columnName || name;
|
|
494
|
+
const parts = [format.ident(actualName)];
|
|
495
|
+
let typeName = config.$type;
|
|
496
|
+
if (config.$array) {
|
|
497
|
+
const dims = config.$dimensions ?? 1;
|
|
498
|
+
typeName += '[]'.repeat(dims);
|
|
499
|
+
}
|
|
500
|
+
parts.push(typeName);
|
|
501
|
+
if (config.$nullable === false) {
|
|
502
|
+
parts.push('NOT NULL');
|
|
503
|
+
}
|
|
504
|
+
if (config.$primaryKey) {
|
|
505
|
+
parts.push('PRIMARY KEY');
|
|
506
|
+
}
|
|
507
|
+
if (config.$unique) {
|
|
508
|
+
parts.push('UNIQUE');
|
|
509
|
+
}
|
|
510
|
+
if (config.$default !== undefined) {
|
|
511
|
+
const defaultVal = typeof config.$default === 'function'
|
|
512
|
+
? config.$default()
|
|
513
|
+
: config.$default;
|
|
514
|
+
if (typeof defaultVal === 'symbol') {
|
|
515
|
+
const symDesc = defaultVal.description || String(defaultVal);
|
|
516
|
+
if (symDesc.includes('emptyObject')) {
|
|
517
|
+
parts.push(`DEFAULT '{}'::jsonb`);
|
|
518
|
+
}
|
|
519
|
+
else if (symDesc.includes('emptyArray')) {
|
|
520
|
+
parts.push(`DEFAULT '[]'::jsonb`);
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
else if (Array.isArray(defaultVal)) {
|
|
524
|
+
parts.push(`DEFAULT '${JSON.stringify(defaultVal)}'::jsonb`);
|
|
525
|
+
}
|
|
526
|
+
else if (typeof defaultVal === 'object' && defaultVal !== null) {
|
|
527
|
+
parts.push(`DEFAULT '${JSON.stringify(defaultVal)}'::jsonb`);
|
|
528
|
+
}
|
|
529
|
+
else if (typeof defaultVal === 'string' && (defaultVal.includes('(') ||
|
|
530
|
+
defaultVal.toUpperCase() === 'NOW()' ||
|
|
531
|
+
defaultVal.toUpperCase() === 'CURRENT_TIMESTAMP' ||
|
|
532
|
+
defaultVal.toUpperCase() === 'CURRENT_DATE' ||
|
|
533
|
+
defaultVal.toUpperCase() === 'CURRENT_TIME' ||
|
|
534
|
+
defaultVal.toUpperCase().startsWith('GEN_RANDOM_UUID') ||
|
|
535
|
+
defaultVal.toUpperCase() === 'TRUE' ||
|
|
536
|
+
defaultVal.toUpperCase() === 'FALSE' ||
|
|
537
|
+
defaultVal.toUpperCase() === 'NULL')) {
|
|
538
|
+
parts.push(`DEFAULT ${defaultVal}`);
|
|
539
|
+
}
|
|
540
|
+
else if (typeof defaultVal === 'boolean') {
|
|
541
|
+
parts.push(`DEFAULT ${defaultVal ? 'TRUE' : 'FALSE'}`);
|
|
542
|
+
}
|
|
543
|
+
else if (typeof defaultVal === 'number') {
|
|
544
|
+
parts.push(`DEFAULT ${defaultVal}`);
|
|
545
|
+
}
|
|
546
|
+
else if (defaultVal === null) {
|
|
547
|
+
parts.push('DEFAULT NULL');
|
|
548
|
+
}
|
|
549
|
+
else {
|
|
550
|
+
parts.push(`DEFAULT ${format('%L', String(defaultVal))}`);
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
if (config.$references) {
|
|
554
|
+
parts.push(`REFERENCES ${format.ident(config.$references.table)}(${format.ident(config.$references.column)})`);
|
|
555
|
+
if (config.$references.onDelete) {
|
|
556
|
+
parts.push(`ON DELETE ${config.$references.onDelete}`);
|
|
557
|
+
}
|
|
558
|
+
if (config.$references.onUpdate) {
|
|
559
|
+
parts.push(`ON UPDATE ${config.$references.onUpdate}`);
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
if (config.$generated) {
|
|
563
|
+
const stored = config.$generated.stored !== false ? 'STORED' : '';
|
|
564
|
+
parts.push(`GENERATED ALWAYS AS (${config.$generated.expression}) ${stored}`.trim());
|
|
565
|
+
}
|
|
566
|
+
return parts.join(' ');
|
|
567
|
+
}
|
|
568
|
+
function generateIndexSQL(def) {
|
|
569
|
+
if (!def.$indexes)
|
|
570
|
+
return [];
|
|
571
|
+
const tableName = def.$schema
|
|
572
|
+
? `${format.ident(def.$schema)}.${format.ident(def.$name)}`
|
|
573
|
+
: format.ident(def.$name);
|
|
574
|
+
return def.$indexes.map(idx => {
|
|
575
|
+
const indexName = idx.name ?? `idx_${def.$name}_${idx.columns.join('_')}`;
|
|
576
|
+
const colExprs = idx.columns.map(c => {
|
|
577
|
+
let expr = format.ident(c);
|
|
578
|
+
if (idx.order) {
|
|
579
|
+
expr += ` ${idx.order.toUpperCase()}`;
|
|
580
|
+
}
|
|
581
|
+
if (idx.nulls) {
|
|
582
|
+
expr += ` NULLS ${idx.nulls.toUpperCase()}`;
|
|
583
|
+
}
|
|
584
|
+
return expr;
|
|
585
|
+
});
|
|
586
|
+
let sql = 'CREATE';
|
|
587
|
+
if (idx.unique) {
|
|
588
|
+
sql += ' UNIQUE';
|
|
589
|
+
}
|
|
590
|
+
sql += ` INDEX ${format.ident(indexName)} ON ${tableName}`;
|
|
591
|
+
if (idx.using) {
|
|
592
|
+
sql += ` USING ${idx.using}`;
|
|
593
|
+
}
|
|
594
|
+
sql += ` (${colExprs.join(', ')})`;
|
|
595
|
+
if (idx.include && idx.include.length > 0) {
|
|
596
|
+
sql += ` INCLUDE (${idx.include.map(c => format.ident(c)).join(', ')})`;
|
|
597
|
+
}
|
|
598
|
+
if (idx.with) {
|
|
599
|
+
const withParts = [];
|
|
600
|
+
if (idx.with.fillfactor !== undefined) {
|
|
601
|
+
withParts.push(`fillfactor = ${idx.with.fillfactor}`);
|
|
602
|
+
}
|
|
603
|
+
if (idx.with.fastupdate !== undefined) {
|
|
604
|
+
withParts.push(`fastupdate = ${idx.with.fastupdate ? 'on' : 'off'}`);
|
|
605
|
+
}
|
|
606
|
+
if (idx.with.ginPendingListLimit !== undefined) {
|
|
607
|
+
withParts.push(`gin_pending_list_limit = ${idx.with.ginPendingListLimit}`);
|
|
608
|
+
}
|
|
609
|
+
if (idx.with.pagesPerRange !== undefined) {
|
|
610
|
+
withParts.push(`pages_per_range = ${idx.with.pagesPerRange}`);
|
|
611
|
+
}
|
|
612
|
+
if (idx.with.autosummarize !== undefined) {
|
|
613
|
+
withParts.push(`autosummarize = ${idx.with.autosummarize ? 'on' : 'off'}`);
|
|
614
|
+
}
|
|
615
|
+
if (idx.with.buffering !== undefined) {
|
|
616
|
+
withParts.push(`buffering = ${idx.with.buffering}`);
|
|
617
|
+
}
|
|
618
|
+
if (withParts.length > 0) {
|
|
619
|
+
sql += ` WITH (${withParts.join(', ')})`;
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
if (idx.tablespace) {
|
|
623
|
+
sql += ` TABLESPACE ${format.ident(idx.tablespace)}`;
|
|
624
|
+
}
|
|
625
|
+
if (idx.where) {
|
|
626
|
+
sql += ` WHERE ${idx.where}`;
|
|
627
|
+
}
|
|
628
|
+
return sql;
|
|
629
|
+
});
|
|
630
|
+
}
|