Allow function expressions to have variable length of parameters
This commit is contained in:
parent
f82504b319
commit
9ecfa8e8f6
|
@ -644,7 +644,7 @@ comp_expr:
|
|||
;
|
||||
|
||||
function_expr:
|
||||
IDENTIFIER '(' opt_distinct expr ')' { $$ = Expr::makeFunctionRef($1, $4, $3); }
|
||||
IDENTIFIER '(' opt_distinct expr_list ')' { $$ = Expr::makeFunctionRef($1, $4, $3); }
|
||||
;
|
||||
|
||||
column_name:
|
||||
|
|
|
@ -79,10 +79,10 @@ namespace hsql {
|
|||
return e;
|
||||
}
|
||||
|
||||
Expr* Expr::makeFunctionRef(char* func_name, Expr* expr, bool distinct) {
|
||||
Expr* Expr::makeFunctionRef(char* func_name, std::vector<Expr*>* exprList, bool distinct) {
|
||||
Expr* e = new Expr(kExprFunctionRef);
|
||||
e->name = func_name;
|
||||
e->expr = expr;
|
||||
e->exprList = exprList;
|
||||
e->distinct = distinct;
|
||||
return e;
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
#include <stdlib.h>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
namespace hsql {
|
||||
|
||||
|
@ -61,6 +62,7 @@ namespace hsql {
|
|||
|
||||
Expr* expr;
|
||||
Expr* expr2;
|
||||
std::vector<Expr*>* exprList;
|
||||
char* name;
|
||||
char* table;
|
||||
char* alias;
|
||||
|
@ -107,7 +109,7 @@ namespace hsql {
|
|||
|
||||
static Expr* makeColumnRef(char* table, char* name);
|
||||
|
||||
static Expr* makeFunctionRef(char* func_name, Expr* expr, bool distinct);
|
||||
static Expr* makeFunctionRef(char* func_name, std::vector<Expr*>* exprList, bool distinct);
|
||||
|
||||
static Expr* makePlaceholder(int id);
|
||||
};
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
-- http://www.sqlserver-dba.com/2011/09/this-is-a-followup-on-my-earlier-post-of-sql-server-test-data-generation-testing-tools-i-had-some-requests-for-my-set-up-pr.html
|
||||
SELECT TOP 100 S_ACCTBAL, S_NAME, N_NAME, P_PARTKEY, P_MFGR, S_ADDRESS, S_PHONE, S_COMMENT
|
||||
FROM PART, SUPPLIER, PARTSUPP, NATION, REGION
|
||||
FROM "PART", SUPPLIER, PARTSUPP, NATION, REGION
|
||||
WHERE P_PARTKEY = PS_PARTKEY AND S_SUPPKEY = PS_SUPPKEY AND P_SIZE = 15 AND
|
||||
P_TYPE LIKE '%%BRASS' AND S_NATIONKEY = N_NATIONKEY AND N_REGIONKEY = R_REGIONKEY AND
|
||||
R_NAME = 'EUROPE' AND
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
SELECT NATION, O_YEAR, SUM(AMOUNT) AS SUM_PROFIT
|
||||
FROM (SELECT N_NAME AS NATION, datepart(yy, O_ORDERDATE) AS O_YEAR,
|
||||
L_EXTENDEDPRICE*(1-L_DISCOUNT)-PS_SUPPLYCOST*L_QUANTITY AS AMOUNT
|
||||
FROM PART, SUPPLIER, LINEITEM, PARTSUPP, ORDERS, NATION
|
||||
FROM "PART", SUPPLIER, LINEITEM, PARTSUPP, ORDERS, NATION
|
||||
WHERE S_SUPPKEY = L_SUPPKEY AND PS_SUPPKEY= L_SUPPKEY AND PS_PARTKEY = L_PARTKEY AND
|
||||
P_PARTKEY= L_PARTKEY AND O_ORDERKEY = L_ORDERKEY AND S_NATIONKEY = N_NATIONKEY AND
|
||||
P_NAME LIKE '%%green%%') AS PROFIT
|
||||
|
|
|
@ -20,6 +20,45 @@ TEST(SelectTest) {
|
|||
delete result;
|
||||
}
|
||||
|
||||
TEST(SelectExprTest) {
|
||||
TEST_PARSE_SINGLE_SQL(
|
||||
"SELECT a, MAX(b), CUSTOM(c, F(un)) FROM students;",
|
||||
kStmtSelect,
|
||||
SelectStatement,
|
||||
result,
|
||||
stmt);
|
||||
|
||||
ASSERT_NULL(stmt->whereClause);
|
||||
ASSERT_NULL(stmt->groupBy);
|
||||
|
||||
ASSERT_EQ(stmt->selectList->size(), 3);
|
||||
|
||||
ASSERT(stmt->selectList->at(0)->isType(kExprColumnRef));
|
||||
ASSERT_STREQ(stmt->selectList->at(0)->getName(), "a");
|
||||
|
||||
ASSERT(stmt->selectList->at(1)->isType(kExprFunctionRef));
|
||||
ASSERT_STREQ(stmt->selectList->at(1)->getName(), "MAX");
|
||||
ASSERT_NOTNULL(stmt->selectList->at(1)->exprList);
|
||||
ASSERT_EQ(stmt->selectList->at(1)->exprList->size(), 1);
|
||||
ASSERT(stmt->selectList->at(1)->exprList->at(0)->isType(kExprColumnRef));
|
||||
ASSERT_STREQ(stmt->selectList->at(1)->exprList->at(0)->getName(), "b");
|
||||
|
||||
ASSERT(stmt->selectList->at(2)->isType(kExprFunctionRef));
|
||||
ASSERT_STREQ(stmt->selectList->at(2)->getName(), "CUSTOM");
|
||||
ASSERT_NOTNULL(stmt->selectList->at(2)->exprList);
|
||||
ASSERT_EQ(stmt->selectList->at(2)->exprList->size(), 2);
|
||||
ASSERT(stmt->selectList->at(2)->exprList->at(0)->isType(kExprColumnRef));
|
||||
ASSERT_STREQ(stmt->selectList->at(2)->exprList->at(0)->getName(), "c");
|
||||
|
||||
ASSERT(stmt->selectList->at(2)->exprList->at(1)->isType(kExprFunctionRef));
|
||||
ASSERT_STREQ(stmt->selectList->at(2)->exprList->at(1)->getName(), "F");
|
||||
ASSERT_EQ(stmt->selectList->at(2)->exprList->at(1)->exprList->size(), 1);
|
||||
ASSERT(stmt->selectList->at(2)->exprList->at(1)->exprList->at(0)->isType(kExprColumnRef));
|
||||
ASSERT_STREQ(stmt->selectList->at(2)->exprList->at(1)->exprList->at(0)->getName(), "un");
|
||||
|
||||
delete result;
|
||||
}
|
||||
|
||||
|
||||
TEST(SelectHavingTest) {
|
||||
TEST_PARSE_SINGLE_SQL(
|
||||
|
|
|
@ -9,6 +9,7 @@ SELECT * FROM t1 UNION SELECT * FROM t2 ORDER BY col1;
|
|||
SELECT * FROM (SELECT * FROM t1);
|
||||
SELECT * FROM t1 UNION (SELECT * FROM t2 UNION SELECT * FROM t3) ORDER BY col1;
|
||||
SELECT TOP 10 * FROM t1 ORDER BY col1, col2;
|
||||
SELECT a, MAX(b), MAX(c, d), CUSTOM(q, UP(r)) AS f FROM t1;
|
||||
# JOIN
|
||||
SELECT t1.a, t1.b, t2.c FROM "table" AS t1 JOIN (SELECT * FROM foo JOIN bar ON foo.id = bar.id) t2 ON t1.a = t2.b WHERE (t1.b OR NOT t1.a) AND t2.c = 12.5
|
||||
SELECT * FROM t1 JOIN t2 ON c1 = c2;
|
||||
|
|
Loading…
Reference in New Issue