feat: insert using statement supports ttl and comment
This commit is contained in:
parent
1289093b02
commit
7708900f73
|
@ -786,6 +786,7 @@ static void buildCreateTbReq(SVCreateTbReq* pTbReq, const char* tname, STag* pTa
|
|||
if (sname) pTbReq->ctb.name = strdup(sname);
|
||||
pTbReq->ctb.pTag = (uint8_t*)pTag;
|
||||
pTbReq->ctb.tagName = taosArrayDup(tagName);
|
||||
pTbReq->ttl = TSDB_DEFAULT_TABLE_TTL;
|
||||
pTbReq->commentLen = -1;
|
||||
|
||||
return;
|
||||
|
@ -1121,6 +1122,40 @@ static int32_t ignoreAutoCreateTableClause(SInsertParseContext* pCxt) {
|
|||
return code;
|
||||
}
|
||||
|
||||
static int32_t parseTableOptions(SInsertParseContext* pCxt) {
|
||||
do {
|
||||
int32_t index = 0;
|
||||
SToken sToken;
|
||||
NEXT_TOKEN_KEEP_SQL(pCxt->pSql, sToken, index);
|
||||
if (TK_TTL == sToken.type) {
|
||||
pCxt->pSql += index;
|
||||
NEXT_TOKEN(pCxt->pSql, sToken);
|
||||
if (TK_NK_INTEGER != sToken.type) {
|
||||
return buildSyntaxErrMsg(&pCxt->msg, "Invalid option ttl", sToken.z);
|
||||
}
|
||||
pCxt->createTblReq.ttl = taosStr2Int32(sToken.z, NULL, 10);
|
||||
} else if (TK_COMMENT == sToken.type) {
|
||||
pCxt->pSql += index;
|
||||
NEXT_TOKEN(pCxt->pSql, sToken);
|
||||
if (TK_NK_STRING != sToken.type) {
|
||||
return buildSyntaxErrMsg(&pCxt->msg, "Invalid option comment", sToken.z);
|
||||
}
|
||||
if (sToken.n >= TSDB_TB_COMMENT_LEN) {
|
||||
return buildSyntaxErrMsg(&pCxt->msg, "comment too long", sToken.z);
|
||||
}
|
||||
int32_t len = trimString(sToken.z, sToken.n, pCxt->tmpTokenBuf, TSDB_TB_COMMENT_LEN);
|
||||
pCxt->createTblReq.comment = strndup(pCxt->tmpTokenBuf, len);
|
||||
if (NULL == pCxt->createTblReq.comment) {
|
||||
return TSDB_CODE_OUT_OF_MEMORY;
|
||||
}
|
||||
pCxt->createTblReq.commentLen = len;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
} while (1);
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
// pSql -> stb_name [(tag1_name, ...)] TAGS (tag1_value, ...)
|
||||
static int32_t parseUsingClause(SInsertParseContext* pCxt, int32_t tbNo, SName* name, char* tbFName) {
|
||||
int32_t len = strlen(tbFName);
|
||||
|
@ -1172,7 +1207,7 @@ static int32_t parseUsingClause(SInsertParseContext* pCxt, int32_t tbNo, SName*
|
|||
return buildSyntaxErrMsg(&pCxt->msg, ") is expected", sToken.z);
|
||||
}
|
||||
|
||||
return TSDB_CODE_SUCCESS;
|
||||
return parseTableOptions(pCxt);
|
||||
}
|
||||
|
||||
static int parseOneRow(SInsertParseContext* pCxt, STableDataBlocks* pDataBlocks, int16_t timePrec, bool* gotRow,
|
||||
|
@ -1672,7 +1707,7 @@ int32_t parseInsertSql(SParseContext* pContext, SQuery** pQuery, SParseMetaCache
|
|||
if (pContext->pStmtCb) {
|
||||
context.pVgroupsHashObj = NULL;
|
||||
context.pTableBlockHashObj = NULL;
|
||||
}
|
||||
}
|
||||
destroyInsertParseContext(&context);
|
||||
return code;
|
||||
}
|
||||
|
@ -1700,6 +1735,21 @@ static int32_t skipValuesClause(SInsertParseSyntaxCxt* pCxt) {
|
|||
|
||||
static int32_t skipTagsClause(SInsertParseSyntaxCxt* pCxt) { return skipParentheses(pCxt); }
|
||||
|
||||
static int32_t skipTableOptions(SInsertParseSyntaxCxt* pCxt) {
|
||||
do {
|
||||
int32_t index = 0;
|
||||
SToken sToken;
|
||||
NEXT_TOKEN_KEEP_SQL(pCxt->pSql, sToken, index);
|
||||
if (TK_TTL == sToken.type || TK_COMMENT == sToken.type) {
|
||||
pCxt->pSql += index;
|
||||
NEXT_TOKEN(pCxt->pSql, sToken);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
} while (1);
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
// pSql -> [(tag1_name, ...)] TAGS (tag1_value, ...)
|
||||
static int32_t skipUsingClause(SInsertParseSyntaxCxt* pCxt) {
|
||||
SToken sToken;
|
||||
|
@ -1718,6 +1768,7 @@ static int32_t skipUsingClause(SInsertParseSyntaxCxt* pCxt) {
|
|||
return buildSyntaxErrMsg(&pCxt->msg, "( is expected", sToken.z);
|
||||
}
|
||||
CHECK_CODE(skipTagsClause(pCxt));
|
||||
CHECK_CODE(skipTableOptions(pCxt));
|
||||
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue