effect-qb 0.14.0 → 0.15.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/dist/mysql.js +61270 -4259
- package/dist/postgres/metadata.js +176 -82
- package/dist/postgres.js +5903 -3316
- package/package.json +14 -1
- package/src/internal/aggregation-validation.ts +3 -3
- package/src/internal/case-analysis.d.ts +18 -0
- package/src/internal/case-analysis.ts +4 -4
- package/src/internal/coercion/analysis.d.ts +7 -0
- package/src/internal/{coercion-analysis.ts → coercion/analysis.ts} +3 -3
- package/src/internal/coercion/errors.d.ts +17 -0
- package/src/internal/{coercion-errors.ts → coercion/errors.ts} +1 -1
- package/src/internal/coercion/kind.d.ts +4 -0
- package/src/internal/{coercion-kind.ts → coercion/kind.ts} +2 -2
- package/src/internal/{coercion-normalize.ts → coercion/normalize.ts} +1 -1
- package/src/internal/coercion/rules.d.ts +6 -0
- package/src/internal/{coercion-rules.ts → coercion/rules.ts} +2 -2
- package/src/internal/column-state.d.ts +190 -0
- package/src/internal/column-state.ts +36 -47
- package/src/internal/column.ts +21 -305
- package/src/internal/datatypes/define.d.ts +17 -0
- package/src/internal/datatypes/define.ts +18 -4
- package/src/internal/datatypes/lookup.d.ts +44 -0
- package/src/internal/datatypes/lookup.ts +61 -152
- package/src/internal/datatypes/shape.d.ts +16 -0
- package/src/internal/datatypes/shape.ts +1 -1
- package/src/internal/derived-table.d.ts +4 -0
- package/src/internal/derived-table.ts +21 -16
- package/src/internal/dsl-mutation-runtime.ts +378 -0
- package/src/internal/dsl-plan-runtime.ts +387 -0
- package/src/internal/dsl-query-runtime.ts +160 -0
- package/src/internal/dsl-transaction-ddl-runtime.ts +263 -0
- package/src/internal/executor.ts +132 -31
- package/src/internal/expression-ast.ts +15 -5
- package/src/internal/grouping-key.d.ts +3 -0
- package/src/internal/grouping-key.ts +1 -1
- package/src/internal/implication-runtime.d.ts +15 -0
- package/src/internal/implication-runtime.ts +4 -4
- package/src/internal/json/ast.d.ts +30 -0
- package/src/internal/json/ast.ts +1 -1
- package/src/internal/json/errors.d.ts +8 -0
- package/src/internal/json/path.d.ts +75 -0
- package/src/internal/json/path.ts +1 -1
- package/src/internal/json/types.d.ts +62 -0
- package/src/internal/predicate/analysis.d.ts +20 -0
- package/src/internal/{predicate-analysis.ts → predicate/analysis.ts} +3 -3
- package/src/internal/predicate/atom.d.ts +28 -0
- package/src/internal/{predicate-branches.ts → predicate/branches.ts} +2 -2
- package/src/internal/predicate/context.d.ts +67 -0
- package/src/internal/{predicate-context.ts → predicate/context.ts} +8 -5
- package/src/internal/predicate/formula.d.ts +35 -0
- package/src/internal/{predicate-formula.ts → predicate/formula.ts} +1 -1
- package/src/internal/predicate/key.d.ts +11 -0
- package/src/internal/{predicate-key.ts → predicate/key.ts} +2 -2
- package/src/internal/{predicate-nnf.ts → predicate/nnf.ts} +2 -2
- package/src/internal/predicate/normalize.d.ts +53 -0
- package/src/internal/{predicate-normalize.ts → predicate/normalize.ts} +19 -19
- package/src/internal/predicate/runtime.d.ts +31 -0
- package/src/internal/{predicate-runtime.ts → predicate/runtime.ts} +9 -6
- package/src/internal/projection-alias.d.ts +13 -0
- package/src/internal/projections.d.ts +31 -0
- package/src/internal/projections.ts +1 -1
- package/src/internal/query-ast.d.ts +217 -0
- package/src/internal/query-ast.ts +1 -1
- package/src/internal/query-requirements.d.ts +20 -0
- package/src/internal/query.d.ts +775 -0
- package/src/internal/query.ts +389 -313
- package/src/internal/renderer.ts +7 -21
- package/src/internal/row-set.d.ts +53 -0
- package/src/internal/{plan.ts → row-set.ts} +11 -9
- package/src/internal/{runtime-normalize.ts → runtime/normalize.ts} +9 -31
- package/src/internal/{runtime-schema.ts → runtime/schema.ts} +13 -38
- package/src/internal/runtime/value.d.ts +22 -0
- package/src/internal/{runtime-value.ts → runtime/value.ts} +2 -2
- package/src/internal/scalar.d.ts +107 -0
- package/src/internal/scalar.ts +191 -0
- package/src/internal/schema-derivation.d.ts +105 -0
- package/src/internal/schema-expression.d.ts +18 -0
- package/src/internal/schema-expression.ts +38 -7
- package/src/internal/table-options.d.ts +94 -0
- package/src/internal/table-options.ts +8 -2
- package/src/internal/table.d.ts +173 -0
- package/src/internal/table.ts +32 -14
- package/src/mysql/column.ts +94 -18
- package/src/mysql/datatypes/index.ts +47 -7
- package/src/mysql/errors/generated.ts +57336 -0
- package/src/mysql/errors/index.ts +1 -0
- package/src/mysql/errors/normalize.ts +55 -53
- package/src/mysql/errors/types.ts +74 -0
- package/src/mysql/executor.ts +69 -7
- package/src/mysql/function/aggregate.ts +1 -5
- package/src/mysql/function/core.ts +1 -4
- package/src/mysql/function/index.ts +0 -1
- package/src/mysql/function/string.ts +1 -5
- package/src/mysql/function/temporal.ts +12 -15
- package/src/mysql/function/window.ts +1 -6
- package/src/{internal/mysql-dialect.ts → mysql/internal/dialect.ts} +1 -1
- package/src/{internal/mysql-query.ts → mysql/internal/dsl.ts} +1024 -2082
- package/src/{internal/mysql-renderer.ts → mysql/internal/renderer.ts} +6 -6
- package/src/mysql/internal/sql-expression-renderer.ts +1455 -0
- package/src/mysql/json.ts +2 -0
- package/src/mysql/query.ts +111 -91
- package/src/mysql/renderer.ts +1 -1
- package/src/mysql/table.ts +1 -1
- package/src/mysql.ts +6 -4
- package/src/postgres/cast.ts +11 -12
- package/src/postgres/column.ts +178 -46
- package/src/postgres/datatypes/index.d.ts +515 -0
- package/src/postgres/datatypes/index.ts +22 -13
- package/src/postgres/datatypes/spec.d.ts +412 -0
- package/src/postgres/errors/generated.ts +2636 -0
- package/src/postgres/errors/index.ts +1 -0
- package/src/postgres/errors/normalize.ts +47 -62
- package/src/postgres/errors/types.ts +92 -34
- package/src/postgres/executor.ts +37 -5
- package/src/postgres/function/aggregate.ts +1 -5
- package/src/postgres/function/core.ts +12 -6
- package/src/postgres/function/index.ts +0 -1
- package/src/postgres/function/string.ts +1 -5
- package/src/postgres/function/temporal.ts +12 -15
- package/src/postgres/function/window.ts +1 -6
- package/src/{internal/postgres-dialect.ts → postgres/internal/dialect.ts} +1 -1
- package/src/{internal/postgres-query.ts → postgres/internal/dsl.ts} +1085 -2089
- package/src/{internal/postgres-renderer.ts → postgres/internal/renderer.ts} +6 -6
- package/src/postgres/internal/schema-ddl.ts +108 -0
- package/src/{internal/postgres-schema-model.ts → postgres/internal/schema-model.ts} +12 -6
- package/src/{internal → postgres/internal}/sql-expression-renderer.ts +19 -17
- package/src/postgres/{function/json.ts → json.ts} +77 -85
- package/src/postgres/metadata.ts +2 -2
- package/src/postgres/query.ts +113 -89
- package/src/postgres/renderer.ts +3 -13
- package/src/postgres/schema-expression.ts +2 -1
- package/src/postgres/schema-management.ts +1 -1
- package/src/postgres/table.ts +12 -4
- package/src/postgres/type.ts +29 -2
- package/src/postgres.ts +6 -4
- package/src/internal/expression.ts +0 -327
- package/src/internal/schema-ddl.ts +0 -55
- package/src/mysql/function/json.ts +0 -4
- package/src/mysql/private/query.ts +0 -1
- package/src/postgres/private/query.ts +0 -1
- /package/src/internal/{predicate-atom.ts → predicate/atom.ts} +0 -0
|
@@ -27,9 +27,9 @@ __export(exports_metadata, {
|
|
|
27
27
|
// src/internal/table.ts
|
|
28
28
|
import { pipeArguments as pipeArguments2 } from "effect/Pipeable";
|
|
29
29
|
|
|
30
|
-
// src/internal/
|
|
31
|
-
var
|
|
32
|
-
__export(
|
|
30
|
+
// src/internal/row-set.ts
|
|
31
|
+
var exports_row_set = {};
|
|
32
|
+
__export(exports_row_set, {
|
|
33
33
|
TypeId: () => TypeId
|
|
34
34
|
});
|
|
35
35
|
var TypeId = Symbol.for("effect-qb/Plan");
|
|
@@ -38,9 +38,9 @@ var TypeId = Symbol.for("effect-qb/Plan");
|
|
|
38
38
|
import { pipeArguments } from "effect/Pipeable";
|
|
39
39
|
import * as Schema from "effect/Schema";
|
|
40
40
|
|
|
41
|
-
// src/internal/
|
|
42
|
-
var
|
|
43
|
-
__export(
|
|
41
|
+
// src/internal/scalar.ts
|
|
42
|
+
var exports_scalar = {};
|
|
43
|
+
__export(exports_scalar, {
|
|
44
44
|
TypeId: () => TypeId2
|
|
45
45
|
});
|
|
46
46
|
var TypeId2 = Symbol.for("effect-qb/Expression");
|
|
@@ -56,8 +56,18 @@ var ColumnProto = {
|
|
|
56
56
|
return pipeArguments(this, arguments);
|
|
57
57
|
}
|
|
58
58
|
};
|
|
59
|
+
var attachPipe = (value) => {
|
|
60
|
+
Object.defineProperty(value, "pipe", {
|
|
61
|
+
configurable: true,
|
|
62
|
+
writable: true,
|
|
63
|
+
value: function() {
|
|
64
|
+
return pipeArguments(value, arguments);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
return value;
|
|
68
|
+
};
|
|
59
69
|
var makeColumnDefinition = (schema, metadata) => {
|
|
60
|
-
const column = Object.create(ColumnProto);
|
|
70
|
+
const column = attachPipe(Object.create(ColumnProto));
|
|
61
71
|
column.schema = schema;
|
|
62
72
|
column.metadata = metadata;
|
|
63
73
|
column[TypeId2] = {
|
|
@@ -66,9 +76,7 @@ var makeColumnDefinition = (schema, metadata) => {
|
|
|
66
76
|
runtimeSchema: schema,
|
|
67
77
|
nullability: metadata.nullable ? "maybe" : "never",
|
|
68
78
|
dialect: metadata.dbType.dialect,
|
|
69
|
-
|
|
70
|
-
source: undefined,
|
|
71
|
-
sourceNullability: "propagate",
|
|
79
|
+
kind: "scalar",
|
|
72
80
|
dependencies: {}
|
|
73
81
|
};
|
|
74
82
|
column[ColumnTypeId] = {
|
|
@@ -86,16 +94,14 @@ var makeColumnDefinition = (schema, metadata) => {
|
|
|
86
94
|
generatedValue: metadata.generatedValue,
|
|
87
95
|
ddlType: metadata.ddlType,
|
|
88
96
|
identity: metadata.identity,
|
|
89
|
-
enum: metadata.enum
|
|
90
|
-
source: undefined,
|
|
91
|
-
dependencies: {}
|
|
97
|
+
enum: metadata.enum
|
|
92
98
|
};
|
|
93
99
|
return column;
|
|
94
100
|
};
|
|
95
101
|
var remapColumnDefinition = (column, options = {}) => {
|
|
96
102
|
const schema = options.schema ?? column.schema;
|
|
97
103
|
const metadata = options.metadata ?? column.metadata;
|
|
98
|
-
const next = Object.create(ColumnProto);
|
|
104
|
+
const next = attachPipe(Object.create(ColumnProto));
|
|
99
105
|
next.schema = schema;
|
|
100
106
|
next.metadata = metadata;
|
|
101
107
|
next[TypeId2] = {
|
|
@@ -135,7 +141,7 @@ var remapColumnDefinition = (column, options = {}) => {
|
|
|
135
141
|
var bindColumn = (tableName, columnName, column, baseTableName, schemaName) => {
|
|
136
142
|
const brandName = `${tableName}.${columnName}`;
|
|
137
143
|
const schema = column.metadata.brand === true ? Schema.brand(brandName)(column.schema) : column.schema;
|
|
138
|
-
const bound = Object.create(ColumnProto);
|
|
144
|
+
const bound = attachPipe(Object.create(ColumnProto));
|
|
139
145
|
bound.schema = schema;
|
|
140
146
|
bound.metadata = column.metadata;
|
|
141
147
|
bound[TypeId2] = {
|
|
@@ -144,13 +150,7 @@ var bindColumn = (tableName, columnName, column, baseTableName, schemaName) => {
|
|
|
144
150
|
runtimeSchema: schema,
|
|
145
151
|
nullability: column.metadata.nullable ? "maybe" : "never",
|
|
146
152
|
dialect: column.metadata.dbType.dialect,
|
|
147
|
-
|
|
148
|
-
source: {
|
|
149
|
-
tableName,
|
|
150
|
-
columnName,
|
|
151
|
-
baseTableName
|
|
152
|
-
},
|
|
153
|
-
sourceNullability: "propagate",
|
|
153
|
+
kind: "scalar",
|
|
154
154
|
dependencies: {
|
|
155
155
|
[tableName]: true
|
|
156
156
|
}
|
|
@@ -225,7 +225,9 @@ var collectInlineOptions = (fields) => {
|
|
|
225
225
|
kind: "column",
|
|
226
226
|
column: columnName,
|
|
227
227
|
order: column.metadata.index.order,
|
|
228
|
-
nulls: column.metadata.index.nulls
|
|
228
|
+
nulls: column.metadata.index.nulls,
|
|
229
|
+
operatorClass: column.metadata.index.operatorClass,
|
|
230
|
+
collation: column.metadata.index.collation
|
|
229
231
|
}],
|
|
230
232
|
name: column.metadata.index.name,
|
|
231
233
|
method: column.metadata.index.method,
|
|
@@ -379,6 +381,16 @@ var TableProto = {
|
|
|
379
381
|
return pipeArguments2(this, arguments);
|
|
380
382
|
}
|
|
381
383
|
};
|
|
384
|
+
var attachPipe2 = (value) => {
|
|
385
|
+
Object.defineProperty(value, "pipe", {
|
|
386
|
+
configurable: true,
|
|
387
|
+
writable: true,
|
|
388
|
+
value: function() {
|
|
389
|
+
return pipeArguments2(value, arguments);
|
|
390
|
+
}
|
|
391
|
+
});
|
|
392
|
+
return value;
|
|
393
|
+
};
|
|
382
394
|
var buildArtifacts = (name, fields, declaredOptions, schemaName) => {
|
|
383
395
|
const normalizedOptions = [...collectInlineOptions(fields), ...declaredOptions];
|
|
384
396
|
validateFieldDialects(name, fields);
|
|
@@ -397,7 +409,7 @@ var makeTable = (name, fields, declaredOptions, baseName = name, kind = "schema"
|
|
|
397
409
|
const resolvedSchemaName = schemaMode === "explicit" ? schemaName : "public";
|
|
398
410
|
const artifacts = buildArtifacts(name, fields, declaredOptions, resolvedSchemaName);
|
|
399
411
|
const dialect = resolveFieldDialect(fields);
|
|
400
|
-
const table = Object.create(TableProto);
|
|
412
|
+
const table = attachPipe2(Object.create(TableProto));
|
|
401
413
|
table.name = name;
|
|
402
414
|
table.columns = artifacts.columns;
|
|
403
415
|
table.schemas = artifacts.schemas;
|
|
@@ -448,7 +460,7 @@ var validateClassOptions = (declaredOptions) => {
|
|
|
448
460
|
var resolveFieldDialect = (fields) => {
|
|
449
461
|
const dialects = [...new Set(Object.values(fields).map((field) => field.metadata.dbType.dialect))];
|
|
450
462
|
if (dialects.length === 0) {
|
|
451
|
-
|
|
463
|
+
throw new Error("Cannot infer table dialect from an empty field set");
|
|
452
464
|
}
|
|
453
465
|
if (dialects.length > 1) {
|
|
454
466
|
throw new Error(`Mixed table dialects are not supported: ${dialects.join(", ")}`);
|
|
@@ -507,7 +519,7 @@ var schema = (schemaName) => ({
|
|
|
507
519
|
var alias = (table, aliasName) => {
|
|
508
520
|
const state = table[TypeId4];
|
|
509
521
|
const columns = Object.fromEntries(Object.entries(state.fields).map(([key, column]) => [key, bindColumn(aliasName, key, column, state.baseName, state.schemaName)]));
|
|
510
|
-
const aliased = Object.create(TableProto);
|
|
522
|
+
const aliased = attachPipe2(Object.create(TableProto));
|
|
511
523
|
aliased.name = aliasName;
|
|
512
524
|
aliased.columns = columns;
|
|
513
525
|
aliased.schemas = deriveSchemas(aliasName, state.fields, state.primaryKey);
|
|
@@ -627,31 +639,6 @@ var check = (name, predicate) => makeOption({
|
|
|
627
639
|
predicate
|
|
628
640
|
});
|
|
629
641
|
|
|
630
|
-
// src/internal/postgres-dialect.ts
|
|
631
|
-
var quoteIdentifier = (value) => `"${value.replaceAll('"', '""')}"`;
|
|
632
|
-
var renderLiteral = (value, state) => {
|
|
633
|
-
if (value === null) {
|
|
634
|
-
return "null";
|
|
635
|
-
}
|
|
636
|
-
if (typeof value === "boolean") {
|
|
637
|
-
return value ? "true" : "false";
|
|
638
|
-
}
|
|
639
|
-
state.params.push(value);
|
|
640
|
-
return `$${state.params.length}`;
|
|
641
|
-
};
|
|
642
|
-
var postgresDialect = {
|
|
643
|
-
name: "postgres",
|
|
644
|
-
quoteIdentifier,
|
|
645
|
-
renderLiteral,
|
|
646
|
-
renderTableReference(tableName, baseTableName, schemaName) {
|
|
647
|
-
const renderedBase = schemaName ? `${quoteIdentifier(schemaName)}.${quoteIdentifier(baseTableName)}` : quoteIdentifier(baseTableName);
|
|
648
|
-
return tableName === baseTableName ? renderedBase : `${renderedBase} as ${quoteIdentifier(tableName)}`;
|
|
649
|
-
},
|
|
650
|
-
renderConcat(values) {
|
|
651
|
-
return `(${values.join(" || ")})`;
|
|
652
|
-
}
|
|
653
|
-
};
|
|
654
|
-
|
|
655
642
|
// src/internal/schema-expression.ts
|
|
656
643
|
import { parse, toSql } from "pgsql-ast-parser";
|
|
657
644
|
import { pipeArguments as pipeArguments3 } from "effect/Pipeable";
|
|
@@ -661,19 +648,48 @@ var SchemaExpressionProto = {
|
|
|
661
648
|
return pipeArguments3(this, arguments);
|
|
662
649
|
}
|
|
663
650
|
};
|
|
651
|
+
var attachPipe3 = (value) => {
|
|
652
|
+
Object.defineProperty(value, "pipe", {
|
|
653
|
+
configurable: true,
|
|
654
|
+
writable: true,
|
|
655
|
+
value: function() {
|
|
656
|
+
return pipeArguments3(value, arguments);
|
|
657
|
+
}
|
|
658
|
+
});
|
|
659
|
+
return value;
|
|
660
|
+
};
|
|
664
661
|
var isSchemaExpression = (value) => typeof value === "object" && value !== null && (TypeId5 in value);
|
|
665
662
|
var fromAst = (ast) => {
|
|
666
|
-
const expression = Object.create(SchemaExpressionProto);
|
|
663
|
+
const expression = attachPipe3(Object.create(SchemaExpressionProto));
|
|
667
664
|
expression[TypeId5] = {
|
|
668
|
-
dialect: "postgres",
|
|
669
665
|
ast
|
|
670
666
|
};
|
|
671
667
|
return expression;
|
|
672
668
|
};
|
|
669
|
+
var fromSql = (sql) => {
|
|
670
|
+
const expression = attachPipe3(Object.create(SchemaExpressionProto));
|
|
671
|
+
expression[TypeId5] = {
|
|
672
|
+
sql: sql.trim()
|
|
673
|
+
};
|
|
674
|
+
return expression;
|
|
675
|
+
};
|
|
673
676
|
var parseExpression = (sql) => fromAst(parse(sql, "expr"));
|
|
674
|
-
var toAst = (expression) =>
|
|
675
|
-
|
|
676
|
-
|
|
677
|
+
var toAst = (expression) => {
|
|
678
|
+
const ast = expression[TypeId5].ast;
|
|
679
|
+
if (ast !== undefined) {
|
|
680
|
+
return ast;
|
|
681
|
+
}
|
|
682
|
+
return parse(render(expression), "expr");
|
|
683
|
+
};
|
|
684
|
+
var render = (expression) => expression[TypeId5].sql ?? toSql.expr(toAst(expression));
|
|
685
|
+
var normalize = (expression) => (() => {
|
|
686
|
+
const sql = render(expression);
|
|
687
|
+
try {
|
|
688
|
+
return parseExpression(sql);
|
|
689
|
+
} catch {
|
|
690
|
+
return fromSql(sql);
|
|
691
|
+
}
|
|
692
|
+
})();
|
|
677
693
|
|
|
678
694
|
// src/internal/query.ts
|
|
679
695
|
import { pipeArguments as pipeArguments4 } from "effect/Pipeable";
|
|
@@ -681,7 +697,7 @@ import { pipeArguments as pipeArguments4 } from "effect/Pipeable";
|
|
|
681
697
|
// src/internal/query-ast.ts
|
|
682
698
|
var TypeId6 = Symbol.for("effect-qb/QueryAst");
|
|
683
699
|
|
|
684
|
-
// src/internal/predicate
|
|
700
|
+
// src/internal/predicate/runtime.ts
|
|
685
701
|
var trueFormula = () => ({ kind: "true" });
|
|
686
702
|
var falseFormula = () => ({ kind: "false" });
|
|
687
703
|
var atomFormula = (atom) => ({ kind: "atom", atom });
|
|
@@ -1184,7 +1200,7 @@ var formulaOfExpression = (value) => {
|
|
|
1184
1200
|
}
|
|
1185
1201
|
case "notIn": {
|
|
1186
1202
|
const [left, ...rest] = ast.values;
|
|
1187
|
-
return left === undefined ? trueFormula() : allFormula(rest.map((value2) => formulaOfNeq(left, value2)));
|
|
1203
|
+
return left === undefined ? trueFormula() : combineFacts(nonNullFactsOfExpression(left), allFormula(rest.map((value2) => formulaOfNeq(left, value2))));
|
|
1188
1204
|
}
|
|
1189
1205
|
case "between":
|
|
1190
1206
|
return combineFacts(ast.values.reduce((current, entry) => combineFacts(current, nonNullFactsOfExpression(entry)), undefined), unknownTag("variadic:between"));
|
|
@@ -1226,35 +1242,45 @@ var PlanProto = {
|
|
|
1226
1242
|
}
|
|
1227
1243
|
};
|
|
1228
1244
|
var QueryTypeId = Symbol.for("effect-qb/Query/internal");
|
|
1229
|
-
var
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
if (values.length === 0) {
|
|
1233
|
-
return;
|
|
1234
|
-
}
|
|
1235
|
-
if (values.length === 1) {
|
|
1236
|
-
return values[0];
|
|
1237
|
-
}
|
|
1238
|
-
return values;
|
|
1239
|
-
};
|
|
1240
|
-
var mergeDependencies = (left, right = {}) => ({
|
|
1241
|
-
...left,
|
|
1242
|
-
...right
|
|
1245
|
+
var mergeDependencies = (left, right = undefined) => ({
|
|
1246
|
+
...left ?? {},
|
|
1247
|
+
...right ?? {}
|
|
1243
1248
|
});
|
|
1244
1249
|
var mergeAggregationRuntime = (left, right = "scalar") => left === "window" || right === "window" ? "window" : left === "aggregate" || right === "aggregate" ? "aggregate" : "scalar";
|
|
1245
|
-
var mergeAggregationManyRuntime = (values) => values.reduce((current, value) => mergeAggregationRuntime(current, value[TypeId2].
|
|
1250
|
+
var mergeAggregationManyRuntime = (values) => values.reduce((current, value) => mergeAggregationRuntime(current, value[TypeId2].kind), "scalar");
|
|
1246
1251
|
var mergeNullabilityRuntime = (left, right = "never") => left === "always" || right === "always" ? "always" : left === "maybe" || right === "maybe" ? "maybe" : "never";
|
|
1247
1252
|
var mergeNullabilityManyRuntime = (values) => values.reduce((current, value) => mergeNullabilityRuntime(current, value[TypeId2].nullability), "never");
|
|
1248
|
-
var mergeManySources = (values) => values.reduce((current, value) => mergeSources(current, value[TypeId2].source), undefined);
|
|
1249
1253
|
var mergeManyDependencies = (values) => values.reduce((current, value) => mergeDependencies(current, value[TypeId2].dependencies), {});
|
|
1250
1254
|
var makeExpression = (state, ast) => {
|
|
1251
1255
|
const expression = Object.create(ExpressionProto);
|
|
1252
|
-
expression
|
|
1256
|
+
Object.defineProperty(expression, "pipe", {
|
|
1257
|
+
configurable: true,
|
|
1258
|
+
writable: true,
|
|
1259
|
+
value: function() {
|
|
1260
|
+
return pipeArguments4(expression, arguments);
|
|
1261
|
+
}
|
|
1262
|
+
});
|
|
1263
|
+
expression[TypeId2] = {
|
|
1264
|
+
runtime: state.runtime,
|
|
1265
|
+
dbType: state.dbType,
|
|
1266
|
+
runtimeSchema: state.runtimeSchema,
|
|
1267
|
+
nullability: state.nullability,
|
|
1268
|
+
dialect: state.dialect,
|
|
1269
|
+
kind: state.kind ?? "scalar",
|
|
1270
|
+
dependencies: state.dependencies ?? {}
|
|
1271
|
+
};
|
|
1253
1272
|
expression[TypeId3] = ast;
|
|
1254
1273
|
return expression;
|
|
1255
1274
|
};
|
|
1256
1275
|
var makePlan = (state, ast, _assumptions, _capabilities, _statement, _target, _insertState) => {
|
|
1257
1276
|
const plan = Object.create(PlanProto);
|
|
1277
|
+
Object.defineProperty(plan, "pipe", {
|
|
1278
|
+
configurable: true,
|
|
1279
|
+
writable: true,
|
|
1280
|
+
value: function() {
|
|
1281
|
+
return pipeArguments4(plan, arguments);
|
|
1282
|
+
}
|
|
1283
|
+
});
|
|
1258
1284
|
plan[TypeId] = state;
|
|
1259
1285
|
plan[TypeId6] = ast;
|
|
1260
1286
|
plan[QueryTypeId] = {
|
|
@@ -1475,13 +1501,13 @@ var dedupeGroupedExpressions = (values) => {
|
|
|
1475
1501
|
var isExpression2 = (value) => typeof value === "object" && value !== null && (TypeId2 in value);
|
|
1476
1502
|
var selectionHasAggregate = (selection) => {
|
|
1477
1503
|
if (isExpression2(selection)) {
|
|
1478
|
-
return selection[TypeId2].
|
|
1504
|
+
return selection[TypeId2].kind === "aggregate";
|
|
1479
1505
|
}
|
|
1480
1506
|
return Object.values(selection).some((value) => selectionHasAggregate(value));
|
|
1481
1507
|
};
|
|
1482
1508
|
var isGroupedSelectionValid = (selection, groupedExpressions) => {
|
|
1483
1509
|
if (isExpression2(selection)) {
|
|
1484
|
-
const aggregation = selection[TypeId2].
|
|
1510
|
+
const aggregation = selection[TypeId2].kind;
|
|
1485
1511
|
if (aggregation === "aggregate") {
|
|
1486
1512
|
return true;
|
|
1487
1513
|
}
|
|
@@ -1504,7 +1530,7 @@ var validateAggregationSelection = (selection, grouped) => {
|
|
|
1504
1530
|
}
|
|
1505
1531
|
};
|
|
1506
1532
|
|
|
1507
|
-
// src/internal/sql-expression-renderer.ts
|
|
1533
|
+
// src/postgres/internal/sql-expression-renderer.ts
|
|
1508
1534
|
var renderDbType = (dialect, dbType) => {
|
|
1509
1535
|
if (dialect.name === "mysql" && dbType.dialect === "mysql" && dbType.kind === "uuid") {
|
|
1510
1536
|
return "char(36)";
|
|
@@ -2392,6 +2418,8 @@ var renderExpression = (expression, state, dialect) => {
|
|
|
2392
2418
|
return dialect.name === "mysql" ? `values(${dialect.quoteIdentifier(ast.columnName)})` : `excluded.${dialect.quoteIdentifier(ast.columnName)}`;
|
|
2393
2419
|
case "cast":
|
|
2394
2420
|
return `cast(${renderExpression(ast.value, state, dialect)} as ${renderCastType(dialect, ast.target)})`;
|
|
2421
|
+
case "collate":
|
|
2422
|
+
return `(${renderExpression(ast.value, state, dialect)} collate ${ast.collation.map((segment) => dialect.quoteIdentifier(segment)).join(".")})`;
|
|
2395
2423
|
case "function":
|
|
2396
2424
|
return renderFunctionCall(ast.name, Array.isArray(ast.args) ? ast.args : [], state, dialect);
|
|
2397
2425
|
case "eq":
|
|
@@ -2522,8 +2550,35 @@ var renderExpression = (expression, state, dialect) => {
|
|
|
2522
2550
|
throw new Error("Unsupported expression for SQL rendering");
|
|
2523
2551
|
};
|
|
2524
2552
|
|
|
2525
|
-
// src/internal/schema-ddl.ts
|
|
2553
|
+
// src/postgres/internal/schema-ddl.ts
|
|
2526
2554
|
import { parse as parse2, toSql as toSql2 } from "pgsql-ast-parser";
|
|
2555
|
+
|
|
2556
|
+
// src/postgres/internal/dialect.ts
|
|
2557
|
+
var quoteIdentifier = (value) => `"${value.replaceAll('"', '""')}"`;
|
|
2558
|
+
var renderLiteral = (value, state) => {
|
|
2559
|
+
if (value === null) {
|
|
2560
|
+
return "null";
|
|
2561
|
+
}
|
|
2562
|
+
if (typeof value === "boolean") {
|
|
2563
|
+
return value ? "true" : "false";
|
|
2564
|
+
}
|
|
2565
|
+
state.params.push(value);
|
|
2566
|
+
return `$${state.params.length}`;
|
|
2567
|
+
};
|
|
2568
|
+
var postgresDialect = {
|
|
2569
|
+
name: "postgres",
|
|
2570
|
+
quoteIdentifier,
|
|
2571
|
+
renderLiteral,
|
|
2572
|
+
renderTableReference(tableName, baseTableName, schemaName) {
|
|
2573
|
+
const renderedBase = schemaName ? `${quoteIdentifier(schemaName)}.${quoteIdentifier(baseTableName)}` : quoteIdentifier(baseTableName);
|
|
2574
|
+
return tableName === baseTableName ? renderedBase : `${renderedBase} as ${quoteIdentifier(tableName)}`;
|
|
2575
|
+
},
|
|
2576
|
+
renderConcat(values) {
|
|
2577
|
+
return `(${values.join(" || ")})`;
|
|
2578
|
+
}
|
|
2579
|
+
};
|
|
2580
|
+
|
|
2581
|
+
// src/postgres/internal/schema-ddl.ts
|
|
2527
2582
|
var escapeString = (value) => `'${value.replaceAll("'", "''")}'`;
|
|
2528
2583
|
var inlineLiteralDialect = {
|
|
2529
2584
|
...postgresDialect,
|
|
@@ -2548,12 +2603,51 @@ var renderDdlExpressionSql = (expression) => isSchemaExpression(expression) ? re
|
|
|
2548
2603
|
ctes: [],
|
|
2549
2604
|
cteNames: new Set
|
|
2550
2605
|
}, inlineLiteralDialect);
|
|
2606
|
+
var stripRedundantOuterParens = (value) => {
|
|
2607
|
+
let current = value.trim();
|
|
2608
|
+
while (current.startsWith("(") && current.endsWith(")")) {
|
|
2609
|
+
let depth = 0;
|
|
2610
|
+
let wrapsWholeExpression = true;
|
|
2611
|
+
let inSingleQuote = false;
|
|
2612
|
+
let inDoubleQuote = false;
|
|
2613
|
+
for (let index3 = 0;index3 < current.length; index3++) {
|
|
2614
|
+
const char = current[index3];
|
|
2615
|
+
const previous = index3 > 0 ? current[index3 - 1] : undefined;
|
|
2616
|
+
if (char === "'" && !inDoubleQuote && previous !== "\\") {
|
|
2617
|
+
inSingleQuote = !inSingleQuote;
|
|
2618
|
+
continue;
|
|
2619
|
+
}
|
|
2620
|
+
if (char === '"' && !inSingleQuote && previous !== "\\") {
|
|
2621
|
+
inDoubleQuote = !inDoubleQuote;
|
|
2622
|
+
continue;
|
|
2623
|
+
}
|
|
2624
|
+
if (inSingleQuote || inDoubleQuote) {
|
|
2625
|
+
continue;
|
|
2626
|
+
}
|
|
2627
|
+
if (char === "(") {
|
|
2628
|
+
depth += 1;
|
|
2629
|
+
} else if (char === ")") {
|
|
2630
|
+
depth -= 1;
|
|
2631
|
+
if (depth === 0 && index3 < current.length - 1) {
|
|
2632
|
+
wrapsWholeExpression = false;
|
|
2633
|
+
break;
|
|
2634
|
+
}
|
|
2635
|
+
}
|
|
2636
|
+
}
|
|
2637
|
+
if (!wrapsWholeExpression) {
|
|
2638
|
+
break;
|
|
2639
|
+
}
|
|
2640
|
+
current = current.slice(1, -1).trim();
|
|
2641
|
+
}
|
|
2642
|
+
return current;
|
|
2643
|
+
};
|
|
2644
|
+
var canonicalizeDdlExpressionSql = (value) => stripRedundantOuterParens(value.trim().replace(/\s+/g, " ").replace(/"[^"]+"\./g, "").replace(/"([A-Za-z_][A-Za-z0-9_]*)"/g, "$1").replace(/\bCOLLATE\b/g, "collate").replace(/cast\(((?:'(?:[^']|'')*'|"[^"]+"|[a-zA-Z_][a-zA-Z0-9_]*|\([^()]+\))) as ([^)]+)\)/gi, (_, expression, target) => `${expression}::${target.trim()}`));
|
|
2551
2645
|
var normalizeDdlExpressionSql = (expression) => {
|
|
2552
2646
|
const rendered = renderDdlExpressionSql(expression);
|
|
2553
2647
|
try {
|
|
2554
|
-
return toSql2.expr(parse2(rendered, "expr"));
|
|
2648
|
+
return canonicalizeDdlExpressionSql(toSql2.expr(parse2(rendered, "expr")));
|
|
2555
2649
|
} catch {
|
|
2556
|
-
return rendered
|
|
2650
|
+
return canonicalizeDdlExpressionSql(rendered);
|
|
2557
2651
|
}
|
|
2558
2652
|
};
|
|
2559
2653
|
|
|
@@ -2630,7 +2724,7 @@ function sequence(name, schemaName) {
|
|
|
2630
2724
|
}
|
|
2631
2725
|
var isSequenceDefinition = (value) => typeof value === "object" && value !== null && (SequenceTypeId in value);
|
|
2632
2726
|
|
|
2633
|
-
// src/internal/
|
|
2727
|
+
// src/postgres/internal/schema-model.ts
|
|
2634
2728
|
var isTableDefinition = (value) => value !== null && (typeof value === "object" || typeof value === "function") && (TypeId4 in value);
|
|
2635
2729
|
var isEnumDefinition = (value) => typeof value === "object" && value !== null && (EnumTypeId in value);
|
|
2636
2730
|
var toTableModel = (table) => {
|