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.
@@ -97,6 +97,7 @@ export declare class DoBackend {
97
97
  private canCacheRewrite;
98
98
  private rememberRewrite;
99
99
  private rewriteSQL;
100
+ private normalizedHighLevelResult;
100
101
  private inlineStatementParams;
101
102
  private doExec;
102
103
  private doExecResult;
@@ -1 +1 @@
1
- {"version":3,"file":"pg-proxy-do-backend.d.ts","sourceRoot":"","sources":["../src/pg-proxy-do-backend.ts"],"names":[],"mappings":"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"}
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
- flattenRangeVar(node.relation);
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
- return this.visibleResultForTracking(result, tracking).rows;
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
- return { rows: this.visibleResultForTracking(result, tracking).rows };
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;