TD-13338 SELECT statement translate code
This commit is contained in:
parent
2c395cf02d
commit
659b4d0899
|
@ -113,13 +113,13 @@ typedef enum ELogicConditionType {
|
||||||
} ELogicConditionType;
|
} ELogicConditionType;
|
||||||
|
|
||||||
typedef struct SLogicConditionNode {
|
typedef struct SLogicConditionNode {
|
||||||
ENodeType type; // QUERY_NODE_LOGIC_CONDITION
|
SExprNode node; // QUERY_NODE_LOGIC_CONDITION
|
||||||
ELogicConditionType condType;
|
ELogicConditionType condType;
|
||||||
SNodeList* pParameterList;
|
SNodeList* pParameterList;
|
||||||
} SLogicConditionNode;
|
} SLogicConditionNode;
|
||||||
|
|
||||||
typedef struct SIsNullCondNode {
|
typedef struct SIsNullCondNode {
|
||||||
ENodeType type; // QUERY_NODE_IS_NULL_CONDITION
|
SExprNode node; // QUERY_NODE_IS_NULL_CONDITION
|
||||||
SNode* pExpr;
|
SNode* pExpr;
|
||||||
bool isNull;
|
bool isNull;
|
||||||
} SIsNullCondNode;
|
} SIsNullCondNode;
|
||||||
|
|
|
@ -55,6 +55,7 @@
|
||||||
|
|
||||||
%left OR.
|
%left OR.
|
||||||
%left AND.
|
%left AND.
|
||||||
|
//%right NOT.
|
||||||
%left UNION ALL MINUS EXCEPT INTERSECT.
|
%left UNION ALL MINUS EXCEPT INTERSECT.
|
||||||
//%left BITAND BITOR LSHIFT RSHIFT.
|
//%left BITAND BITOR LSHIFT RSHIFT.
|
||||||
%left NK_PLUS NK_MINUS.
|
%left NK_PLUS NK_MINUS.
|
||||||
|
@ -169,13 +170,41 @@ column_reference(A) ::= table_name(B) NK_DOT column_name(C).
|
||||||
//pseudo_column(A) ::= NK_NOW. { PARSER_TRACE; A = createFunctionNode(pCxt, NULL, NULL); }
|
//pseudo_column(A) ::= NK_NOW. { PARSER_TRACE; A = createFunctionNode(pCxt, NULL, NULL); }
|
||||||
|
|
||||||
/************************************************ predicate ***********************************************************/
|
/************************************************ predicate ***********************************************************/
|
||||||
predicate(A) ::= expression(B) compare_op(C) expression(D). { PARSER_TRACE; A = createOperatorNode(pCxt, C, releaseRawExprNode(pCxt, B), releaseRawExprNode(pCxt, D)); }
|
predicate(A) ::= expression(B) compare_op(C) expression(D). {
|
||||||
|
PARSER_TRACE;
|
||||||
|
SToken s = getTokenFromRawExprNode(pCxt, B);
|
||||||
|
SToken e = getTokenFromRawExprNode(pCxt, D);
|
||||||
|
A = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, C, releaseRawExprNode(pCxt, B), releaseRawExprNode(pCxt, D)));
|
||||||
|
}
|
||||||
//predicate(A) ::= expression(B) compare_op sub_type expression(B).
|
//predicate(A) ::= expression(B) compare_op sub_type expression(B).
|
||||||
predicate(A) ::= expression(B) BETWEEN expression(C) AND expression(D). { PARSER_TRACE; A = createBetweenAnd(pCxt, releaseRawExprNode(pCxt, B), releaseRawExprNode(pCxt, C), releaseRawExprNode(pCxt, D)); }
|
predicate(A) ::= expression(B) BETWEEN expression(C) AND expression(D). {
|
||||||
predicate(A) ::= expression(B) NOT BETWEEN expression(C) AND expression(D). { PARSER_TRACE; A = createNotBetweenAnd(pCxt, releaseRawExprNode(pCxt, C), releaseRawExprNode(pCxt, B), releaseRawExprNode(pCxt, D)); }
|
PARSER_TRACE;
|
||||||
predicate(A) ::= expression(B) IS NULL. { PARSER_TRACE; A = createIsNullCondNode(pCxt, releaseRawExprNode(pCxt, B), true); }
|
SToken s = getTokenFromRawExprNode(pCxt, B);
|
||||||
predicate(A) ::= expression(B) IS NOT NULL. { PARSER_TRACE; A = createIsNullCondNode(pCxt, releaseRawExprNode(pCxt, B), false); }
|
SToken e = getTokenFromRawExprNode(pCxt, D);
|
||||||
predicate(A) ::= expression(B) in_op(C) in_predicate_value(D). { PARSER_TRACE; A = createOperatorNode(pCxt, C, releaseRawExprNode(pCxt, B), D); }
|
A = createRawExprNodeExt(pCxt, &s, &e, createBetweenAnd(pCxt, releaseRawExprNode(pCxt, B), releaseRawExprNode(pCxt, C), releaseRawExprNode(pCxt, D)));
|
||||||
|
}
|
||||||
|
predicate(A) ::= expression(B) NOT BETWEEN expression(C) AND expression(D). {
|
||||||
|
PARSER_TRACE;
|
||||||
|
SToken s = getTokenFromRawExprNode(pCxt, B);
|
||||||
|
SToken e = getTokenFromRawExprNode(pCxt, D);
|
||||||
|
A = createRawExprNodeExt(pCxt, &s, &e, createNotBetweenAnd(pCxt, releaseRawExprNode(pCxt, C), releaseRawExprNode(pCxt, B), releaseRawExprNode(pCxt, D)));
|
||||||
|
}
|
||||||
|
predicate(A) ::= expression(B) IS NULL(C). {
|
||||||
|
PARSER_TRACE;
|
||||||
|
SToken s = getTokenFromRawExprNode(pCxt, B);
|
||||||
|
A = createRawExprNodeExt(pCxt, &s, &C, createIsNullCondNode(pCxt, releaseRawExprNode(pCxt, B), true));
|
||||||
|
}
|
||||||
|
predicate(A) ::= expression(B) IS NOT NULL(C). {
|
||||||
|
PARSER_TRACE;
|
||||||
|
SToken s = getTokenFromRawExprNode(pCxt, B);
|
||||||
|
A = createRawExprNodeExt(pCxt, &s, &C, createIsNullCondNode(pCxt, releaseRawExprNode(pCxt, B), false));
|
||||||
|
}
|
||||||
|
predicate(A) ::= expression(B) in_op(C) in_predicate_value(D). {
|
||||||
|
PARSER_TRACE;
|
||||||
|
SToken s = getTokenFromRawExprNode(pCxt, B);
|
||||||
|
SToken e = getTokenFromRawExprNode(pCxt, D);
|
||||||
|
A = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, C, releaseRawExprNode(pCxt, B), releaseRawExprNode(pCxt, D)));
|
||||||
|
}
|
||||||
|
|
||||||
%type compare_op { EOperatorType }
|
%type compare_op { EOperatorType }
|
||||||
%destructor compare_op { PARSER_DESTRUCTOR_TRACE; }
|
%destructor compare_op { PARSER_DESTRUCTOR_TRACE; }
|
||||||
|
@ -195,18 +224,36 @@ compare_op(A) ::= NMATCH.
|
||||||
in_op(A) ::= IN. { PARSER_TRACE; A = OP_TYPE_IN; }
|
in_op(A) ::= IN. { PARSER_TRACE; A = OP_TYPE_IN; }
|
||||||
in_op(A) ::= NOT IN. { PARSER_TRACE; A = OP_TYPE_NOT_IN; }
|
in_op(A) ::= NOT IN. { PARSER_TRACE; A = OP_TYPE_NOT_IN; }
|
||||||
|
|
||||||
in_predicate_value(A) ::= NK_LP expression_list(B) NK_RP. { PARSER_TRACE; A = createNodeListNode(pCxt, B); }
|
in_predicate_value(A) ::= NK_LP(C) expression_list(B) NK_RP(D). { PARSER_TRACE; A = createRawExprNodeExt(pCxt, &C, &D, createNodeListNode(pCxt, B)); }
|
||||||
|
|
||||||
/************************************************ boolean_value_expression ********************************************/
|
/************************************************ boolean_value_expression ********************************************/
|
||||||
boolean_value_expression(A) ::= boolean_primary(B). { PARSER_TRACE; A = B; }
|
boolean_value_expression(A) ::= boolean_primary(B). { PARSER_TRACE; A = B; }
|
||||||
boolean_value_expression(A) ::= NOT boolean_primary(B). { PARSER_TRACE; A = createLogicConditionNode(pCxt, LOGIC_COND_TYPE_NOT, B, NULL); }
|
boolean_value_expression(A) ::= NOT(C) boolean_primary(B). {
|
||||||
|
PARSER_TRACE;
|
||||||
|
SToken e = getTokenFromRawExprNode(pCxt, B);
|
||||||
|
A = createRawExprNodeExt(pCxt, &C, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_NOT, releaseRawExprNode(pCxt, B), NULL));
|
||||||
|
}
|
||||||
boolean_value_expression(A) ::=
|
boolean_value_expression(A) ::=
|
||||||
boolean_value_expression(B) OR boolean_value_expression(C). { PARSER_TRACE; A = createLogicConditionNode(pCxt, LOGIC_COND_TYPE_OR, B, C); }
|
boolean_value_expression(B) OR boolean_value_expression(C). {
|
||||||
|
PARSER_TRACE;
|
||||||
|
SToken s = getTokenFromRawExprNode(pCxt, B);
|
||||||
|
SToken e = getTokenFromRawExprNode(pCxt, C);
|
||||||
|
A = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_OR, releaseRawExprNode(pCxt, B), releaseRawExprNode(pCxt, C)));
|
||||||
|
}
|
||||||
boolean_value_expression(A) ::=
|
boolean_value_expression(A) ::=
|
||||||
boolean_value_expression(B) AND boolean_value_expression(C). { PARSER_TRACE; A = createLogicConditionNode(pCxt, LOGIC_COND_TYPE_AND, B, C); }
|
boolean_value_expression(B) AND boolean_value_expression(C). {
|
||||||
|
PARSER_TRACE;
|
||||||
|
SToken s = getTokenFromRawExprNode(pCxt, B);
|
||||||
|
SToken e = getTokenFromRawExprNode(pCxt, C);
|
||||||
|
A = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_AND, releaseRawExprNode(pCxt, B), releaseRawExprNode(pCxt, C)));
|
||||||
|
}
|
||||||
|
|
||||||
boolean_primary(A) ::= predicate(B). { PARSER_TRACE; A = B; }
|
boolean_primary(A) ::= predicate(B). { PARSER_TRACE; A = B; }
|
||||||
boolean_primary(A) ::= NK_LP boolean_value_expression(B) NK_RP. { PARSER_TRACE; A = B; }
|
boolean_primary(A) ::= NK_LP(C) boolean_value_expression(B) NK_RP(D). { PARSER_TRACE; A = createRawExprNodeExt(pCxt, &C, &D, releaseRawExprNode(pCxt, B)); }
|
||||||
|
|
||||||
|
/************************************************ common_expression ********************************************/
|
||||||
|
common_expression(A) ::= expression(B). { A = B; }
|
||||||
|
common_expression(A) ::= boolean_value_expression(B). { A = B; }
|
||||||
|
|
||||||
/************************************************ from_clause *********************************************************/
|
/************************************************ from_clause *********************************************************/
|
||||||
from_clause(A) ::= FROM table_reference_list(B). { PARSER_TRACE; A = B; }
|
from_clause(A) ::= FROM table_reference_list(B). { PARSER_TRACE; A = B; }
|
||||||
|
@ -271,13 +318,13 @@ select_list(A) ::= select_sublist(B).
|
||||||
select_sublist(A) ::= select_item(B). { PARSER_TRACE; A = createNodeList(pCxt, B); }
|
select_sublist(A) ::= select_item(B). { PARSER_TRACE; A = createNodeList(pCxt, B); }
|
||||||
select_sublist(A) ::= select_sublist(B) NK_COMMA select_item(C). { PARSER_TRACE; A = addNodeToList(pCxt, B, C); }
|
select_sublist(A) ::= select_sublist(B) NK_COMMA select_item(C). { PARSER_TRACE; A = addNodeToList(pCxt, B, C); }
|
||||||
|
|
||||||
select_item(A) ::= expression(B). {
|
select_item(A) ::= common_expression(B). {
|
||||||
PARSER_TRACE;
|
PARSER_TRACE;
|
||||||
SToken t = getTokenFromRawExprNode(pCxt, B);
|
SToken t = getTokenFromRawExprNode(pCxt, B);
|
||||||
A = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, B), &t);
|
A = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, B), &t);
|
||||||
}
|
}
|
||||||
select_item(A) ::= expression(B) column_alias(C). { PARSER_TRACE; A = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, B), &C); }
|
select_item(A) ::= common_expression(B) column_alias(C). { PARSER_TRACE; A = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, B), &C); }
|
||||||
select_item(A) ::= expression(B) AS column_alias(C). { PARSER_TRACE; A = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, B), &C); }
|
select_item(A) ::= common_expression(B) AS column_alias(C). { PARSER_TRACE; A = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, B), &C); }
|
||||||
select_item(A) ::= table_name(B) NK_DOT NK_STAR(C). { PARSER_TRACE; A = createColumnNode(pCxt, &B, &C); }
|
select_item(A) ::= table_name(B) NK_DOT NK_STAR(C). { PARSER_TRACE; A = createColumnNode(pCxt, &B, &C); }
|
||||||
|
|
||||||
where_clause_opt(A) ::= . { PARSER_TRACE; A = NULL; }
|
where_clause_opt(A) ::= . { PARSER_TRACE; A = NULL; }
|
||||||
|
@ -364,7 +411,7 @@ limit_clause_opt(A) ::= LIMIT NK_INTEGER(C) NK_COMMA NK_INTEGER(B).
|
||||||
subquery(A) ::= NK_LP(B) query_expression(C) NK_RP(D). { PARSER_TRACE; A = createRawExprNodeExt(pCxt, &B, &D, C); }
|
subquery(A) ::= NK_LP(B) query_expression(C) NK_RP(D). { PARSER_TRACE; A = createRawExprNodeExt(pCxt, &B, &D, C); }
|
||||||
|
|
||||||
/************************************************ search_condition ****************************************************/
|
/************************************************ search_condition ****************************************************/
|
||||||
search_condition(A) ::= boolean_value_expression(B). { PARSER_TRACE; A = B; }
|
search_condition(A) ::= common_expression(B). { PARSER_TRACE; A = releaseRawExprNode(pCxt, B); }
|
||||||
|
|
||||||
/************************************************ sort_specification_list *********************************************/
|
/************************************************ sort_specification_list *********************************************/
|
||||||
%type sort_specification_list { SNodeList* }
|
%type sort_specification_list { SNodeList* }
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -628,6 +628,12 @@ static EDealRes translateExprSubquery(STranslateContext* pCxt, SNode* pNode) {
|
||||||
return (TSDB_CODE_SUCCESS == translateSubquery(pCxt, pNode) ? DEAL_RES_CONTINUE : DEAL_RES_ERROR);
|
return (TSDB_CODE_SUCCESS == translateSubquery(pCxt, pNode) ? DEAL_RES_CONTINUE : DEAL_RES_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static EDealRes translateLogicCond(STranslateContext* pCxt, SLogicConditionNode* pCond) {
|
||||||
|
pCond->node.resType.type = TSDB_DATA_TYPE_BOOL;
|
||||||
|
pCond->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes;
|
||||||
|
return DEAL_RES_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
static EDealRes doTranslateExpr(SNode* pNode, void* pContext) {
|
static EDealRes doTranslateExpr(SNode* pNode, void* pContext) {
|
||||||
STranslateContext* pCxt = (STranslateContext*)pContext;
|
STranslateContext* pCxt = (STranslateContext*)pContext;
|
||||||
switch (nodeType(pNode)) {
|
switch (nodeType(pNode)) {
|
||||||
|
@ -639,6 +645,8 @@ static EDealRes doTranslateExpr(SNode* pNode, void* pContext) {
|
||||||
return translateOperator(pCxt, (SOperatorNode*)pNode);
|
return translateOperator(pCxt, (SOperatorNode*)pNode);
|
||||||
case QUERY_NODE_FUNCTION:
|
case QUERY_NODE_FUNCTION:
|
||||||
return translateFunction(pCxt, (SFunctionNode*)pNode);
|
return translateFunction(pCxt, (SFunctionNode*)pNode);
|
||||||
|
case QUERY_NODE_LOGIC_CONDITION:
|
||||||
|
return translateLogicCond(pCxt, (SLogicConditionNode*)pNode);
|
||||||
case QUERY_NODE_TEMP_TABLE:
|
case QUERY_NODE_TEMP_TABLE:
|
||||||
return translateExprSubquery(pCxt, ((STempTableNode*)pNode)->pSubquery);
|
return translateExprSubquery(pCxt, ((STempTableNode*)pNode)->pSubquery);
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -76,7 +76,8 @@ private:
|
||||||
case QUERY_NODE_COLUMN:
|
case QUERY_NODE_COLUMN:
|
||||||
case QUERY_NODE_VALUE:
|
case QUERY_NODE_VALUE:
|
||||||
case QUERY_NODE_OPERATOR:
|
case QUERY_NODE_OPERATOR:
|
||||||
case QUERY_NODE_FUNCTION: {
|
case QUERY_NODE_FUNCTION:
|
||||||
|
case QUERY_NODE_LOGIC_CONDITION: {
|
||||||
SExprNode* pExpr = (SExprNode*)node;
|
SExprNode* pExpr = (SExprNode*)node;
|
||||||
str.append(" [" + dataTypeToStr(pExpr->resType) + "]");
|
str.append(" [" + dataTypeToStr(pExpr->resType) + "]");
|
||||||
if (isProject) {
|
if (isProject) {
|
||||||
|
@ -215,6 +216,34 @@ private:
|
||||||
str.append((NULL_ORDER_FIRST == pOrderBy->nullOrder ? " NULLS FIRST" : " NULLS LAST"));
|
str.append((NULL_ORDER_FIRST == pOrderBy->nullOrder ? " NULLS FIRST" : " NULLS LAST"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string logicConditionTypeToStr(ELogicConditionType type) {
|
||||||
|
switch (type) {
|
||||||
|
case LOGIC_COND_TYPE_AND:
|
||||||
|
return "AND";
|
||||||
|
case LOGIC_COND_TYPE_OR:
|
||||||
|
return "OR";
|
||||||
|
case LOGIC_COND_TYPE_NOT:
|
||||||
|
return "NOT";
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return "Unknown logic cond type";
|
||||||
|
}
|
||||||
|
|
||||||
|
void logicCondToStr(SLogicConditionNode* pCond, string& str) {
|
||||||
|
SNode* node = nullptr;
|
||||||
|
bool first = true;
|
||||||
|
FOREACH(node, pCond->pParameterList) {
|
||||||
|
if (first && LOGIC_COND_TYPE_NOT == pCond->condType) {
|
||||||
|
str.append(logicConditionTypeToStr(pCond->condType) + " ");
|
||||||
|
} else if (!first && LOGIC_COND_TYPE_NOT != pCond->condType) {
|
||||||
|
str.append(" " + logicConditionTypeToStr(pCond->condType) + " ");
|
||||||
|
}
|
||||||
|
first = false;
|
||||||
|
nodeToStr(node, str, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void nodeToStr(const SNode* node, string& str, bool isProject) {
|
void nodeToStr(const SNode* node, string& str, bool isProject) {
|
||||||
if (nullptr == node) {
|
if (nullptr == node) {
|
||||||
return;
|
return;
|
||||||
|
@ -237,6 +266,10 @@ private:
|
||||||
functionToStr((SFunctionNode*)node, str);
|
functionToStr((SFunctionNode*)node, str);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case QUERY_NODE_LOGIC_CONDITION: {
|
||||||
|
logicCondToStr((SLogicConditionNode*)node, str);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case QUERY_NODE_GROUPING_SET: {
|
case QUERY_NODE_GROUPING_SET: {
|
||||||
groupingSetToStr((SGroupingSetNode*)node, str);
|
groupingSetToStr((SGroupingSetNode*)node, str);
|
||||||
break;
|
break;
|
||||||
|
@ -511,6 +544,12 @@ TEST_F(NewParserTest, selectExpression) {
|
||||||
|
|
||||||
bind("SELECT ts + 10s, c1 + 10, concat(c2, 'abc') FROM t1");
|
bind("SELECT ts + 10s, c1 + 10, concat(c2, 'abc') FROM t1");
|
||||||
ASSERT_TRUE(run());
|
ASSERT_TRUE(run());
|
||||||
|
|
||||||
|
bind("SELECT ts > 0, c1 < 20 AND c2 = 'qaz' FROM t1");
|
||||||
|
ASSERT_TRUE(run());
|
||||||
|
|
||||||
|
bind("SELECT ts > 0, c1 BETWEEN 10 AND 20 AND c2 = 'qaz' FROM t1");
|
||||||
|
ASSERT_TRUE(run());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(NewParserTest, selectClause) {
|
TEST_F(NewParserTest, selectClause) {
|
||||||
|
|
Loading…
Reference in New Issue