From 7610e6d174f575760a56b9e518ffafc543d12cab Mon Sep 17 00:00:00 2001 From: Pengrongkun Date: Tue, 3 Dec 2024 10:49:01 +0800 Subject: [PATCH] fix stmt2 get fields bug --- include/client/taos.h | 2 +- source/libs/parser/src/parInsertSql.c | 3 + source/libs/parser/src/parInsertStmt.c | 5 +- tests/script/api/stmt2-get-fields.c | 151 +++++++++++++++++-------- 4 files changed, 111 insertions(+), 50 deletions(-) diff --git a/include/client/taos.h b/include/client/taos.h index 924d0ff66e..360a58ca2b 100644 --- a/include/client/taos.h +++ b/include/client/taos.h @@ -108,7 +108,7 @@ typedef struct TAOS_FIELD_STB { uint8_t precision; uint8_t scale; int32_t bytes; - TAOS_FIELD_T field_type; + uint8_t field_type; } TAOS_FIELD_STB; #ifdef WINDOWS diff --git a/source/libs/parser/src/parInsertSql.c b/source/libs/parser/src/parInsertSql.c index ad439a11ff..65ee0de80e 100644 --- a/source/libs/parser/src/parInsertSql.c +++ b/source/libs/parser/src/parInsertSql.c @@ -2555,6 +2555,9 @@ static int32_t checkTableClauseFirstToken(SInsertParseContext* pCxt, SVnodeModif if (TSDB_CODE_SUCCESS == code) { pTbName->z = tbName; pTbName->n = strlen(tbName); + } else if (code == TSDB_CODE_TSC_STMT_TBNAME_ERROR) { + pCxt->preCtbname = true; + code = TSDB_CODE_SUCCESS; } else { return code; } diff --git a/source/libs/parser/src/parInsertStmt.c b/source/libs/parser/src/parInsertStmt.c index db732f9b6e..50a69344da 100644 --- a/source/libs/parser/src/parInsertStmt.c +++ b/source/libs/parser/src/parInsertStmt.c @@ -952,7 +952,7 @@ int32_t buildStbBoundFields(SBoundColInfo boundColsInfo, SSchema* pSchema, int32 if (preCtbname && numOfBound != boundColsInfo.numOfBound) { (*fields)[idx].field_type = TAOS_FIELD_TBNAME; tstrncpy((*fields)[idx].name, "tbname", sizeof((*fields)[idx].name)); - (*fields)[idx].type = TSDB_DATA_TYPE_VARCHAR; + (*fields)[idx].type = TSDB_DATA_TYPE_BINARY; (*fields)[idx].bytes = TSDB_TABLE_FNAME_LEN; idx++; } @@ -988,6 +988,9 @@ int32_t buildStbBoundFields(SBoundColInfo boundColsInfo, SSchema* pSchema, int32 if (idxCol == pMeta->tableInfo.numOfColumns + pMeta->tableInfo.numOfTags) { (*fields)[idx].field_type = TAOS_FIELD_TBNAME; tstrncpy((*fields)[i].name, "tbname", sizeof((*fields)[idx].name)); + (*fields)[idx].type = TSDB_DATA_TYPE_BINARY; + (*fields)[idx].bytes = TSDB_TABLE_FNAME_LEN; + idx++; continue; } else if (idxCol < pMeta->tableInfo.numOfColumns) { (*fields)[idx].field_type = TAOS_FIELD_COL; diff --git a/tests/script/api/stmt2-get-fields.c b/tests/script/api/stmt2-get-fields.c index dc4ef52e80..d939f4cbc8 100755 --- a/tests/script/api/stmt2-get-fields.c +++ b/tests/script/api/stmt2-get-fields.c @@ -46,18 +46,26 @@ void do_query(TAOS *taos, const char *sql) { void do_stmt(TAOS *taos) { do_query(taos, "drop database if exists db"); do_query(taos, "create database db"); + do_query(taos, "use db"); do_query(taos, "create table db.stb (ts timestamp, b binary(10)) tags(t1 " "int, t2 binary(10))"); do_query(taos, "CREATE TABLE db.d0 USING db.stb (t1,t2) TAGS (7,'Cali');"); do_query(taos, "CREATE TABLE db.ntb(nts timestamp, nb binary(10),nvc varchar(16),ni int);"); + do_query( + taos, + "create table if not exists all_stb(ts timestamp, v1 bool, v2 tinyint, v3 smallint, v4 int, v5 bigint, v6 " + "tinyint unsigned, v7 smallint unsigned, v8 int unsigned, v9 bigint unsigned, v10 float, v11 double, v12 " + "binary(20), v13 varbinary(20), v14 geometry(100), v15 nchar(20))tags(tts timestamp, tv1 bool, tv2 tinyint, tv3 " + "smallint, tv4 int, tv5 bigint, tv6 tinyint unsigned, tv7 smallint unsigned, tv8 int unsigned, tv9 bigint " + "unsigned, tv10 float, tv11 double, tv12 binary(20), tv13 varbinary(20), tv14 geometry(100), tv15 nchar(20));"); printf("field_type: TAOS_FIELD_COL = 1, TAOS_FIELD_TAG=2, TAOS_FIELD_QUERY=3, TAOS_FIELD_TBNAME=4\n"); // case 1 : INSERT INTO db.stb(t1,t2,ts,b,tbname) values(?,?,?,?,?) // test super table const char *sql = "insert into db.stb(t1,t2,ts,b,tbname) values(?,?,?,?,?)"; - printf("====================================\n"); + printf("=================normal test===================\n"); printf("case 1 : %s\n", sql); getFields(taos, sql); @@ -73,76 +81,123 @@ void do_stmt(TAOS *taos) { printf("case 3 : %s\n", sql); getFields(taos, sql); - // case 4 : INSERT INTO db.? using db.stb TAGS(?,?) VALUES(?,?) - // not support this clause - sql = "insert into db.? using db.stb tags(?, ?) values(?,?)"; + // case 4 : INSERT INTO db.ntb VALUES(?,?,?,?) + // test random order + sql = "insert into db.stb(t1,tbname,ts,t2,b) values(?,?,?,?,?)"; printf("case 4 : %s\n", sql); getFields(taos, sql); - // case 5 : INSERT INTO db.stb(t1,t2,ts,b) values(?,?,?,?) - // no tbname error - sql = "INSERT INTO db.stb(t1,t2,ts,b) values(?,?,?,?)"; - printf("case 5 (no tbname error): %s\n", sql); - getFields(taos, sql); - - // case 6 : INSERT INTO db.d0 using db.stb values(?,?) - // none para for ctbname - sql = "INSERT INTO db.d0 using db.stb values(?,?)"; - printf("case 6 (no tags error): %s\n", sql); - getFields(taos, sql); - - // case 7 : insert into db.stb(t1,t2,tbname) values(?,?,?) - // no value - sql = "insert into db.stb(t1,t2,tbname) values(?,?,?)"; - printf("case 7 (no PK error): %s\n", sql); - getFields(taos, sql); - - // case 8 : insert into db.stb(ts,b,tbname) values(?,?,?) + // case 5 : insert into db.stb(ts,b,tbname) values(?,?,?) // no tag sql = "insert into db.stb(ts,b,tbname) values(?,?,?)"; + printf("case 5 : %s\n", sql); + getFields(taos, sql); + + // case 6 : INSERT INTO db.? using db.stb TAGS(?,?) VALUES(?,?) + // normal insert clause + sql = "insert into ? using db.stb tags(?, ?) values(?,?)"; + printf("case 6 : %s\n", sql); + getFields(taos, sql); + + // case 7 : insert into db.? using db.stb(t2,t1) tags(?, ?) (b,ts)values(?,?) + // disordered + sql = "insert into db.? using db.stb(t2,t1) tags(?, ?) (b,ts)values(?,?)"; + printf("case 7 : %s\n", sql); + getFields(taos, sql); + + // case 8 : insert into db.? using db.stb tags(?, ?) values(?,?) + // no field name + sql = "insert into db.? using db.stb tags(?, ?) values(?,?)"; printf("case 8 : %s\n", sql); getFields(taos, sql); - // case 9 : insert into db.stb(ts,b,tbname) values(?,?,?,?,?) - // wrong para nums - sql = "insert into db.stb(ts,b,tbname) values(?,?,?,?,?)"; - printf("case 9 (wrong para nums): %s\n", sql); + // case 9 : insert into db.? using db.stb tags(?, ?) values(?,?) + // less para + sql = "insert into db.? using db.stb (t2)tags(?) (ts)values(?)"; + printf("case 9 : %s\n", sql); getFields(taos, sql); - // case 10 : insert into db.ntb(nts,ni) values(?,?,?,?,?) - // wrong para nums - sql = "insert into db.ntb(nts,ni) values(?,?)"; + // case 10 : insert into db.? using db.stb tags(?, ?) values(?,?) + // less para + sql = "insert into db.d0 (ts)values(?)"; printf("case 10 : %s\n", sql); getFields(taos, sql); - // case 11 : insert into db.? values(?,?) - // normal table must have tbnam - sql = "insert into db.? values(?,?)"; - printf("case 11 (normal table must have tbname): %s\n", sql); + // case 11 : insert into abc using stb tags(?, ?) values(?,?) + // insert create table + sql = "insert into abc using stb tags(?, ?) values(?,?)"; + printf("case 11 : %s\n", sql); getFields(taos, sql); - // case 12 : insert into db.? using db.stb(t2,t1) tags(?, ?) (b,ts)values(?,?) - // disordered - sql = "insert into db.? using db.stb(t2,t1) tags(?, ?) (b,ts)values(?,?)"; + // case 12 : insert into ? using all_stb tags(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) + // test all types + sql = "insert into ? using all_stb tags(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; printf("case 12 : %s\n", sql); getFields(taos, sql); - // case 13 : insert into db.? using db.stb tags(?, ?) values(?,?) - // no field name - sql = "insert into db.? using db.stb tags(?, ?) values(?,?)"; + // case 13 : insert into ? using all_stb tags(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) + // test all types + sql = + "insert into all_stb " + "(tbname,tts,tv1,tv2,tv3,tv4,tv5,tv6,tv7,tv8,tv9,tv10,tv11,tv12,tv13,tv14,tv15,ts,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10," + "v11,v12,v13,v14,v15) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; printf("case 13 : %s\n", sql); getFields(taos, sql); + printf("=================error test===================\n"); - // case 14 : insert into db.? using db.stb tags(?, ?) values(?,?) - // less para - sql = "insert into db.? using db.stb (t2)tags(?) (ts)values(?)"; - printf("case 14 : %s\n", sql); + // case 14 : INSERT INTO db.d0 using db.stb values(?,?) + // none para for ctbname + sql = "INSERT INTO db.d0 using db.stb values(?,?)"; + printf("case 14 (no tags error): %s\n", sql); getFields(taos, sql); - // case 15 : insert into db.? using db.stb tags(?, ?) values(?,?) - // less para - sql = "insert into db.d0 (ts)values(?)"; - printf("case 15 : %s\n", sql); + // case 15 : insert into db.stb(t1,t2,tbname) values(?,?,?) + // no value + sql = "insert into db.stb(t1,t2,tbname) values(?,?,?)"; + printf("case 15 (no PK error): %s\n", sql); + getFields(taos, sql); + + // case 16 : insert into db.stb(ts,b,tbname) values(?,?,?,?,?) + // wrong para nums + sql = "insert into db.stb(ts,b,tbname) values(?,?,?,?,?)"; + printf("case 16 (wrong para nums): %s\n", sql); + getFields(taos, sql); + + // case 17 : insert into db.? values(?,?) + // normal table must have tbnam + sql = "insert into db.? values(?,?)"; + printf("case 17 (normal table must have tbname): %s\n", sql); + getFields(taos, sql); + + // case 18 : INSERT INTO db.stb(t1,t2,ts,b) values(?,?,?,?) + // no tbname error + sql = "INSERT INTO db.stb(t1,t2,ts,b) values(?,?,?,?)"; + printf("case 18 (no tbname error): %s\n", sql); + getFields(taos, sql); + + // case 19 : insert into db.ntb(nts,ni) values(?,?,?,?,?) + // wrong para nums + sql = "insert into ntb(nts,ni) values(?,?,?,?,?)"; + printf("case 19 : %s\n", sql); + getFields(taos, sql); + + // case 20 : insert into db.stb(t1,t2,ts,b,tbname) values(*,*,*,*,*) + // wrong simbol + sql = "insert into db.stb(t1,t2,ts,b,tbname) values(*,*,*,*,*)"; + printf("=================normal test===================\n"); + printf("case 20 : %s\n", sql); + getFields(taos, sql); + + // case 21 : INSERT INTO ! using db.stb TAGS(?,?) VALUES(?,?) + // wrong simbol + sql = "insert into ! using db.stb tags(?, ?) values(?,?)"; + printf("case 21 : %s\n", sql); + getFields(taos, sql); + + // case 22 : INSERT INTO ! using db.stb TAGS(?,?) VALUES(?,?) + // wrong tbname + sql = "insert into db.stb values(?,?)"; + printf("case 22 : %s\n", sql); getFields(taos, sql); }