Implement NOT EXISTS
This commit is contained in:
parent
177901816f
commit
a0e55035fd
|
@ -661,12 +661,11 @@ logic_expr:
|
||||||
| expr OR expr { $$ = Expr::makeOpBinary($1, Expr::OR, $3); }
|
| expr OR expr { $$ = Expr::makeOpBinary($1, Expr::OR, $3); }
|
||||||
;
|
;
|
||||||
|
|
||||||
// TODO:
|
|
||||||
in_expr:
|
in_expr:
|
||||||
operand IN '(' expr_list ')' { $$ = Expr::makeInOperator($1, $4, false); }
|
operand IN '(' expr_list ')' { $$ = Expr::makeInOperator($1, $4); }
|
||||||
| operand NOT IN '(' expr_list ')' { $$ = Expr::makeInOperator($1, $5, true); }
|
| operand NOT IN '(' expr_list ')' { $$ = Expr::makeOpUnary(Expr::NOT, Expr::makeInOperator($1, $5)); }
|
||||||
| operand IN '(' select_no_paren ')' { $$ = Expr::makeInOperator($1, $4, false); }
|
| operand IN '(' select_no_paren ')' { $$ = Expr::makeInOperator($1, $4); }
|
||||||
| operand NOT IN '(' select_no_paren ')' { $$ = Expr::makeInOperator($1, $5, true); }
|
| operand NOT IN '(' select_no_paren ')' { $$ = Expr::makeOpUnary(Expr::NOT, Expr::makeInOperator($1, $5)); }
|
||||||
;
|
;
|
||||||
|
|
||||||
// TODO: allow no else specified
|
// TODO: allow no else specified
|
||||||
|
@ -676,6 +675,7 @@ case_expr:
|
||||||
|
|
||||||
exists_expr:
|
exists_expr:
|
||||||
EXISTS '(' select_no_paren ')' { $$ = Expr::makeExists($3); }
|
EXISTS '(' select_no_paren ')' { $$ = Expr::makeExists($3); }
|
||||||
|
| NOT EXISTS '(' select_no_paren ')' { $$ = Expr::makeOpUnary(Expr::NOT, Expr::makeExists($4)); }
|
||||||
;
|
;
|
||||||
|
|
||||||
comp_expr:
|
comp_expr:
|
||||||
|
|
|
@ -137,37 +137,21 @@ namespace hsql {
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr* Expr::makeInOperator(Expr* expr, std::vector<Expr*>* exprList, bool notIn) {
|
Expr* Expr::makeInOperator(Expr* expr, std::vector<Expr*>* exprList) {
|
||||||
Expr* e = new Expr(kExprOperator);
|
Expr* e = new Expr(kExprOperator);
|
||||||
e->opType = IN;
|
e->opType = IN;
|
||||||
e->expr = expr;
|
e->expr = expr;
|
||||||
e->exprList = exprList;
|
e->exprList = exprList;
|
||||||
|
|
||||||
// If it is NOT IN, wrap the IN in a NOT operator.
|
|
||||||
if (notIn) {
|
|
||||||
Expr* neg = new Expr(kExprOperator);
|
|
||||||
neg->opType = NOT;
|
|
||||||
neg->expr = e;
|
|
||||||
return neg;
|
|
||||||
}
|
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr* Expr::makeInOperator(Expr* expr, SelectStatement* select, bool notIn) {
|
Expr* Expr::makeInOperator(Expr* expr, SelectStatement* select) {
|
||||||
Expr* e = new Expr(kExprOperator);
|
Expr* e = new Expr(kExprOperator);
|
||||||
e->opType = IN;
|
e->opType = IN;
|
||||||
e->expr = expr;
|
e->expr = expr;
|
||||||
e->select = select;
|
e->select = select;
|
||||||
|
|
||||||
// If it is NOT IN, wrap the IN in a NOT operator.
|
|
||||||
if (notIn) {
|
|
||||||
Expr* neg = new Expr(kExprOperator);
|
|
||||||
neg->opType = NOT;
|
|
||||||
neg->expr = e;
|
|
||||||
return neg;
|
|
||||||
}
|
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -133,9 +133,9 @@ namespace hsql {
|
||||||
|
|
||||||
static Expr* makeExists(SelectStatement* select);
|
static Expr* makeExists(SelectStatement* select);
|
||||||
|
|
||||||
static Expr* makeInOperator(Expr* expr, std::vector<Expr*>* exprList, bool notIn);
|
static Expr* makeInOperator(Expr* expr, std::vector<Expr*>* exprList);
|
||||||
|
|
||||||
static Expr* makeInOperator(Expr* expr, SelectStatement* select, bool notIn);
|
static Expr* makeInOperator(Expr* expr, SelectStatement* select);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Zero initializes an Expr object and assigns it to a space in the heap
|
// Zero initializes an Expr object and assigns it to a space in the heap
|
||||||
|
|
Loading…
Reference in New Issue