Merge pull request #11365 from taosdata/feature/TD-14242
<feat>[query]: add cast function SQL syntax
This commit is contained in:
commit
6a734a74ac
|
@ -382,6 +382,16 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
.sprocessFunc = substrFunction,
|
.sprocessFunc = substrFunction,
|
||||||
.finalizeFunc = NULL
|
.finalizeFunc = NULL
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.name = "cast",
|
||||||
|
.type = FUNCTION_TYPE_CAST,
|
||||||
|
.classification = FUNC_MGT_SCALAR_FUNC,
|
||||||
|
.checkFunc = stubCheckAndGetResultType,
|
||||||
|
.getEnvFunc = NULL,
|
||||||
|
.initFunc = NULL,
|
||||||
|
.sprocessFunc = NULL,
|
||||||
|
.finalizeFunc = NULL
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.name = "_rowts",
|
.name = "_rowts",
|
||||||
.type = FUNCTION_TYPE_ROWTS,
|
.type = FUNCTION_TYPE_ROWTS,
|
||||||
|
@ -588,6 +598,10 @@ int32_t stubCheckAndGetResultType(SFunctionNode* pFunc) {
|
||||||
pFunc->node.resType = (SDataType) { .bytes = paraBytes, .type = paraType };
|
pFunc->node.resType = (SDataType) { .bytes = paraBytes, .type = paraType };
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case FUNCTION_TYPE_CAST: {
|
||||||
|
pFunc->node.resType = (SDataType) { .bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes, .type = TSDB_DATA_TYPE_BIGINT };
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case FUNCTION_TYPE_TBNAME: {
|
case FUNCTION_TYPE_TBNAME: {
|
||||||
// todo
|
// todo
|
||||||
|
|
|
@ -81,6 +81,7 @@ SToken getTokenFromRawExprNode(SAstCreateContext* pCxt, SNode* pNode);
|
||||||
|
|
||||||
SNodeList* createNodeList(SAstCreateContext* pCxt, SNode* pNode);
|
SNodeList* createNodeList(SAstCreateContext* pCxt, SNode* pNode);
|
||||||
SNodeList* addNodeToList(SAstCreateContext* pCxt, SNodeList* pList, SNode* pNode);
|
SNodeList* addNodeToList(SAstCreateContext* pCxt, SNodeList* pList, SNode* pNode);
|
||||||
|
SNodeList* addValueNodeFromTypeToList(SAstCreateContext* pCxt, SDataType dataType, SNodeList* pList);
|
||||||
|
|
||||||
SNode* createColumnNode(SAstCreateContext* pCxt, SToken* pTableAlias, SToken* pColumnName);
|
SNode* createColumnNode(SAstCreateContext* pCxt, SToken* pTableAlias, SToken* pColumnName);
|
||||||
SNode* createValueNode(SAstCreateContext* pCxt, int32_t dataType, const SToken* pLiteral);
|
SNode* createValueNode(SAstCreateContext* pCxt, int32_t dataType, const SToken* pLiteral);
|
||||||
|
|
|
@ -534,6 +534,12 @@ expression(A) ::= pseudo_column(B).
|
||||||
expression(A) ::= column_reference(B). { A = B; }
|
expression(A) ::= column_reference(B). { A = B; }
|
||||||
expression(A) ::= function_name(B) NK_LP expression_list(C) NK_RP(D). { A = createRawExprNodeExt(pCxt, &B, &D, createFunctionNode(pCxt, &B, C)); }
|
expression(A) ::= function_name(B) NK_LP expression_list(C) NK_RP(D). { A = createRawExprNodeExt(pCxt, &B, &D, createFunctionNode(pCxt, &B, C)); }
|
||||||
expression(A) ::= function_name(B) NK_LP NK_STAR(C) NK_RP(D). { A = createRawExprNodeExt(pCxt, &B, &D, createFunctionNode(pCxt, &B, createNodeList(pCxt, createColumnNode(pCxt, NULL, &C)))); }
|
expression(A) ::= function_name(B) NK_LP NK_STAR(C) NK_RP(D). { A = createRawExprNodeExt(pCxt, &B, &D, createFunctionNode(pCxt, &B, createNodeList(pCxt, createColumnNode(pCxt, NULL, &C)))); }
|
||||||
|
//for CAST function CAST(expr AS type_name)
|
||||||
|
expression(A) ::= function_name(B) NK_LP expression(C) AS type_name(D) NK_RP(E). {
|
||||||
|
SNodeList *p = createNodeList(pCxt, releaseRawExprNode(pCxt, C));
|
||||||
|
p = addValueNodeFromTypeToList(pCxt, D, p);
|
||||||
|
A = createRawExprNodeExt(pCxt, &B, &E, createFunctionNode(pCxt, &B, p));
|
||||||
|
}
|
||||||
//expression(A) ::= cast_expression(B). { A = B; }
|
//expression(A) ::= cast_expression(B). { A = B; }
|
||||||
//expression(A) ::= case_expression(B). { A = B; }
|
//expression(A) ::= case_expression(B). { A = B; }
|
||||||
expression(A) ::= subquery(B). { A = B; }
|
expression(A) ::= subquery(B). { A = B; }
|
||||||
|
|
|
@ -251,6 +251,26 @@ SNode* createColumnNode(SAstCreateContext* pCxt, SToken* pTableAlias, SToken* pC
|
||||||
return (SNode*)col;
|
return (SNode*)col;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SNodeList* addValueNodeFromTypeToList(SAstCreateContext* pCxt, SDataType dataType, SNodeList* pList) {
|
||||||
|
char buf[64] = {0};
|
||||||
|
//add value node for type
|
||||||
|
snprintf(buf, sizeof(buf), "%u", dataType.type);
|
||||||
|
SToken token = {.type = TSDB_DATA_TYPE_TINYINT, .n = strlen(buf), .z = buf};
|
||||||
|
SNode* pNode = createValueNode(pCxt, token.type, &token);
|
||||||
|
addNodeToList(pCxt, pList, pNode);
|
||||||
|
|
||||||
|
//add value node for bytes
|
||||||
|
memset(buf, 0, sizeof(buf));
|
||||||
|
snprintf(buf, sizeof(buf), "%u", dataType.bytes);
|
||||||
|
token.type = TSDB_DATA_TYPE_BIGINT;
|
||||||
|
token.n = strlen(buf);
|
||||||
|
token.z = buf;
|
||||||
|
pNode = createValueNode(pCxt, token.type, &token);
|
||||||
|
addNodeToList(pCxt, pList, pNode);
|
||||||
|
|
||||||
|
return pList;
|
||||||
|
}
|
||||||
|
|
||||||
SNode* createValueNode(SAstCreateContext* pCxt, int32_t dataType, const SToken* pLiteral) {
|
SNode* createValueNode(SAstCreateContext* pCxt, int32_t dataType, const SToken* pLiteral) {
|
||||||
SValueNode* val = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE);
|
SValueNode* val = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE);
|
||||||
CHECK_OUT_OF_MEM(val);
|
CHECK_OUT_OF_MEM(val);
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue