TD-14043 show statement bugfix
This commit is contained in:
parent
ee7f8bd84c
commit
0f6573d537
|
@ -1040,7 +1040,7 @@ static int32_t datumToJson(const void* pObj, SJson* pJson) {
|
||||||
case TSDB_DATA_TYPE_NCHAR:
|
case TSDB_DATA_TYPE_NCHAR:
|
||||||
case TSDB_DATA_TYPE_VARCHAR:
|
case TSDB_DATA_TYPE_VARCHAR:
|
||||||
case TSDB_DATA_TYPE_VARBINARY:
|
case TSDB_DATA_TYPE_VARBINARY:
|
||||||
code = tjsonAddStringToObject(pJson, jkValueDatum, pNode->datum.p);
|
code = tjsonAddStringToObject(pJson, jkValueDatum, varDataVal(pNode->datum.p));
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_JSON:
|
case TSDB_DATA_TYPE_JSON:
|
||||||
case TSDB_DATA_TYPE_DECIMAL:
|
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_BINARY:
|
||||||
case TSDB_DATA_TYPE_NCHAR:
|
case TSDB_DATA_TYPE_NCHAR:
|
||||||
case TSDB_DATA_TYPE_VARCHAR:
|
case TSDB_DATA_TYPE_VARCHAR:
|
||||||
case TSDB_DATA_TYPE_VARBINARY:
|
case TSDB_DATA_TYPE_VARBINARY: {
|
||||||
code = tjsonDupStringValue(pJson, jkValueDatum, &pNode->datum.p);
|
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;
|
break;
|
||||||
|
}
|
||||||
case TSDB_DATA_TYPE_JSON:
|
case TSDB_DATA_TYPE_JSON:
|
||||||
case TSDB_DATA_TYPE_DECIMAL:
|
case TSDB_DATA_TYPE_DECIMAL:
|
||||||
case TSDB_DATA_TYPE_BLOB:
|
case TSDB_DATA_TYPE_BLOB:
|
||||||
|
|
|
@ -80,6 +80,7 @@ SNodeList* addNodeToList(SAstCreateContext* pCxt, SNodeList* pList, SNode* pNode
|
||||||
SNode* createColumnNode(SAstCreateContext* pCxt, const SToken* pTableAlias, const SToken* pColumnName);
|
SNode* createColumnNode(SAstCreateContext* pCxt, const SToken* pTableAlias, const SToken* pColumnName);
|
||||||
SNode* createValueNode(SAstCreateContext* pCxt, int32_t dataType, const SToken* pLiteral);
|
SNode* createValueNode(SAstCreateContext* pCxt, int32_t dataType, const SToken* pLiteral);
|
||||||
SNode* createDurationValueNode(SAstCreateContext* pCxt, const SToken* pLiteral);
|
SNode* createDurationValueNode(SAstCreateContext* pCxt, const SToken* pLiteral);
|
||||||
|
SNode* createDefaultDatabaseCondValue(SAstCreateContext* pCxt);
|
||||||
SNode* setProjectionAlias(SAstCreateContext* pCxt, SNode* pNode, const SToken* pAlias);
|
SNode* setProjectionAlias(SAstCreateContext* pCxt, SNode* pNode, const SToken* pAlias);
|
||||||
SNode* createLogicConditionNode(SAstCreateContext* pCxt, ELogicConditionType type, SNode* pParam1, SNode* pParam2);
|
SNode* createLogicConditionNode(SAstCreateContext* pCxt, ELogicConditionType type, SNode* pParam1, SNode* pParam2);
|
||||||
SNode* createOperatorNode(SAstCreateContext* pCxt, EOperatorType type, SNode* pLeft, SNode* pRight);
|
SNode* createOperatorNode(SAstCreateContext* pCxt, EOperatorType type, SNode* pLeft, SNode* pRight);
|
||||||
|
|
|
@ -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 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); }
|
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); }
|
db_name_cond_opt(A) ::= db_name(B) NK_DOT. { A = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &B); }
|
||||||
|
|
||||||
like_pattern_opt(A) ::= . { A = NULL; }
|
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); }
|
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); }
|
from_db_opt(A) ::= FROM db_name(B). { A = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &B); }
|
||||||
|
|
||||||
/************************************************ select **************************************************************/
|
/************************************************ select **************************************************************/
|
||||||
|
|
|
@ -489,9 +489,12 @@ SNode* createValueNode(SAstCreateContext* pCxt, int32_t dataType, const SToken*
|
||||||
SValueNode* val = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE);
|
SValueNode* val = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE);
|
||||||
CHECK_OUT_OF_MEM(val);
|
CHECK_OUT_OF_MEM(val);
|
||||||
val->literal = strndup(pLiteral->z, pLiteral->n);
|
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);
|
CHECK_OUT_OF_MEM(val->literal);
|
||||||
val->node.resType.type = dataType;
|
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) {
|
if (TSDB_DATA_TYPE_TIMESTAMP == dataType) {
|
||||||
val->node.resType.precision = TSDB_TIME_PRECISION_MILLI;
|
val->node.resType.precision = TSDB_TIME_PRECISION_MILLI;
|
||||||
}
|
}
|
||||||
|
@ -513,6 +516,19 @@ SNode* createDurationValueNode(SAstCreateContext* pCxt, const SToken* pLiteral)
|
||||||
return (SNode*)val;
|
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) {
|
SNode* createLogicConditionNode(SAstCreateContext* pCxt, ELogicConditionType type, SNode* pParam1, SNode* pParam2) {
|
||||||
SLogicConditionNode* cond = (SLogicConditionNode*)nodesMakeNode(QUERY_NODE_LOGIC_CONDITION);
|
SLogicConditionNode* cond = (SLogicConditionNode*)nodesMakeNode(QUERY_NODE_LOGIC_CONDITION);
|
||||||
CHECK_OUT_OF_MEM(cond);
|
CHECK_OUT_OF_MEM(cond);
|
||||||
|
|
|
@ -307,15 +307,6 @@ static EDealRes translateColumn(STranslateContext* pCxt, SColumnNode* pCol) {
|
||||||
return found ? DEAL_RES_CONTINUE : translateColumnWithoutPrefix(pCxt, 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) {
|
static EDealRes translateValue(STranslateContext* pCxt, SValueNode* pVal) {
|
||||||
if (pVal->isDuration) {
|
if (pVal->isDuration) {
|
||||||
char unit = 0;
|
char unit = 0;
|
||||||
|
@ -355,26 +346,18 @@ static EDealRes translateValue(STranslateContext* pCxt, SValueNode* pVal) {
|
||||||
case TSDB_DATA_TYPE_NCHAR:
|
case TSDB_DATA_TYPE_NCHAR:
|
||||||
case TSDB_DATA_TYPE_VARCHAR:
|
case TSDB_DATA_TYPE_VARCHAR:
|
||||||
case TSDB_DATA_TYPE_VARBINARY: {
|
case TSDB_DATA_TYPE_VARBINARY: {
|
||||||
int32_t n = strlen(pVal->literal);
|
pVal->datum.p = calloc(1, pVal->node.resType.bytes + VARSTR_HEADER_SIZE);
|
||||||
pVal->datum.p = calloc(1, n + VARSTR_HEADER_SIZE);
|
|
||||||
if (NULL == pVal->datum.p) {
|
if (NULL == pVal->datum.p) {
|
||||||
return generateDealNodeErrMsg(pCxt, TSDB_CODE_OUT_OF_MEMORY);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP: {
|
case TSDB_DATA_TYPE_TIMESTAMP: {
|
||||||
int32_t n = strlen(pVal->literal);
|
if (taosParseTime(pVal->literal, &pVal->datum.i, pVal->node.resType.bytes, pVal->node.resType.precision, tsDaylight) != TSDB_CODE_SUCCESS) {
|
||||||
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);
|
|
||||||
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_WRONG_VALUE_TYPE, pVal->literal);
|
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_WRONG_VALUE_TYPE, pVal->literal);
|
||||||
}
|
}
|
||||||
tfree(tmp);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_JSON:
|
case TSDB_DATA_TYPE_JSON:
|
||||||
|
|
|
@ -2284,8 +2284,14 @@ static YYACTIONTYPE yy_reduce(
|
||||||
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_STREAMS_STMT, NULL, NULL); }
|
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_STREAMS_STMT, NULL, NULL); }
|
||||||
break;
|
break;
|
||||||
case 101: /* db_name_cond_opt ::= */
|
case 101: /* db_name_cond_opt ::= */
|
||||||
case 103: /* like_pattern_opt ::= */ yytestcase(yyruleno==103);
|
|
||||||
case 106: /* from_db_opt ::= */ yytestcase(yyruleno==106);
|
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 198: /* where_clause_opt ::= */ yytestcase(yyruleno==198);
|
||||||
case 202: /* twindow_clause_opt ::= */ yytestcase(yyruleno==202);
|
case 202: /* twindow_clause_opt ::= */ yytestcase(yyruleno==202);
|
||||||
case 207: /* sliding_opt ::= */ yytestcase(yyruleno==207);
|
case 207: /* sliding_opt ::= */ yytestcase(yyruleno==207);
|
||||||
|
@ -2295,10 +2301,6 @@ static YYACTIONTYPE yy_reduce(
|
||||||
case 233: /* limit_clause_opt ::= */ yytestcase(yyruleno==233);
|
case 233: /* limit_clause_opt ::= */ yytestcase(yyruleno==233);
|
||||||
{ yymsp[1].minor.yy68 = NULL; }
|
{ yymsp[1].minor.yy68 = NULL; }
|
||||||
break;
|
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 */
|
case 104: /* like_pattern_opt ::= LIKE NK_STRING */
|
||||||
{ yymsp[-1].minor.yy68 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); }
|
{ yymsp[-1].minor.yy68 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); }
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -409,11 +409,11 @@ TEST_F(ParserTest, createTable) {
|
||||||
TEST_F(ParserTest, showTables) {
|
TEST_F(ParserTest, showTables) {
|
||||||
setDatabase("root", "test");
|
setDatabase("root", "test");
|
||||||
|
|
||||||
// bind("show tables");
|
bind("show tables");
|
||||||
// ASSERT_TRUE(run());
|
ASSERT_TRUE(run());
|
||||||
|
|
||||||
// bind("show test.tables");
|
bind("show test.tables");
|
||||||
// ASSERT_TRUE(run());
|
ASSERT_TRUE(run());
|
||||||
|
|
||||||
bind("show tables like 'c%'");
|
bind("show tables like 'c%'");
|
||||||
ASSERT_TRUE(run());
|
ASSERT_TRUE(run());
|
||||||
|
|
Loading…
Reference in New Issue