diff --git a/source/libs/nodes/src/nodesCodeFuncs.c b/source/libs/nodes/src/nodesCodeFuncs.c index 5d007db29bcb8bcc07514e87feea5e3557aca302..1c72a90c132a06c7bd1d292327892c6f1290face 100644 --- a/source/libs/nodes/src/nodesCodeFuncs.c +++ b/source/libs/nodes/src/nodesCodeFuncs.c @@ -1040,7 +1040,7 @@ static int32_t datumToJson(const void* pObj, SJson* pJson) { case TSDB_DATA_TYPE_NCHAR: case TSDB_DATA_TYPE_VARCHAR: case TSDB_DATA_TYPE_VARBINARY: - code = tjsonAddStringToObject(pJson, jkValueDatum, pNode->datum.p); + code = tjsonAddStringToObject(pJson, jkValueDatum, varDataVal(pNode->datum.p)); break; case TSDB_DATA_TYPE_JSON: case TSDB_DATA_TYPE_DECIMAL: @@ -1103,9 +1103,16 @@ static int32_t jsonToDatum(const SJson* pJson, void* pObj) { case TSDB_DATA_TYPE_BINARY: case TSDB_DATA_TYPE_NCHAR: case TSDB_DATA_TYPE_VARCHAR: - case TSDB_DATA_TYPE_VARBINARY: - code = tjsonDupStringValue(pJson, jkValueDatum, &pNode->datum.p); + case TSDB_DATA_TYPE_VARBINARY: { + pNode->datum.p = calloc(1, pNode->node.resType.bytes); + if (NULL == pNode->datum.p) { + code = TSDB_CODE_OUT_OF_MEMORY; + break; + } + varDataSetLen(pNode->datum.p, pNode->node.resType.bytes); + code = tjsonGetStringValue(pJson, jkValueDatum, varDataVal(pNode->datum.p)); break; + } case TSDB_DATA_TYPE_JSON: case TSDB_DATA_TYPE_DECIMAL: case TSDB_DATA_TYPE_BLOB: diff --git a/source/libs/parser/inc/parAst.h b/source/libs/parser/inc/parAst.h index 5470c672357c79fac82a0787b07c3b2fff11249d..7ecfe626cec879d7d0db3babfbb1fa004e74e010 100644 --- a/source/libs/parser/inc/parAst.h +++ b/source/libs/parser/inc/parAst.h @@ -80,6 +80,7 @@ SNodeList* addNodeToList(SAstCreateContext* pCxt, SNodeList* pList, SNode* pNode SNode* createColumnNode(SAstCreateContext* pCxt, const SToken* pTableAlias, const SToken* pColumnName); SNode* createValueNode(SAstCreateContext* pCxt, int32_t dataType, const SToken* pLiteral); SNode* createDurationValueNode(SAstCreateContext* pCxt, const SToken* pLiteral); +SNode* createDefaultDatabaseCondValue(SAstCreateContext* pCxt); SNode* setProjectionAlias(SAstCreateContext* pCxt, SNode* pNode, const SToken* pAlias); SNode* createLogicConditionNode(SAstCreateContext* pCxt, ELogicConditionType type, SNode* pParam1, SNode* pParam2); SNode* createOperatorNode(SAstCreateContext* pCxt, EOperatorType type, SNode* pLeft, SNode* pRight); diff --git a/source/libs/parser/inc/sql.y b/source/libs/parser/inc/sql.y index 2074c185332dc4b6e07834625141f69ec1020f69..c49ffd6d90894597c359dd38023f8700adfda596 100644 --- a/source/libs/parser/inc/sql.y +++ b/source/libs/parser/inc/sql.y @@ -203,7 +203,7 @@ cmd ::= SHOW FUNCTIONS. cmd ::= SHOW INDEXES FROM table_name_cond(A) from_db_opt(B). { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_INDEXES_STMT, A, B); } cmd ::= SHOW STREAMS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_STREAMS_STMT, NULL, NULL); } -db_name_cond_opt(A) ::= . { A = NULL; } +db_name_cond_opt(A) ::= . { A = createDefaultDatabaseCondValue(pCxt); } db_name_cond_opt(A) ::= db_name(B) NK_DOT. { A = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &B); } like_pattern_opt(A) ::= . { A = NULL; } @@ -211,7 +211,7 @@ like_pattern_opt(A) ::= LIKE NK_STRING(B). table_name_cond(A) ::= table_name(B). { A = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &B); } -from_db_opt(A) ::= . { A = NULL; } +from_db_opt(A) ::= . { A = createDefaultDatabaseCondValue(pCxt); } from_db_opt(A) ::= FROM db_name(B). { A = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &B); } /************************************************ select **************************************************************/ diff --git a/source/libs/parser/src/parAstCreater.c b/source/libs/parser/src/parAstCreater.c index f8086e8a6390ed7bd23fced817e794f68b0cf65f..4ba989ca3e9e15a51a1189da697277b0568d76a3 100644 --- a/source/libs/parser/src/parAstCreater.c +++ b/source/libs/parser/src/parAstCreater.c @@ -489,9 +489,12 @@ SNode* createValueNode(SAstCreateContext* pCxt, int32_t dataType, const SToken* SValueNode* val = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); CHECK_OUT_OF_MEM(val); val->literal = strndup(pLiteral->z, pLiteral->n); + if (IS_VAR_DATA_TYPE(dataType) || TSDB_DATA_TYPE_TIMESTAMP == dataType) { + trimString(pLiteral->z, pLiteral->n, val->literal, pLiteral->n); + } CHECK_OUT_OF_MEM(val->literal); val->node.resType.type = dataType; - val->node.resType.bytes = tDataTypes[dataType].bytes; + val->node.resType.bytes = IS_VAR_DATA_TYPE(dataType) ? strlen(val->literal) : tDataTypes[dataType].bytes; if (TSDB_DATA_TYPE_TIMESTAMP == dataType) { val->node.resType.precision = TSDB_TIME_PRECISION_MILLI; } @@ -513,6 +516,19 @@ SNode* createDurationValueNode(SAstCreateContext* pCxt, const SToken* pLiteral) return (SNode*)val; } +SNode* createDefaultDatabaseCondValue(SAstCreateContext* pCxt) { + SValueNode* val = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); + CHECK_OUT_OF_MEM(val); + val->literal = strdup(pCxt->pQueryCxt->db); + CHECK_OUT_OF_MEM(val->literal); + val->isDuration = false; + val->translate = false; + val->node.resType.type = TSDB_DATA_TYPE_BINARY; + val->node.resType.bytes = strlen(val->literal); + val->node.resType.precision = TSDB_TIME_PRECISION_MILLI; + return (SNode*)val; +} + SNode* createLogicConditionNode(SAstCreateContext* pCxt, ELogicConditionType type, SNode* pParam1, SNode* pParam2) { SLogicConditionNode* cond = (SLogicConditionNode*)nodesMakeNode(QUERY_NODE_LOGIC_CONDITION); CHECK_OUT_OF_MEM(cond); diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 8eb79fe8aaac243a5408046aff33cd8a2abf21bf..9efc88d11b4273c34708cd3b3caf6c949e76053b 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -307,15 +307,6 @@ static EDealRes translateColumn(STranslateContext* pCxt, SColumnNode* pCol) { return found ? DEAL_RES_CONTINUE : translateColumnWithoutPrefix(pCxt, pCol); } -static int32_t trimStringWithVarFormat(const char* src, int32_t len, bool format, char* dst) { - char* dstVal = dst; - if (format) { - varDataSetLen(dst, len); - dstVal = varDataVal(dst); - } - return trimString(src, len, dstVal, len); -} - static EDealRes translateValue(STranslateContext* pCxt, SValueNode* pVal) { if (pVal->isDuration) { char unit = 0; @@ -355,26 +346,18 @@ static EDealRes translateValue(STranslateContext* pCxt, SValueNode* pVal) { case TSDB_DATA_TYPE_NCHAR: case TSDB_DATA_TYPE_VARCHAR: case TSDB_DATA_TYPE_VARBINARY: { - int32_t n = strlen(pVal->literal); - pVal->datum.p = calloc(1, n + VARSTR_HEADER_SIZE); + pVal->datum.p = calloc(1, pVal->node.resType.bytes + VARSTR_HEADER_SIZE); if (NULL == pVal->datum.p) { return generateDealNodeErrMsg(pCxt, TSDB_CODE_OUT_OF_MEMORY); } - trimStringWithVarFormat(pVal->literal, n, true, pVal->datum.p); + varDataSetLen(pVal->datum.p, pVal->node.resType.bytes); + strcpy(varDataVal(pVal->datum.p), pVal->literal); break; } case TSDB_DATA_TYPE_TIMESTAMP: { - int32_t n = strlen(pVal->literal); - char* tmp = calloc(1, n); - if (NULL == tmp) { - return generateDealNodeErrMsg(pCxt, TSDB_CODE_OUT_OF_MEMORY); - } - int32_t len = trimStringWithVarFormat(pVal->literal, n, false, tmp); - if (taosParseTime(tmp, &pVal->datum.i, len, pVal->node.resType.precision, tsDaylight) != TSDB_CODE_SUCCESS) { - tfree(tmp); + if (taosParseTime(pVal->literal, &pVal->datum.i, pVal->node.resType.bytes, pVal->node.resType.precision, tsDaylight) != TSDB_CODE_SUCCESS) { return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_WRONG_VALUE_TYPE, pVal->literal); } - tfree(tmp); break; } case TSDB_DATA_TYPE_JSON: diff --git a/source/libs/parser/src/sql.c b/source/libs/parser/src/sql.c index 9312537c4901c8f7467a7d1cb3d3003180b07dde..806e7efc779c27fb1d42173cbd03be30800941ae 100644 --- a/source/libs/parser/src/sql.c +++ b/source/libs/parser/src/sql.c @@ -2284,8 +2284,14 @@ static YYACTIONTYPE yy_reduce( { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_STREAMS_STMT, NULL, NULL); } break; case 101: /* db_name_cond_opt ::= */ - case 103: /* like_pattern_opt ::= */ yytestcase(yyruleno==103); case 106: /* from_db_opt ::= */ yytestcase(yyruleno==106); +{ yymsp[1].minor.yy68 = createDefaultDatabaseCondValue(pCxt); } + break; + case 102: /* db_name_cond_opt ::= db_name NK_DOT */ +{ yylhsminor.yy68 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy5); } + yymsp[-1].minor.yy68 = yylhsminor.yy68; + break; + case 103: /* like_pattern_opt ::= */ case 198: /* where_clause_opt ::= */ yytestcase(yyruleno==198); case 202: /* twindow_clause_opt ::= */ yytestcase(yyruleno==202); case 207: /* sliding_opt ::= */ yytestcase(yyruleno==207); @@ -2295,10 +2301,6 @@ static YYACTIONTYPE yy_reduce( case 233: /* limit_clause_opt ::= */ yytestcase(yyruleno==233); { yymsp[1].minor.yy68 = NULL; } break; - case 102: /* db_name_cond_opt ::= db_name NK_DOT */ -{ yylhsminor.yy68 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy5); } - yymsp[-1].minor.yy68 = yylhsminor.yy68; - break; case 104: /* like_pattern_opt ::= LIKE NK_STRING */ { yymsp[-1].minor.yy68 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); } break; diff --git a/source/libs/parser/test/parserAstTest.cpp b/source/libs/parser/test/parserAstTest.cpp index 732e8ec0a7e773d6ca8e7e362f84df88a6faa724..20dcc3251d21a79b3df0f474a45eaa205157d4d0 100644 --- a/source/libs/parser/test/parserAstTest.cpp +++ b/source/libs/parser/test/parserAstTest.cpp @@ -409,11 +409,11 @@ TEST_F(ParserTest, createTable) { TEST_F(ParserTest, showTables) { setDatabase("root", "test"); - // bind("show tables"); - // ASSERT_TRUE(run()); + bind("show tables"); + ASSERT_TRUE(run()); - // bind("show test.tables"); - // ASSERT_TRUE(run()); + bind("show test.tables"); + ASSERT_TRUE(run()); bind("show tables like 'c%'"); ASSERT_TRUE(run());