extended unary expr support

This commit is contained in:
Pedro 2014-10-24 17:17:40 +02:00
parent f0bb8592cc
commit bcb39ee291
5 changed files with 19 additions and 11 deletions

View File

@ -208,9 +208,8 @@ scalar_expr:
; ;
unary_expr: unary_expr:
'-' expr { $$ = NULL; } // TODO '-' expr { $$ = Expr::makeOpUnary(UMINUS, $2); }
| '+' expr { $$ = NULL; } | NOT expr { $$ = Expr::makeOpUnary(NOT, $2); }
| NOT expr { $$ = NULL; }
; ;
binary_expr: binary_expr:

View File

@ -7,3 +7,4 @@ make clean
make execution make execution
./bin/sql_execution "SELECT a FROM foo WHERE a > 12 OR b > 3 AND c = 3" ./bin/sql_execution "SELECT a FROM foo WHERE a > 12 OR b > 3 AND c = 3"
./bin/sql_execution "SELECT col1, col2, 'test' FROM table, foo WHERE age > 12 AND zipcode = 12345 GROUP BY col1;" ./bin/sql_execution "SELECT col1, col2, 'test' FROM table, foo WHERE age > 12 AND zipcode = 12345 GROUP BY col1;"
./bin/sql_execution "SELECT * from table WHERE NOT a AND a = 12.5"

View File

@ -42,6 +42,7 @@ Expr* Expr::makeOpUnary(OperatorType op, Expr* expr) {
ALLOC_EXPR(e, eExprOperator); ALLOC_EXPR(e, eExprOperator);
e->op_type = op; e->op_type = op;
e->expr = expr; e->expr = expr;
e->expr2 = NULL;
return e; return e;
} }

View File

@ -23,14 +23,17 @@ typedef enum {
*/ */
typedef enum { typedef enum {
TRIVIAL_OP, TRIVIAL_OP,
// Binary
NOT_EQUALS, NOT_EQUALS,
LESS_EQ, LESS_EQ,
GREATER_EQ, GREATER_EQ,
LIKE, LIKE,
ISNULL,
NOT,
AND, AND,
OR OR,
// Unary
NOT,
UMINUS,
ISNULL
} OperatorType; } OperatorType;

View File

@ -27,10 +27,13 @@ void printTableRefInfo(TableRef* table, uint num_indent) {
} }
void printOperatorExpression(Expr* expr, uint num_indent) { void printOperatorExpression(Expr* expr, uint num_indent) {
if (expr == NULL) { inprint("null", num_indent); return; }
switch (expr->op_type) { switch (expr->op_type) {
case TRIVIAL_OP: inprint(expr->op_char, num_indent); break; case TRIVIAL_OP: inprint(expr->op_char, num_indent); break;
case AND: inprint("AND", num_indent); break; case AND: inprint("AND", num_indent); break;
case OR: inprint("OR", num_indent); break; case OR: inprint("OR", num_indent); break;
case NOT: inprint("NOT", num_indent); break;
default: inprint(expr->op_type, num_indent); break; default: inprint(expr->op_type, num_indent); break;
} }
printExpression(expr->expr, num_indent+1); printExpression(expr->expr, num_indent+1);
@ -45,9 +48,7 @@ void printExpression(Expr* expr, uint num_indent) {
case eExprLiteralString: inprint(expr->name, num_indent); break; case eExprLiteralString: inprint(expr->name, num_indent); break;
case eExprFunctionRef: /* todo */ break; case eExprFunctionRef: /* todo */ break;
case eExprOperator: printOperatorExpression(expr, num_indent); break; case eExprOperator: printOperatorExpression(expr, num_indent); break;
default: default: fprintf(stderr, "Unrecognized expression type %d\n", expr->type); break;
fprintf(stderr, "Unrecognized expression type %d\n", expr->type);
break;
} }
} }
@ -60,5 +61,8 @@ void printSelectStatementInfo(SelectStatement* stmt, uint num_indent) {
printTableRefInfo(stmt->from_table, num_indent+2); printTableRefInfo(stmt->from_table, num_indent+2);
inprint("Search Conditions:", num_indent+1); inprint("Search Conditions:", num_indent+1);
printExpression(stmt->where_clause, num_indent+2); if (stmt->where_clause != NULL) {
printExpression(stmt->where_clause, num_indent+2);
} else inprint("null", num_indent+2);
} }