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); } | ||||
| 	; | ||||
| 
 | ||||
| // TODO: | ||||
| in_expr: | ||||
| 		operand IN '(' expr_list ')'			{ $$ = Expr::makeInOperator($1, $4, false); } | ||||
| 	|	operand NOT IN '(' expr_list ')'		{ $$ = Expr::makeInOperator($1, $5, true); } | ||||
| 	|	operand IN '(' select_no_paren ')'		{ $$ = Expr::makeInOperator($1, $4, false); } | ||||
| 	|	operand NOT IN '(' select_no_paren ')'	{ $$ = Expr::makeInOperator($1, $5, true); } | ||||
| 		operand IN '(' expr_list ')'			{ $$ = Expr::makeInOperator($1, $4); } | ||||
| 	|	operand NOT IN '(' expr_list ')'		{ $$ = Expr::makeOpUnary(Expr::NOT, Expr::makeInOperator($1, $5)); } | ||||
| 	|	operand IN '(' select_no_paren ')'		{ $$ = Expr::makeInOperator($1, $4); } | ||||
| 	|	operand NOT IN '(' select_no_paren ')'	{ $$ = Expr::makeOpUnary(Expr::NOT, Expr::makeInOperator($1, $5)); } | ||||
| 	; | ||||
| 
 | ||||
| // TODO: allow no else specified | ||||
| @ -676,6 +675,7 @@ case_expr: | ||||
| 
 | ||||
| exists_expr: | ||||
| 		EXISTS '(' select_no_paren ')' { $$ = Expr::makeExists($3); } | ||||
| 	|	NOT EXISTS '(' select_no_paren ')' { $$ = Expr::makeOpUnary(Expr::NOT, Expr::makeExists($4)); } | ||||
| 	; | ||||
| 
 | ||||
| comp_expr: | ||||
|  | ||||
| @ -137,37 +137,21 @@ namespace hsql { | ||||
|     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); | ||||
|     e->opType = IN; | ||||
|     e->expr = expr; | ||||
|     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; | ||||
|   } | ||||
| 
 | ||||
|   Expr* Expr::makeInOperator(Expr* expr, SelectStatement* select, bool notIn) { | ||||
|   Expr* Expr::makeInOperator(Expr* expr, SelectStatement* select) { | ||||
|     Expr* e = new Expr(kExprOperator); | ||||
|     e->opType = IN; | ||||
|     e->expr = expr; | ||||
|     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; | ||||
|   } | ||||
| 
 | ||||
|  | ||||
| @ -133,9 +133,9 @@ namespace hsql { | ||||
| 
 | ||||
|     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
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Pedro
						Pedro