orez 0.4.16 → 0.4.18
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/pg-proxy-do-backend.d.ts +1 -0
- package/dist/pg-proxy-do-backend.d.ts.map +1 -1
- package/dist/pg-proxy-do-backend.js +86 -7
- package/dist/pg-proxy-do-backend.js.map +1 -1
- package/dist/pg-sqlite-compiler/passes/index.d.ts.map +1 -1
- package/dist/pg-sqlite-compiler/passes/index.js +4 -0
- package/dist/pg-sqlite-compiler/passes/index.js.map +1 -1
- package/dist/pg-sqlite-compiler/passes/schema.d.ts +3 -0
- package/dist/pg-sqlite-compiler/passes/schema.d.ts.map +1 -0
- package/dist/pg-sqlite-compiler/passes/schema.js +113 -0
- package/dist/pg-sqlite-compiler/passes/schema.js.map +1 -0
- package/dist/pg-sqlite-compiler/passes/unsupported.d.ts +3 -0
- package/dist/pg-sqlite-compiler/passes/unsupported.d.ts.map +1 -0
- package/dist/pg-sqlite-compiler/passes/unsupported.js +33 -0
- package/dist/pg-sqlite-compiler/passes/unsupported.js.map +1 -0
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pg-proxy-do-backend.d.ts","sourceRoot":"","sources":["../src/pg-proxy-do-backend.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pg-proxy-do-backend.d.ts","sourceRoot":"","sources":["../src/pg-proxy-do-backend.ts"],"names":[],"mappings":"AAq6HA,wBAAsB,+BAA+B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CACzE,KAAK,CAAC;IACJ,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,kBAAkB,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IACtD,mBAAmB,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CACxD,CAAC,CACH,CAkDA;AAwkCD,qBAAa,SAAS;IACpB,KAAK,UAAQ;IACb,MAAM,UAAQ;IACd,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,oBAAoB,CAAa;IACzC,OAAO,CAAC,gBAAgB,CAAwC;IAChE,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,YAAY,CAAoC;IAGxD,OAAO,CAAC,4BAA4B,CAAoB;IACxD,OAAO,CAAC,YAAY,CAAmC;IACvD,OAAO,CAAC,kBAAkB,CAAuC;IACjE,OAAO,CAAC,OAAO,CAAiC;IAOhD,OAAO,CAAC,yBAAyB,CAAsC;IACvE,OAAO,CAAC,YAAY,CAA6B;IAQjD,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,IAAI,CAAsB;IAClC,OAAO,CAAC,UAAU,CAA2C;IAC7D,OAAO,CAAC,eAAe,CAAmC;IAC1D,OAAO,CAAC,iBAAiB,CAAI;IAM7B,OAAO,CAAC,yBAAyB,CAAQ;IAGzC,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,iBAAiB,CAAQ;IAOjC,OAAO,CAAC,OAAO,CAAQ;gBAGrB,KAAK,EAAE,MAAM,EACb,MAAM,GAAE,MAAmB,EAC3B,SAAS,SAAY,EACrB,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAcnD,IAAI,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAE7B;IAED,OAAO,CAAC,WAAW;YAWL,IAAI;YAUJ,0BAA0B;YAwB1B,mBAAmB;IAIjC,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,mBAAmB;YAyBb,mBAAmB;YA2CnB,yBAAyB;YAsBzB,+BAA+B;YA8B/B,sBAAsB;IAgC9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAW5B,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,iBAAiB;IAmBzB,OAAO,CAAC,qBAAqB;IAQ7B,OAAO,CAAC,kCAAkC;IAS1C,OAAO,CAAC,kCAAkC;IAsB1C,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,gBAAgB;YAMV,gBAAgB;YAOhB,iBAAiB;YAuBjB,mBAAmB;IAwB3B,eAAe,CACnB,OAAO,EAAE,UAAU,EACnB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,GACvD,OAAO,CAAC,UAAU,CAAC;IAqBtB,OAAO,CAAC,qBAAqB;IAY7B,OAAO,CAAC,2BAA2B;YAKrB,mBAAmB;YAoCnB,iBAAiB;YAgGjB,sBAAsB;IA+BpC,OAAO,CAAC,yBAAyB;IAgCjC,OAAO,CAAC,sBAAsB;IAkC9B,gBAAgB,IAAI,MAAM,EAAE;IAI5B,OAAO,CAAC,oBAAoB;IAyB5B,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,wBAAwB;YAYlB,sBAAsB;YAQtB,mCAAmC;IAkBjD,OAAO,CAAC,WAAW;IAuFnB,OAAO,CAAC,UAAU;YAWJ,aAAa;IA8H3B,OAAO,CAAC,UAAU;YAIJ,cAAc;IAuB5B,OAAO,CAAC,WAAW;IAgBb,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YAmCzB,wBAAwB;IAqBhC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,GAAG,EAAE,GACb,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,EAAE,CAAA;KAAE,CAAC;IAuGzB,OAAO,CAAC,GAAG;IAQX,OAAO,CAAC,oBAAoB;IAuB5B,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,yBAAyB;IAkBjC,OAAO,CAAC,qBAAqB;YAkCf,MAAM;YAIN,YAAY;IA6C1B,OAAO,CAAC,uBAAuB;YAKjB,eAAe;YAQf,wBAAwB;YA0BxB,+BAA+B;YAc/B,wBAAwB;YAOxB,UAAU;IAYxB,qFAAqF;YACvE,cAAc;YAsBd,mBAAmB;YA4BnB,yBAAyB;YAmBzB,0BAA0B;YAU1B,WAAW;YA2EX,YAAY;YAKZ,YAAY;YAOZ,gBAAgB;IAY9B,OAAO,CAAC,sBAAsB;IAyB9B,OAAO,CAAC,kCAAkC;IA0B1C,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,0BAA0B;IAmBlC,OAAO,CAAC,eAAe;IAsFvB,OAAO,CAAC,wBAAwB;IAYhC,OAAO,CAAC,oBAAoB;YAUd,qBAAqB;YAiBrB,yBAAyB;IA8EvC,OAAO,CAAC,iBAAiB;YAcX,cAAc;YAiBd,8BAA8B;YAmD9B,iCAAiC;YAwEjC,yBAAyB;IA0DvC,OAAO,CAAC,oBAAoB;YAyCd,qBAAqB;YAiBrB,sBAAsB;YAatB,qBAAqB;IAoBnC,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,UAAU;IA+ClB,OAAO,CAAC,YAAY;IAqGpB,OAAO,CAAC,gBAAgB;IA8BxB,OAAO,CAAC,cAAc;IA2GtB,OAAO,CAAC,gBAAgB;IA0CxB,OAAO,CAAC,aAAa;IAqCrB,OAAO,CAAC,eAAe;IA6DvB,OAAO,CAAC,4BAA4B,CAAoB;IAExD,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,uBAAuB;IAuB/B,OAAO,CAAC,iBAAiB;IAyBzB,OAAO,CAAC,4BAA4B;IAoDpC,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,oBAAoB;YA0Bd,cAAc;IAoB5B,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,mBAAmB;YAOb,oBAAoB;YAgBpB,kBAAkB;YAIlB,mBAAmB;CAkClC"}
|
|
@@ -467,6 +467,8 @@ function expressionOid(value) {
|
|
|
467
467
|
const node = value;
|
|
468
468
|
if (!node || typeof node !== 'object')
|
|
469
469
|
return undefined;
|
|
470
|
+
if (node.SubLink?.subLinkType === 'EXISTS_SUBLINK')
|
|
471
|
+
return PG_TYPE_BOOL;
|
|
470
472
|
if (node.FuncCall) {
|
|
471
473
|
const name = functionName(node.FuncCall);
|
|
472
474
|
if (name && JSON_PRODUCING_FUNCTIONS.has(name))
|
|
@@ -1200,6 +1202,45 @@ function postgresTimestampText(value) {
|
|
|
1200
1202
|
const withSpace = raw.replace('T', ' ');
|
|
1201
1203
|
return withSpace.endsWith('Z') ? `${withSpace.slice(0, -1)}+00` : withSpace;
|
|
1202
1204
|
}
|
|
1205
|
+
function postgresQueryBoolean(value) {
|
|
1206
|
+
if (value === true || value === 1 || value === '1' || value === 't' || value === 'true')
|
|
1207
|
+
return true;
|
|
1208
|
+
if (value === false ||
|
|
1209
|
+
value === 0 ||
|
|
1210
|
+
value === '0' ||
|
|
1211
|
+
value === 'f' ||
|
|
1212
|
+
value === 'false')
|
|
1213
|
+
return false;
|
|
1214
|
+
return value;
|
|
1215
|
+
}
|
|
1216
|
+
function postgresQueryJson(value) {
|
|
1217
|
+
if (typeof value !== 'string')
|
|
1218
|
+
return value;
|
|
1219
|
+
try {
|
|
1220
|
+
return JSON.parse(value);
|
|
1221
|
+
}
|
|
1222
|
+
catch {
|
|
1223
|
+
return value;
|
|
1224
|
+
}
|
|
1225
|
+
}
|
|
1226
|
+
function postgresQueryTimestamp(value) {
|
|
1227
|
+
if (value instanceof Date)
|
|
1228
|
+
return value;
|
|
1229
|
+
const millis = timestampMillisValue(value);
|
|
1230
|
+
const date = millis !== null ? new Date(millis) : new Date(String(value));
|
|
1231
|
+
return Number.isFinite(date.getTime()) ? date : value;
|
|
1232
|
+
}
|
|
1233
|
+
function postgresQueryValue(value, oid) {
|
|
1234
|
+
if (value === null || value === undefined)
|
|
1235
|
+
return value;
|
|
1236
|
+
if (oid === PG_TYPE_BOOL)
|
|
1237
|
+
return postgresQueryBoolean(value);
|
|
1238
|
+
if (oid === PG_TYPE_JSON || oid === PG_TYPE_JSONB)
|
|
1239
|
+
return postgresQueryJson(value);
|
|
1240
|
+
if (isTimestampOid(oid))
|
|
1241
|
+
return postgresQueryTimestamp(value);
|
|
1242
|
+
return value;
|
|
1243
|
+
}
|
|
1203
1244
|
function epochMillisParamValue(value) {
|
|
1204
1245
|
const millis = timestampMillisValue(value);
|
|
1205
1246
|
if (millis !== null)
|
|
@@ -2377,6 +2418,19 @@ function normalizeInsertSelectOnConflict(stmt) {
|
|
|
2377
2418
|
return;
|
|
2378
2419
|
select.whereClause = intConst(1);
|
|
2379
2420
|
}
|
|
2421
|
+
function normalizeInsert(stmt, context) {
|
|
2422
|
+
const from = stmt.relation?.alias?.aliasname ??
|
|
2423
|
+
(stmt.relation?.schemaname ? stmt.relation.relname : null);
|
|
2424
|
+
const table = flattenRangeVar(stmt.relation);
|
|
2425
|
+
if (from && table) {
|
|
2426
|
+
if (stmt.relation?.alias?.aliasname)
|
|
2427
|
+
delete stmt.relation.alias;
|
|
2428
|
+
rewriteColumnRefQualifier(stmt, from, table);
|
|
2429
|
+
}
|
|
2430
|
+
rewriteInsertDefaults(stmt);
|
|
2431
|
+
normalizeInsertSelectOnConflict(stmt);
|
|
2432
|
+
rewriteNode(stmt, context);
|
|
2433
|
+
}
|
|
2380
2434
|
function firstSourceTable(value, cteNames = new Set()) {
|
|
2381
2435
|
if (!value || typeof value !== 'object')
|
|
2382
2436
|
return null;
|
|
@@ -3414,15 +3468,12 @@ function rewriteParsedStatement(version, rawStmt, context) {
|
|
|
3414
3468
|
else if (nodeType === 'InsertStmt') {
|
|
3415
3469
|
const table = publicationTableRefForRangeVar(node.relation);
|
|
3416
3470
|
writeTable = table;
|
|
3417
|
-
|
|
3418
|
-
rewriteInsertDefaults(node);
|
|
3419
|
-
normalizeInsertSelectOnConflict(node);
|
|
3471
|
+
normalizeInsert(node, context);
|
|
3420
3472
|
if (node.selectStmt?.SelectStmt?.withClause) {
|
|
3421
3473
|
const sourceTable = firstSourceTable(node.selectStmt);
|
|
3422
3474
|
if (sourceTable)
|
|
3423
3475
|
skipIfTableEmpty = { table: sourceTable };
|
|
3424
3476
|
}
|
|
3425
|
-
rewriteNode(node, context);
|
|
3426
3477
|
changeTracking = changeTrackingForDML(version, stmt, nodeType, table, 'INSERT');
|
|
3427
3478
|
}
|
|
3428
3479
|
else if (nodeType === 'UpdateStmt') {
|
|
@@ -5549,14 +5600,15 @@ export class DoBackend {
|
|
|
5549
5600
|
const result = await this.executeRewrittenStatements(statements);
|
|
5550
5601
|
await this.applyStatementMetadata(statements);
|
|
5551
5602
|
const tracking = statement ? this.trackingForStatement(statement) : undefined;
|
|
5552
|
-
|
|
5603
|
+
// metadata: original SQL only — see normalizedHighLevelResult comment in query().
|
|
5604
|
+
return this.normalizedHighLevelResult(sql, this.visibleResultForTracking(result, tracking)).rows;
|
|
5553
5605
|
}
|
|
5554
5606
|
if (statement)
|
|
5555
5607
|
await this.snapshotTransactionWrite(statement);
|
|
5556
5608
|
const tracking = statement ? this.trackingForStatement(statement) : undefined;
|
|
5557
5609
|
const result = await this.doExecResult(tracking?.returningSQL ?? rewritten, undefined, tracking ? this.trackingRequest(tracking) : undefined);
|
|
5558
5610
|
await this.applyStatementMetadata(statements);
|
|
5559
|
-
return this.visibleResultForTracking(result, tracking).rows;
|
|
5611
|
+
return this.normalizedHighLevelResult(sql, this.visibleResultForTracking(result, tracking)).rows;
|
|
5560
5612
|
}
|
|
5561
5613
|
async handleTransactionControl(sql) {
|
|
5562
5614
|
const action = transactionAction(sql);
|
|
@@ -5629,7 +5681,19 @@ export class DoBackend {
|
|
|
5629
5681
|
const exec = await this.materializePublishedSchemaFunctions(execBound.sql, statement, execBound.params);
|
|
5630
5682
|
const result = await this.doExecResult(exec.sql, exec.params, tracking ? this.trackingRequest(tracking) : undefined);
|
|
5631
5683
|
await this.applyStatementMetadata(statements);
|
|
5632
|
-
|
|
5684
|
+
// metadata for the returned columns must be derived from the ORIGINAL SQL,
|
|
5685
|
+
// not the rewritten one: rewriteNode() strips every TypeCast node (so the
|
|
5686
|
+
// SQLite executor sees expressions in their PG-equivalent form), which
|
|
5687
|
+
// means `(row_to_json(t))::text AS zql_result` loses its `::text` cast in
|
|
5688
|
+
// the rewritten SQL and `expressionOid` then sees only `row_to_json(...)`
|
|
5689
|
+
// and reports the column as PG_TYPE_JSON. that triggers postgresQueryJson
|
|
5690
|
+
// → JSON.parse on the value, returning a JS object where the apex caller
|
|
5691
|
+
// expected a JSON-text string — zero's json-custom-numbers parser then
|
|
5692
|
+
// String()s the object to `[object Object]` and the permission read on a
|
|
5693
|
+
// server-side custom mutator throws "Unexpected 'o', expecting JSON value".
|
|
5694
|
+
return {
|
|
5695
|
+
rows: this.normalizedHighLevelResult(sql, this.visibleResultForTracking(result, tracking)).rows,
|
|
5696
|
+
};
|
|
5633
5697
|
}
|
|
5634
5698
|
// ── Internal helpers ─────────────────────────────────────────────────────
|
|
5635
5699
|
url(path) {
|
|
@@ -5693,6 +5757,21 @@ export class DoBackend {
|
|
|
5693
5757
|
epochMillisParamNumbers,
|
|
5694
5758
|
});
|
|
5695
5759
|
}
|
|
5760
|
+
normalizedHighLevelResult(sql, result) {
|
|
5761
|
+
if (result.rows.length === 0)
|
|
5762
|
+
return result;
|
|
5763
|
+
const fields = this.fieldsForResult(sql, result);
|
|
5764
|
+
if (fields.length === 0 || fields.every((field) => !field.oid))
|
|
5765
|
+
return result;
|
|
5766
|
+
const fieldByName = new Map(fields.map((field) => [field.name, field]));
|
|
5767
|
+
return {
|
|
5768
|
+
...result,
|
|
5769
|
+
rows: result.rows.map((row) => Object.fromEntries(Object.entries(row).map(([name, value]) => [
|
|
5770
|
+
name,
|
|
5771
|
+
postgresQueryValue(value, fieldByName.get(name)?.oid),
|
|
5772
|
+
]))),
|
|
5773
|
+
};
|
|
5774
|
+
}
|
|
5696
5775
|
inlineStatementParams(sql, params, statements, inferredJsonParamNumbers = new Set(), timestampParamNumbers = new Set(), epochMillisParamNumbers = new Set(), booleanParamNumbers = new Set()) {
|
|
5697
5776
|
if (!params?.length)
|
|
5698
5777
|
return sql;
|