Support comparisons with MDB_FLOAT and MDB_DOUBLE

See https://github.com/mdbtools/mdbtools/issues/105
This commit is contained in:
Evan Miller 2020-09-02 21:24:24 -04:00
parent aa0ce8fb3e
commit a13936bd77

View File

@ -107,28 +107,29 @@ static double poor_mans_trunc(double x)
int mdb_test_double(int op, double vd, double d) int mdb_test_double(int op, double vd, double d)
{ {
int ret = 0;
switch (op) { switch (op) {
case MDB_EQUAL: case MDB_EQUAL:
//fprintf(stderr, "comparing %lf and %lf\n", d, node->value.d); //fprintf(stderr, "comparing %lf and %lf\n", d, node->value.d);
if (vd == d) return 1; ret = (vd == d);
break; break;
case MDB_GT: case MDB_GT:
if (vd < d) return 1; ret = (vd < d);
break; break;
case MDB_LT: case MDB_LT:
if (vd > d) return 1; ret = (vd > d);
break; break;
case MDB_GTEQ: case MDB_GTEQ:
if (vd <= d) return 1; ret = (vd <= d);
break; break;
case MDB_LTEQ: case MDB_LTEQ:
if (vd >= d) return 1; ret = (vd >= d);
break; break;
default: default:
fprintf(stderr, "Calling mdb_test_sarg on unknown operator. Add code to mdb_test_double() for operator %d\n",op); fprintf(stderr, "Calling mdb_test_sarg on unknown operator. Add code to mdb_test_double() for operator %d\n",op);
break; break;
} }
return 0; return ret;
} }
#if 0 // Obsolete #if 0 // Obsolete
@ -210,42 +211,49 @@ mdb_test_sarg(MdbHandle *mdb, MdbColumn *col, MdbSargNode *node, MdbField *field
{ {
char tmpbuf[256]; char tmpbuf[256];
char* val; char* val;
int ret; int ret = 1;
if (node->op == MDB_ISNULL) if (node->op == MDB_ISNULL)
return field->is_null?1:0; ret = field->is_null;
else if (node->op == MDB_NOTNULL) else if (node->op == MDB_NOTNULL)
return field->is_null?0:1; ret = !field->is_null;
switch (col->col_type) { switch (col->col_type) {
case MDB_BOOL: case MDB_BOOL:
return mdb_test_int(node, !field->is_null); ret = mdb_test_int(node, !field->is_null);
break; break;
case MDB_BYTE: case MDB_BYTE:
return mdb_test_int(node, (gint32)((char *)field->value)[0]); ret = mdb_test_int(node, (gint32)((char *)field->value)[0]);
break; break;
case MDB_INT: case MDB_INT:
return mdb_test_int(node, (gint32)mdb_get_int16(field->value, 0)); ret = mdb_test_int(node, (gint32)mdb_get_int16(field->value, 0));
break; break;
case MDB_LONGINT: case MDB_LONGINT:
return mdb_test_int(node, (gint32)mdb_get_int32(field->value, 0)); ret = mdb_test_int(node, (gint32)mdb_get_int32(field->value, 0));
break;
case MDB_FLOAT:
ret = mdb_test_double(node->op, node->value.d, mdb_get_single(field->value, 0));
break;
case MDB_DOUBLE:
ret = mdb_test_double(node->op, node->value.d, mdb_get_double(field->value, 0));
break; break;
case MDB_TEXT: case MDB_TEXT:
mdb_unicode2ascii(mdb, field->value, field->siz, tmpbuf, 256); mdb_unicode2ascii(mdb, field->value, field->siz, tmpbuf, 256);
return mdb_test_string(node, tmpbuf); ret = mdb_test_string(node, tmpbuf);
break;
case MDB_MEMO: case MDB_MEMO:
val = mdb_col_to_string(mdb, mdb->pg_buf, field->start, col->col_type, (gint32)mdb_get_int32(field->value, 0)); val = mdb_col_to_string(mdb, mdb->pg_buf, field->start, col->col_type, (gint32)mdb_get_int32(field->value, 0));
//printf("%s\n",val); //printf("%s\n",val);
ret = mdb_test_string(node, val); ret = mdb_test_string(node, val);
g_free(val); g_free(val);
return ret;
break; break;
case MDB_DATETIME: case MDB_DATETIME:
return mdb_test_double(node->op, poor_mans_trunc(node->value.d), poor_mans_trunc(mdb_get_double(field->value, 0))); ret = mdb_test_double(node->op, poor_mans_trunc(node->value.d), poor_mans_trunc(mdb_get_double(field->value, 0)));
break;
default: default:
fprintf(stderr, "Calling mdb_test_sarg on unknown type. Add code to mdb_test_sarg() for type %d\n",col->col_type); fprintf(stderr, "Calling mdb_test_sarg on unknown type. Add code to mdb_test_sarg() for type %d\n",col->col_type);
break; break;
} }
return 1; return ret;
} }
int int
mdb_find_field(int col_num, MdbField *fields, int num_fields) mdb_find_field(int col_num, MdbField *fields, int num_fields)