From 66ed307c520ecd24cce0aeddf1dc1b62ed00fd04 Mon Sep 17 00:00:00 2001 From: Ivan Pantic Date: Sun, 7 Nov 2021 20:46:53 +0100 Subject: [PATCH] Revert changes to ColumnNames and Column values (too many tricky gotchas). Fix problem with AND concatenation. Better IS NULL flow. --- src/db/core.ts | 43 +++++++++++-------------------------------- 1 file changed, 11 insertions(+), 32 deletions(-) diff --git a/src/db/core.ts b/src/db/core.ts index 3a0cc62..4525ef9 100644 --- a/src/db/core.ts +++ b/src/db/core.ts @@ -362,9 +362,8 @@ export class SQLFragment // a ColumnNames-wrapped object -> quoted names in a repeatable order // OR a ColumnNames-wrapped array -> quoted array values const columnNames = Array.isArray(expression.value) ? expression.value : - Object.keys(expression.value).filter(key => (expression.value)[key] !== undefined).sort(); + Object.keys(expression.value).sort(); result.text += columnNames.map(k => `"${k}"`).join(', '); - } else if (expression instanceof ColumnValues) { // a ColumnValues-wrapped object OR array // -> values (in ColumnNames-matching order, if applicable) punted as SQLFragments or Parameters @@ -382,23 +381,12 @@ export class SQLFragment const columnNames = Object.keys(expression.value).sort(), columnValues = columnNames.map(k => (expression.value)[k]); - - let firstField = true; + for (let i = 0, len = columnValues.length; i < len; i++) { const columnName = columnNames[i], columnValue = columnValues[i]; - - if (columnValue === undefined) { - // Pretend undefineds are not there - continue; - } - - if (firstField) { - firstField = false; - } else { - result.text += ', '; - } + if (i > 0) result.text += ', '; if (columnValue instanceof SQLFragment || columnValue instanceof Parameter || columnValue === Default) this.compileExpression(columnValue, result, parentTable, columnName); @@ -408,36 +396,27 @@ export class SQLFragment } else if (typeof expression === 'object') { // must be a Whereable object, so put together a WHERE clause - const columnNames = Object.keys(expression).sort(); + const columnNames = Object.keys(expression).filter(key => (expression)[key] !== undefined).sort(); if (columnNames.length) { // if the object is not empty - let firstField = true; result.text += '('; for (let i = 0, len = columnNames.length; i < len; i++) { const columnName = columnNames[i], columnValue = (expression)[columnName]; - - if (columnValue === undefined) { - // Pretend undefineds are not there - continue; - } - - if (firstField) { - firstField = false; - } else { - result.text += ' AND '; - } + if (i > 0) result.text += ' AND '; if (columnValue instanceof SQLFragment) { result.text += '('; this.compileExpression(columnValue, result, parentTable, columnName); result.text += ')'; } else { - const assignOperator = columnValue === null ? 'IS' : '='; - result.text += `"${columnName}" ${assignOperator} `; - this.compileExpression(columnValue instanceof ParentColumn ? columnValue : new Parameter(columnValue), - result, parentTable, columnName); + if (columnValue === null) { + result.text += `"${columnName}" IS NULL`; + } else { + result.text += `"${columnName}" = `; + this.compileExpression(columnValue instanceof ParentColumn ? columnValue : new Parameter(columnValue), result, parentTable, columnName); + } } } result.text += ')';