Add support for <> SQL operator (#329)

This commit is contained in:
Nyall Dawson
2021-08-22 14:28:29 +10:00
committed by GitHub
parent 6a15f6b1e6
commit fadd536e2e
5 changed files with 17 additions and 2 deletions

View File

@@ -129,6 +129,7 @@ enum {
MDB_ISNULL, MDB_ISNULL,
MDB_NOTNULL, MDB_NOTNULL,
MDB_ILIKE, MDB_ILIKE,
MDB_NEQ,
}; };
typedef enum { typedef enum {
@@ -162,6 +163,7 @@ enum {
x == MDB_LT || \ x == MDB_LT || \
x == MDB_GTEQ || \ x == MDB_GTEQ || \
x == MDB_LTEQ || \ x == MDB_LTEQ || \
x == MDB_NEQ || \
x == MDB_LIKE || \ x == MDB_LIKE || \
x == MDB_ILIKE || \ x == MDB_ILIKE || \
x == MDB_ISNULL || \ x == MDB_ISNULL || \

View File

@@ -67,6 +67,9 @@ int rc;
case MDB_LTEQ: case MDB_LTEQ:
if (rc>=0) return 1; if (rc>=0) return 1;
break; break;
case MDB_NEQ:
if (rc!=0) return 1;
break;
default: default:
fprintf(stderr, "Calling mdb_test_sarg on unknown operator. Add code to mdb_test_string() for operator %d\n",node->op); fprintf(stderr, "Calling mdb_test_sarg on unknown operator. Add code to mdb_test_string() for operator %d\n",node->op);
break; break;
@@ -92,6 +95,9 @@ int mdb_test_int(MdbSargNode *node, gint32 i)
case MDB_LTEQ: case MDB_LTEQ:
if (node->value.i >= i) return 1; if (node->value.i >= i) return 1;
break; break;
case MDB_NEQ:
if (node->value.i != i) return 1;
break;
default: default:
fprintf(stderr, "Calling mdb_test_sarg on unknown operator. Add code to mdb_test_int() for operator %d\n",node->op); fprintf(stderr, "Calling mdb_test_sarg on unknown operator. Add code to mdb_test_int() for operator %d\n",node->op);
break; break;
@@ -129,6 +135,9 @@ int mdb_test_double(int op, double vd, double d)
case MDB_LTEQ: case MDB_LTEQ:
ret = (vd >= d); ret = (vd >= d);
break; break;
case MDB_NEQ:
ret = (vd != d);
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;

View File

@@ -68,6 +68,7 @@ null { return NUL; }
"=" { return EQ; } "=" { return EQ; }
(<=) { return LTEQ; } (<=) { return LTEQ; }
(>=) { return GTEQ; } (>=) { return GTEQ; }
(<>) { return NEQ; }
"<" { return LT; } "<" { return LT; }
">" { return GT; } ">" { return GT; }
like { return LIKE; } like { return LIKE; }

View File

@@ -399,6 +399,7 @@ mdb_sql_eval_expr(MdbSQL *sql, char *const1, int op, char *const2)
case MDB_LTEQ: compar = (value <= 0); break; case MDB_LTEQ: compar = (value <= 0); break;
case MDB_LIKE: compar = mdb_like_cmp(const1,const2); break; case MDB_LIKE: compar = mdb_like_cmp(const1,const2); break;
case MDB_ILIKE: compar = mdb_ilike_cmp(const1,const2); break; case MDB_ILIKE: compar = mdb_ilike_cmp(const1,const2); break;
case MDB_NEQ: compar = (value ? 1 : 0); break;
default: illop = 1; default: illop = 1;
} }
} else if (const1[0]!='\'' && const2[0]!='\'') { } else if (const1[0]!='\'' && const2[0]!='\'') {
@@ -410,6 +411,7 @@ mdb_sql_eval_expr(MdbSQL *sql, char *const1, int op, char *const2)
case MDB_GTEQ: compar = (val1 >= val2); break; case MDB_GTEQ: compar = (val1 >= val2); break;
case MDB_LT: compar = (val1 < val2); break; case MDB_LT: compar = (val1 < val2); break;
case MDB_LTEQ: compar = (val1 <= val2); break; case MDB_LTEQ: compar = (val1 <= val2); break;
case MDB_NEQ: compar = (val1 != val2); break;
default: illop = 1; default: illop = 1;
} }
} else { } else {

View File

@@ -63,7 +63,7 @@ typedef struct sql_context
%token <name> IDENT NAME PATH STRING NUMBER OPENING CLOSING %token <name> IDENT NAME PATH STRING NUMBER OPENING CLOSING
%token SELECT FROM WHERE CONNECT DISCONNECT TO LIST TABLES AND OR NOT LIMIT COUNT STRPTIME %token SELECT FROM WHERE CONNECT DISCONNECT TO LIST TABLES AND OR NOT LIMIT COUNT STRPTIME
%token DESCRIBE TABLE TOP PERCENT %token DESCRIBE TABLE TOP PERCENT
%token LTEQ GTEQ LIKE ILIKE IS NUL %token LTEQ GTEQ NEQ LIKE ILIKE IS NUL
%type <name> database %type <name> database
%type <name> constant %type <name> constant
@@ -81,7 +81,7 @@ typedef struct sql_context
%left OR %left OR
%left AND %left AND
%right NOT %right NOT
%left EQ LTEQ GTEQ LT GT LIKE ILIKE IS %left EQ LTEQ GTEQ NEQ LT GT LIKE ILIKE IS
%% %%
@@ -192,6 +192,7 @@ operator:
| LT { $$ = MDB_LT; } | LT { $$ = MDB_LT; }
| LTEQ { $$ = MDB_LTEQ; } | LTEQ { $$ = MDB_LTEQ; }
| GTEQ { $$ = MDB_GTEQ; } | GTEQ { $$ = MDB_GTEQ; }
| NEQ { $$ = MDB_NEQ; }
| LIKE { $$ = MDB_LIKE; } | LIKE { $$ = MDB_LIKE; }
| ILIKE { $$ = MDB_ILIKE; } | ILIKE { $$ = MDB_ILIKE; }
; ;