@budibase/backend-core 2.29.21 → 2.29.23

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/index.js CHANGED
@@ -56566,6 +56566,7 @@ __export(utils_exports3, {
56566
56566
  isRowId: () => isRowId,
56567
56567
  isValidFilter: () => isValidFilter,
56568
56568
  isValidISODateString: () => isValidISODateString,
56569
+ isValidTime: () => isValidTime,
56569
56570
  sqlLog: () => sqlLog
56570
56571
  });
56571
56572
 
@@ -59437,6 +59438,7 @@ var DOUBLE_SEPARATOR = `${SEPARATOR}${SEPARATOR}`;
59437
59438
  var ROW_ID_REGEX = /^\[.*]$/g;
59438
59439
  var ENCODED_SPACE = encodeURIComponent(" ");
59439
59440
  var ISO_DATE_REGEX = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z$/;
59441
+ var TIME_REGEX = /^(?:\d{2}:)?(?:\d{2}:)(?:\d{2})$/;
59440
59442
  function isExternalTableID(tableId) {
59441
59443
  return tableId.startsWith("datasource" /* DATASOURCE */ + SEPARATOR);
59442
59444
  }
@@ -59543,6 +59545,9 @@ function isValidISODateString(str) {
59543
59545
  function isValidFilter(value) {
59544
59546
  return value != null && value !== "";
59545
59547
  }
59548
+ function isValidTime(value) {
59549
+ return TIME_REGEX.test(value);
59550
+ }
59546
59551
  function sqlLog(client, query, values2) {
59547
59552
  if (!environment_default.SQL_LOGGING_ENABLE) {
59548
59553
  return;
@@ -67621,27 +67626,20 @@ var sqlTable_default = SqlTableQueryBuilder;
67621
67626
  // src/sql/sql.ts
67622
67627
  var envLimit = environment_default.SQL_MAX_ROWS ? parseInt(environment_default.SQL_MAX_ROWS) : null;
67623
67628
  var BASE_LIMIT = envLimit || 5e3;
67624
- function likeKey(client, key) {
67625
- let start2, end2;
67629
+ function quote(client, str) {
67626
67630
  switch (client) {
67627
- case "mysql2" /* MY_SQL */:
67628
- start2 = end2 = "`";
67629
- break;
67630
67631
  case "sqlite3" /* SQL_LITE */:
67631
67632
  case "oracledb" /* ORACLE */:
67632
67633
  case "pg" /* POSTGRES */:
67633
- start2 = end2 = '"';
67634
- break;
67634
+ return `"${str}"`;
67635
67635
  case "mssql" /* MS_SQL */:
67636
- start2 = "[";
67637
- end2 = "]";
67638
- break;
67639
- default:
67640
- throw new Error("Unknown client generating like key");
67636
+ return `[${str}]`;
67637
+ case "mysql2" /* MY_SQL */:
67638
+ return `\`${str}\``;
67641
67639
  }
67642
- const parts = key.split(".");
67643
- key = parts.map((part) => `${start2}${part}${end2}`).join(".");
67644
- return key;
67640
+ }
67641
+ function quotedIdentifier(client, key) {
67642
+ return key.split(".").map((part) => quote(client, part)).join(".");
67645
67643
  }
67646
67644
  function parse(input) {
67647
67645
  if (Array.isArray(input)) {
@@ -67684,27 +67682,51 @@ function parseFilters(filters) {
67684
67682
  }
67685
67683
  function generateSelectStatement(json, knex3) {
67686
67684
  const { resource, meta } = json;
67685
+ const client = knex3.client.config.client;
67687
67686
  if (!resource || !resource.fields || resource.fields.length === 0) {
67688
67687
  return "*";
67689
67688
  }
67690
- const schema = meta?.table?.schema;
67689
+ const schema = meta.table.schema;
67691
67690
  return resource.fields.map((field) => {
67692
- const fieldNames = field.split(/\./g);
67693
- const tableName = fieldNames[0];
67694
- const columnName = fieldNames[1];
67695
- const columnSchema = schema?.[columnName];
67696
- if (columnSchema && knex3.client.config.client === "pg" /* POSTGRES */) {
67697
- const externalType = schema[columnName].externalType;
67698
- if (externalType?.includes("money")) {
67699
- return knex3.raw(
67700
- `"${tableName}"."${columnName}"::money::numeric as "${field}"`
67701
- );
67702
- }
67691
+ const parts = field.split(/\./g);
67692
+ let table = void 0;
67693
+ let column = void 0;
67694
+ if (parts.length === 1) {
67695
+ column = parts[0];
67696
+ }
67697
+ if (parts.length === 2) {
67698
+ table = parts[0];
67699
+ column = parts[1];
67700
+ }
67701
+ if (parts.length > 2) {
67702
+ table = parts[0];
67703
+ column = parts.slice(1).join(".");
67704
+ }
67705
+ if (!column) {
67706
+ throw new Error(`Invalid field name: ${field}`);
67707
+ }
67708
+ const columnSchema = schema[column];
67709
+ if (client === "pg" /* POSTGRES */ && columnSchema?.externalType?.includes("money")) {
67710
+ return knex3.raw(
67711
+ `${quotedIdentifier(
67712
+ client,
67713
+ [table, column].join(".")
67714
+ )}::money::numeric as ${quote(client, field)}`
67715
+ );
67703
67716
  }
67704
- if (knex3.client.config.client === "mssql" /* MS_SQL */ && columnSchema?.type === "datetime" /* DATETIME */ && columnSchema.timeOnly) {
67717
+ if (client === "mssql" /* MS_SQL */ && columnSchema?.type === "datetime" /* DATETIME */ && columnSchema.timeOnly) {
67705
67718
  return knex3.raw(`CONVERT(varchar, ${field}, 108) as "${field}"`);
67706
67719
  }
67707
- return `${field} as ${field}`;
67720
+ if (table) {
67721
+ return knex3.raw(
67722
+ `${quote(client, table)}.${quote(client, column)} as ${quote(
67723
+ client,
67724
+ field
67725
+ )}`
67726
+ );
67727
+ } else {
67728
+ return knex3.raw(`${quote(client, field)} as ${quote(client, field)}`);
67729
+ }
67708
67730
  });
67709
67731
  }
67710
67732
  function getTableName(table) {
@@ -67780,9 +67802,10 @@ var InternalBuilder = class {
67780
67802
  query = query[fnc](key, "ilike", `%${value}%`);
67781
67803
  } else {
67782
67804
  const rawFnc = `${fnc}Raw`;
67783
- query = query[rawFnc](`LOWER(${likeKey(this.client, key)}) LIKE ?`, [
67784
- `%${value.toLowerCase()}%`
67785
- ]);
67805
+ query = query[rawFnc](
67806
+ `LOWER(${quotedIdentifier(this.client, key)}) LIKE ?`,
67807
+ [`%${value.toLowerCase()}%`]
67808
+ );
67786
67809
  }
67787
67810
  };
67788
67811
  const contains = (mode, any = false) => {
@@ -67829,7 +67852,10 @@ var InternalBuilder = class {
67829
67852
  } else {
67830
67853
  value[i] = `%${value[i]}%`;
67831
67854
  }
67832
- statement += (statement ? andOr : "") + `COALESCE(LOWER(${likeKey(this.client, key)}), '') LIKE ?`;
67855
+ statement += (statement ? andOr : "") + `COALESCE(LOWER(${quotedIdentifier(
67856
+ this.client,
67857
+ key
67858
+ )}), '') LIKE ?`;
67833
67859
  }
67834
67860
  if (statement === "") {
67835
67861
  return;
@@ -67857,9 +67883,10 @@ var InternalBuilder = class {
67857
67883
  query = query[fnc](key, "ilike", `${value}%`);
67858
67884
  } else {
67859
67885
  const rawFnc = `${fnc}Raw`;
67860
- query = query[rawFnc](`LOWER(${likeKey(this.client, key)}) LIKE ?`, [
67861
- `${value.toLowerCase()}%`
67862
- ]);
67886
+ query = query[rawFnc](
67887
+ `LOWER(${quotedIdentifier(this.client, key)}) LIKE ?`,
67888
+ [`${value.toLowerCase()}%`]
67889
+ );
67863
67890
  }
67864
67891
  });
67865
67892
  }
@@ -67892,12 +67919,20 @@ var InternalBuilder = class {
67892
67919
  const fnc = allOr ? "orWhereRaw" : "whereRaw";
67893
67920
  if (this.client === "mssql" /* MS_SQL */) {
67894
67921
  query = query[fnc](
67895
- `CASE WHEN ${likeKey(this.client, key)} = ? THEN 1 ELSE 0 END = 1`,
67922
+ `CASE WHEN ${quotedIdentifier(
67923
+ this.client,
67924
+ key
67925
+ )} = ? THEN 1 ELSE 0 END = 1`,
67926
+ [value]
67927
+ );
67928
+ } else if (this.client === "oracledb" /* ORACLE */) {
67929
+ query = query[fnc](
67930
+ `COALESCE(${quotedIdentifier(this.client, key)}, -1) = ?`,
67896
67931
  [value]
67897
67932
  );
67898
67933
  } else {
67899
67934
  query = query[fnc](
67900
- `COALESCE(${likeKey(this.client, key)} = ?, FALSE)`,
67935
+ `COALESCE(${quotedIdentifier(this.client, key)} = ?, FALSE)`,
67901
67936
  [value]
67902
67937
  );
67903
67938
  }
@@ -67908,12 +67943,20 @@ var InternalBuilder = class {
67908
67943
  const fnc = allOr ? "orWhereRaw" : "whereRaw";
67909
67944
  if (this.client === "mssql" /* MS_SQL */) {
67910
67945
  query = query[fnc](
67911
- `CASE WHEN ${likeKey(this.client, key)} = ? THEN 1 ELSE 0 END = 0`,
67946
+ `CASE WHEN ${quotedIdentifier(
67947
+ this.client,
67948
+ key
67949
+ )} = ? THEN 1 ELSE 0 END = 0`,
67950
+ [value]
67951
+ );
67952
+ } else if (this.client === "oracledb" /* ORACLE */) {
67953
+ query = query[fnc](
67954
+ `COALESCE(${quotedIdentifier(this.client, key)}, -1) != ?`,
67912
67955
  [value]
67913
67956
  );
67914
67957
  } else {
67915
67958
  query = query[fnc](
67916
- `COALESCE(${likeKey(this.client, key)} != ?, TRUE)`,
67959
+ `COALESCE(${quotedIdentifier(this.client, key)} != ?, TRUE)`,
67917
67960
  [value]
67918
67961
  );
67919
67962
  }