PG: Fixes issues comparing to zero or false (#4667)

* initial test

* more test

* clean up

* added correct errors

* test fix

* $eq null test

* type check
This commit is contained in:
Diamond Lewis
2018-03-24 17:45:34 -05:00
committed by GitHub
parent 1a5c05b6a8
commit 710848938f
3 changed files with 231 additions and 10 deletions

View File

@@ -287,7 +287,14 @@ const buildWhereClause = ({ schema, query, index }) => {
index += 2;
} else if (typeof fieldValue === 'boolean') {
patterns.push(`$${index}:name = $${index + 1}`);
values.push(fieldName, fieldValue);
// Can't cast boolean to double precision
if (schema.fields[fieldName] && schema.fields[fieldName].type === 'Number') {
// Should always return zero results
const MAX_INT_PLUS_ONE = 9223372036854775808;
values.push(fieldName, MAX_INT_PLUS_ONE);
} else {
values.push(fieldName, fieldValue);
}
index += 2;
} else if (typeof fieldValue === 'number') {
patterns.push(`$${index}:name = $${index + 1}`);
@@ -329,11 +336,16 @@ const buildWhereClause = ({ schema, query, index }) => {
values.push(fieldName, fieldValue.$ne);
index += 2;
}
if (fieldValue.$eq) {
patterns.push(`$${index}:name = $${index + 1}`);
values.push(fieldName, fieldValue.$eq);
index += 2;
if (fieldValue.$eq !== undefined) {
if (fieldValue.$eq === null) {
patterns.push(`$${index}:name IS NULL`);
values.push(fieldName);
index += 1;
} else {
patterns.push(`$${index}:name = $${index + 1}`);
values.push(fieldName, fieldValue.$eq);
index += 2;
}
}
const isInOrNin = Array.isArray(fieldValue.$in) || Array.isArray(fieldValue.$nin);
if (Array.isArray(fieldValue.$in) &&
@@ -393,6 +405,10 @@ const buildWhereClause = ({ schema, query, index }) => {
if (fieldValue.$nin) {
createConstraint(_.flatMap(fieldValue.$nin, elt => elt), true);
}
} else if(typeof fieldValue.$in !== 'undefined') {
throw new Parse.Error(Parse.Error.INVALID_JSON, 'bad $in value');
} else if (typeof fieldValue.$nin !== 'undefined') {
throw new Parse.Error(Parse.Error.INVALID_JSON, 'bad $nin value');
}
if (Array.isArray(fieldValue.$all) && isArrayField) {
@@ -578,7 +594,7 @@ const buildWhereClause = ({ schema, query, index }) => {
}
Object.keys(ParseToPosgresComparator).forEach(cmp => {
if (fieldValue[cmp]) {
if (fieldValue[cmp] || fieldValue[cmp] === 0) {
const pgComparator = ParseToPosgresComparator[cmp];
patterns.push(`$${index}:name ${pgComparator} $${index + 1}`);
values.push(fieldName, toPostgresValue(fieldValue[cmp]));