diff --git a/cmake/version.inc b/cmake/version.inc index 7c0a824c9c39c6760b3e2408d969048983430811..ffceecf49215bcef9136c0b5d2f0f1e1290c9ed1 100755 --- a/cmake/version.inc +++ b/cmake/version.inc @@ -4,7 +4,7 @@ PROJECT(TDengine) IF (DEFINED VERNUMBER) SET(TD_VER_NUMBER ${VERNUMBER}) ELSE () - SET(TD_VER_NUMBER "2.1.5.0") + SET(TD_VER_NUMBER "2.1.6.0") ENDIF () IF (DEFINED VERCOMPATIBLE) diff --git a/documentation20/cn/02.getting-started/docs.md b/documentation20/cn/02.getting-started/docs.md index ab10b28fd3950bfa10e47113696de0829b2da74d..4ae4ebf4d0f71ad9bce3588cbcce5e5750fb9728 100644 --- a/documentation20/cn/02.getting-started/docs.md +++ b/documentation20/cn/02.getting-started/docs.md @@ -126,7 +126,7 @@ taos> source ; $ taosdemo ``` -该命令将在数据库 test 下面自动创建一张超级表 meters,该超级表下有 1 万张表,表名为 "d0" 到 "d9999",每张表有 1 万条记录,每条记录有 (ts, current, voltage, phase) 四个字段,时间戳从 "2017-07-14 10:40:00 000" 到 "2017-07-14 10:40:09 999",每张表带有标签 location 和 groupdId,groupdId 被设置为 1 到 10, location 被设置为 "beijing" 或者 "shanghai"。 +该命令将在数据库 test 下面自动创建一张超级表 meters,该超级表下有 1 万张表,表名为 "d0" 到 "d9999",每张表有 1 万条记录,每条记录有 (ts, current, voltage, phase) 四个字段,时间戳从 "2017-07-14 10:40:00 000" 到 "2017-07-14 10:40:09 999",每张表带有标签 location 和 groupId,groupId 被设置为 1 到 10, location 被设置为 "beijing" 或者 "shanghai"。 执行这条命令大概需要几分钟,最后共插入 1 亿条记录。 @@ -150,10 +150,10 @@ taos> select avg(current), max(voltage), min(phase) from test.meters; taos> select count(*) from test.meters where location="beijing"; ``` -- 查询 groupdId=10 的所有记录的平均值、最大值、最小值等: +- 查询 groupId=10 的所有记录的平均值、最大值、最小值等: ```mysql -taos> select avg(current), max(voltage), min(phase) from test.meters where groupdId=10; +taos> select avg(current), max(voltage), min(phase) from test.meters where groupId=10; ``` - 对表 d10 按 10s 进行平均值、最大值和最小值聚合统计: diff --git a/documentation20/cn/04.model/docs.md b/documentation20/cn/04.model/docs.md index 6f85381588c6cd131f2204bba13e64e7058f93f2..4ea592bd4af180ba8aca0a34d1d1817cf4df03ca 100644 --- a/documentation20/cn/04.model/docs.md +++ b/documentation20/cn/04.model/docs.md @@ -33,7 +33,7 @@ USE power; 一个物联网系统,往往存在多种类型的设备,比如对于电网,存在智能电表、变压器、母线、开关等等。为便于多表之间的聚合,使用TDengine, 需要对每个类型的数据采集点创建一超级表。以表一中的智能电表为例,可以使用如下的SQL命令创建超级表: ```mysql -CREATE STABLE meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupdId int); +CREATE STABLE meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupId int); ``` **注意:**这一指令中的 STABLE 关键字,在 2.0.15 之前的版本中需写作 TABLE 。 diff --git a/documentation20/cn/07.advanced-features/docs.md b/documentation20/cn/07.advanced-features/docs.md index 1077f299ee2a2e93589d0246af7633a6886c6756..1b4ccb4814f7adcc72c250c07bc2ec6151ea5f76 100644 --- a/documentation20/cn/07.advanced-features/docs.md +++ b/documentation20/cn/07.advanced-features/docs.md @@ -17,7 +17,7 @@ TDengine提供的连续查询与普通流计算中的时间窗口计算具有以 下面以智能电表场景为例介绍连续查询的具体使用方法。假设我们通过下列SQL语句创建了超级表和子表: ```sql -create table meters (ts timestamp, current float, voltage int, phase float) tags (location binary(64), groupdId int); +create table meters (ts timestamp, current float, voltage int, phase float) tags (location binary(64), groupId int); create table D1001 using meters tags ("Beijing.Chaoyang", 2); create table D1002 using meters tags ("Beijing.Haidian", 2); ... diff --git a/documentation20/cn/12.taos-sql/docs.md b/documentation20/cn/12.taos-sql/docs.md index 4368e5fa1dfef4300fe8e1c44b47471fb55f70e1..97b89f34466fb4a3402fcbcf8df9b4ee5d413bbd 100644 --- a/documentation20/cn/12.taos-sql/docs.md +++ b/documentation20/cn/12.taos-sql/docs.md @@ -414,13 +414,13 @@ INSERT INTO ``` 也可以在自动建表时,只是指定部分 TAGS 列的取值,未被指定的 TAGS 列将置为 NULL。例如: ```mysql - INSERT INTO d21001 USING meters (groupdId) TAGS (2) VALUES ('2021-07-13 14:06:33.196', 10.15, 217, 0.33); + INSERT INTO d21001 USING meters (groupId) TAGS (2) VALUES ('2021-07-13 14:06:33.196', 10.15, 217, 0.33); ``` 自动建表语法也支持在一条语句中向多个表插入记录。例如: ```mysql INSERT INTO d21001 USING meters TAGS ('Beijing.Chaoyang', 2) VALUES ('2021-07-13 14:06:34.630', 10.2, 219, 0.32) ('2021-07-13 14:06:35.779', 10.15, 217, 0.33) - d21002 USING meters (groupdId) TAGS (2) VALUES ('2021-07-13 14:06:34.255', 10.15, 217, 0.33) - d21003 USING meters (groupdId) TAGS (2) (ts, current, phase) VALUES ('2021-07-13 14:06:34.255', 10.27, 0.31); + d21002 USING meters (groupId) TAGS (2) VALUES ('2021-07-13 14:06:34.255', 10.15, 217, 0.33) + d21003 USING meters (groupId) TAGS (2) (ts, current, phase) VALUES ('2021-07-13 14:06:34.255', 10.27, 0.31); ``` **说明:**在 2.0.20.5 版本之前,在使用自动建表语法并指定列时,子表的列名必须紧跟在子表名称后面,而不能如例子里那样放在 TAGS 和 VALUES 之间。从 2.0.20.5 版本开始,两种写法都可以,但不能在一条 SQL 语句中混用,否则会报语法错误。 diff --git a/documentation20/en/04.model/docs.md b/documentation20/en/04.model/docs.md index 5ab5e0c6a56d0b5d534386752988cb1adae3b2fa..2e69054fa12340cb0e264848d7def4b7685f8796 100644 --- a/documentation20/en/04.model/docs.md +++ b/documentation20/en/04.model/docs.md @@ -32,7 +32,7 @@ Replace the database operating in the current connection with “power”, other An IoT system often has many types of devices, such as smart meters, transformers, buses, switches, etc. for power grids. In order to facilitate aggregation among multiple tables, using TDengine, it is necessary to create a STable for each type of data collection point. Taking the smart meter in Table 1 as an example, you can use the following SQL command to create a STable: ```mysql -CREATE STABLE meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupdId int); +CREATE STABLE meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupId int); ``` **Note:** The STABLE keyword in this instruction needs to be written as TABLE in versions before 2.0.15. diff --git a/documentation20/en/07.advanced-features/docs.md b/documentation20/en/07.advanced-features/docs.md index cebbb4a269047b956359252bbdb71fb1a4ba8ff8..d9103c70216772a9ce24f67c719b379b106a9055 100644 --- a/documentation20/en/07.advanced-features/docs.md +++ b/documentation20/en/07.advanced-features/docs.md @@ -17,7 +17,7 @@ The continuous query provided by TDengine differs from the time window calculati The following is an example of the smart meter scenario to introduce the specific use of continuous query. Suppose we create a STables and sub-tables through the following SQL statement: ```sql -create table meters (ts timestamp, current float, voltage int, phase float) tags (location binary(64), groupdId int); +create table meters (ts timestamp, current float, voltage int, phase float) tags (location binary(64), groupId int); create table D1001 using meters tags ("Beijing.Chaoyang", 2); create table D1002 using meters tags ("Beijing.Haidian", 2); ... @@ -357,4 +357,4 @@ This SQL statement will obtain the last recorded voltage value of all smart mete In scenarios of TDengine, alarm monitoring is a common requirement. Conceptually, it requires the program to filter out data that meet certain conditions from the data of the latest period of time, and calculate a result according to a defined formula based on these data. When the result meets certain conditions and lasts for a certain period of time, it will notify the user in some form. -In order to meet the needs of users for alarm monitoring, TDengine provides this function in the form of an independent module. For its installation and use, please refer to the blog [How to Use TDengine for Alarm Monitoring](https://www.taosdata.com/blog/2020/04/14/1438.html). \ No newline at end of file +In order to meet the needs of users for alarm monitoring, TDengine provides this function in the form of an independent module. For its installation and use, please refer to the blog [How to Use TDengine for Alarm Monitoring](https://www.taosdata.com/blog/2020/04/14/1438.html). diff --git a/src/client/inc/tsclient.h b/src/client/inc/tsclient.h index 904f5d4503321f36e8b44c93404a2a0a68843f22..ac5adcbbb4f983e4b653327b0e42978333b535dc 100644 --- a/src/client/inc/tsclient.h +++ b/src/client/inc/tsclient.h @@ -295,7 +295,7 @@ typedef struct SSqlObj { SSqlCmd cmd; SSqlRes res; bool isBind; - + SSubqueryState subState; struct SSqlObj **pSubs; diff --git a/src/client/src/tscProfile.c b/src/client/src/tscProfile.c index 70a3e03d623aa968857c737806d7d6cbfb9c600b..92ad9b792448d659b9a79528eadf2009426c4c41 100644 --- a/src/client/src/tscProfile.c +++ b/src/client/src/tscProfile.c @@ -255,10 +255,25 @@ int tscBuildQueryStreamDesc(void *pMsg, STscObj *pObj) { pQdesc->qId = htobe64(pSql->res.qId); pQdesc->sqlObjId = htobe64(pSql->self); pQdesc->pid = pHeartbeat->pid; - if (pSql->cmd.pQueryInfo->stableQuery == true) { - pQdesc->numOfSub = pSql->subState.numOfSub; + pQdesc->stableQuery = pSql->cmd.pQueryInfo->stableQuery; + pQdesc->numOfSub = pSql->subState.numOfSub; + + char *p = pQdesc->subSqlInfo; + int32_t remainLen = sizeof(pQdesc->subSqlInfo); + if (pQdesc->numOfSub == 0) { + snprintf(p, remainLen, "N/A"); } else { - pQdesc->numOfSub = 1; + int32_t len; + for (int32_t i = 0; i < pQdesc->numOfSub; ++i) { + len = snprintf(p, remainLen, "[%d]0x%" PRIx64 "(%c) ", i, + pSql->pSubs[i]->self, + pSql->subState.states[i] ? 'C' : 'I'); + if (len > remainLen) { + break; + } + remainLen -= len; + p += len; + } } pQdesc->numOfSub = htonl(pQdesc->numOfSub); diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index d26f0b478e5634a7841ac922168cebacb73ec680..2d8196982cc16330aa033a3c91503d347d82b89a 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -5886,6 +5886,11 @@ int32_t setAlterTableInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { tVariantListItem* pItem = taosArrayGet(pVarList, 1); SSchema* pTagsSchema = tscGetTableColumnSchema(pTableMetaInfo->pTableMeta, columnIndex.columnIndex); + + if (IS_VAR_DATA_TYPE(pTagsSchema->type) && (pItem->pVar.nLen > pTagsSchema->bytes * TSDB_NCHAR_SIZE)) { + return invalidOperationMsg(pMsg, msg14); + } + pAlterSQL->tagData.data = calloc(1, pTagsSchema->bytes * TSDB_NCHAR_SIZE + VARSTR_HEADER_SIZE); if (tVariantDump(&pItem->pVar, pAlterSQL->tagData.data, pTagsSchema->type, true) != TSDB_CODE_SUCCESS) { diff --git a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/AbstractDatabaseMetaData.java b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/AbstractDatabaseMetaData.java index 3c9c784f594d6cb022267c2ff1cd848c26f53ac3..7dbb62d8496e9ae9b758c1a6440531e15e352dc9 100644 --- a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/AbstractDatabaseMetaData.java +++ b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/AbstractDatabaseMetaData.java @@ -77,8 +77,7 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da } public boolean supportsMixedCaseIdentifiers() throws SQLException { - //像database、table这些对象的标识符,在存储时是否采用大小写混合的模式 - return false; + return false; //像database、table这些对象的标识符,在存储时是否采用大小写混合的模式 } public boolean storesUpperCaseIdentifiers() throws SQLException { @@ -514,7 +513,7 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da ColumnMetaData col6 = new ColumnMetaData(); col6.setColIndex(colIndex); col6.setColName("TYPE_CAT"); - col6.setColType(Types.NCHAR); + col6.setColType(TSDBConstants.TSDB_DATA_TYPE_NCHAR); return col6; } @@ -522,7 +521,7 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da ColumnMetaData col7 = new ColumnMetaData(); col7.setColIndex(colIndex); col7.setColName("TYPE_SCHEM"); - col7.setColType(Types.NCHAR); + col7.setColType(TSDBConstants.TSDB_DATA_TYPE_NCHAR); return col7; } @@ -530,7 +529,7 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da ColumnMetaData col8 = new ColumnMetaData(); col8.setColIndex(colIndex); col8.setColName("TYPE_NAME"); - col8.setColType(Types.NCHAR); + col8.setColType(TSDBConstants.TSDB_DATA_TYPE_NCHAR); return col8; } @@ -538,7 +537,7 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da ColumnMetaData col9 = new ColumnMetaData(); col9.setColIndex(colIndex); col9.setColName("SELF_REFERENCING_COL_NAME"); - col9.setColType(Types.NCHAR); + col9.setColType(TSDBConstants.TSDB_DATA_TYPE_NCHAR); return col9; } @@ -546,7 +545,7 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da ColumnMetaData col10 = new ColumnMetaData(); col10.setColIndex(colIndex); col10.setColName("REF_GENERATION"); - col10.setColType(Types.NCHAR); + col10.setColType(TSDBConstants.TSDB_DATA_TYPE_NCHAR); return col10; } @@ -592,7 +591,7 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da ColumnMetaData col4 = new ColumnMetaData(); col4.setColIndex(colIndex); col4.setColName("TABLE_TYPE"); - col4.setColType(Types.NCHAR); + col4.setColType(TSDBConstants.TSDB_DATA_TYPE_NCHAR); return col4; } @@ -734,7 +733,7 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da ColumnMetaData col1 = new ColumnMetaData(); col1.setColIndex(colIndex); col1.setColName("TABLE_CAT"); - col1.setColType(Types.NCHAR); + col1.setColType(TSDBConstants.TSDB_DATA_TYPE_NCHAR); return col1; } @@ -742,7 +741,7 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da ColumnMetaData col2 = new ColumnMetaData(); col2.setColIndex(colIndex); col2.setColName("TABLE_SCHEM"); - col2.setColType(Types.NCHAR); + col2.setColType(TSDBConstants.TSDB_DATA_TYPE_NCHAR); return col2; } @@ -751,7 +750,7 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da col3.setColIndex(colIndex); col3.setColName("TABLE_NAME"); col3.setColSize(193); - col3.setColType(Types.NCHAR); + col3.setColType(TSDBConstants.TSDB_DATA_TYPE_NCHAR); return col3; } @@ -760,7 +759,7 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da col4.setColIndex(colIndex); col4.setColName("COLUMN_NAME"); col4.setColSize(65); - col4.setColType(Types.NCHAR); + col4.setColType(TSDBConstants.TSDB_DATA_TYPE_NCHAR); return col4; } @@ -768,7 +767,7 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da ColumnMetaData col5 = new ColumnMetaData(); col5.setColIndex(colIndex); col5.setColName("DATA_TYPE"); - col5.setColType(Types.INTEGER); + col5.setColType(TSDBConstants.TSDB_DATA_TYPE_INT); return col5; } @@ -776,7 +775,7 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da ColumnMetaData col7 = new ColumnMetaData(); col7.setColIndex(7); col7.setColName("COLUMN_SIZE"); - col7.setColType(Types.INTEGER); + col7.setColType(TSDBConstants.TSDB_DATA_TYPE_INT); return col7; } @@ -791,7 +790,7 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da ColumnMetaData col9 = new ColumnMetaData(); col9.setColIndex(9); col9.setColName("DECIMAL_DIGITS"); - col9.setColType(Types.INTEGER); + col9.setColType(TSDBConstants.TSDB_DATA_TYPE_INT); return col9; } @@ -799,7 +798,7 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da ColumnMetaData col10 = new ColumnMetaData(); col10.setColIndex(10); col10.setColName("NUM_PREC_RADIX"); - col10.setColType(Types.INTEGER); + col10.setColType(TSDBConstants.TSDB_DATA_TYPE_INT); return col10; } @@ -807,7 +806,7 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da ColumnMetaData col11 = new ColumnMetaData(); col11.setColIndex(11); col11.setColName("NULLABLE"); - col11.setColType(Types.INTEGER); + col11.setColType(TSDBConstants.TSDB_DATA_TYPE_INT); return col11; } @@ -815,7 +814,7 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da ColumnMetaData col12 = new ColumnMetaData(); col12.setColIndex(colIndex); col12.setColName("REMARKS"); - col12.setColType(Types.NCHAR); + col12.setColType(TSDBConstants.TSDB_DATA_TYPE_NCHAR); return col12; } @@ -823,7 +822,7 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da ColumnMetaData col13 = new ColumnMetaData(); col13.setColIndex(13); col13.setColName("COLUMN_DEF"); - col13.setColType(Types.NCHAR); + col13.setColType(TSDBConstants.TSDB_DATA_TYPE_NCHAR); return col13; } @@ -831,7 +830,7 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da ColumnMetaData col14 = new ColumnMetaData(); col14.setColIndex(14); col14.setColName("SQL_DATA_TYPE"); - col14.setColType(Types.INTEGER); + col14.setColType(TSDBConstants.TSDB_DATA_TYPE_INT); return col14; } @@ -839,7 +838,7 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da ColumnMetaData col15 = new ColumnMetaData(); col15.setColIndex(15); col15.setColName("SQL_DATETIME_SUB"); - col15.setColType(Types.INTEGER); + col15.setColType(TSDBConstants.TSDB_DATA_TYPE_INT); return col15; } @@ -847,7 +846,7 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da ColumnMetaData col16 = new ColumnMetaData(); col16.setColIndex(16); col16.setColName("CHAR_OCTET_LENGTH"); - col16.setColType(Types.INTEGER); + col16.setColType(TSDBConstants.TSDB_DATA_TYPE_INT); return col16; } @@ -855,7 +854,7 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da ColumnMetaData col17 = new ColumnMetaData(); col17.setColIndex(17); col17.setColName("ORDINAL_POSITION"); - col17.setColType(Types.INTEGER); + col17.setColType(TSDBConstants.TSDB_DATA_TYPE_INT); return col17; } @@ -863,7 +862,7 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da ColumnMetaData col18 = new ColumnMetaData(); col18.setColIndex(18); col18.setColName("IS_NULLABLE"); - col18.setColType(Types.NCHAR); + col18.setColType(TSDBConstants.TSDB_DATA_TYPE_NCHAR); return col18; } @@ -871,7 +870,7 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da ColumnMetaData col19 = new ColumnMetaData(); col19.setColIndex(19); col19.setColName("SCOPE_CATALOG"); - col19.setColType(Types.NCHAR); + col19.setColType(TSDBConstants.TSDB_DATA_TYPE_NCHAR); return col19; } @@ -879,7 +878,7 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da ColumnMetaData col20 = new ColumnMetaData(); col20.setColIndex(20); col20.setColName("SCOPE_SCHEMA"); - col20.setColType(Types.NCHAR); + col20.setColType(TSDBConstants.TSDB_DATA_TYPE_NCHAR); return col20; } @@ -887,7 +886,7 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da ColumnMetaData col21 = new ColumnMetaData(); col21.setColIndex(21); col21.setColName("SCOPE_TABLE"); - col21.setColType(Types.NCHAR); + col21.setColType(TSDBConstants.TSDB_DATA_TYPE_NCHAR); return col21; } @@ -903,7 +902,7 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da ColumnMetaData col23 = new ColumnMetaData(); col23.setColIndex(23); col23.setColName("IS_AUTOINCREMENT"); - col23.setColType(Types.NCHAR); + col23.setColType(TSDBConstants.TSDB_DATA_TYPE_NCHAR); return col23; } @@ -911,7 +910,7 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da ColumnMetaData col24 = new ColumnMetaData(); col24.setColIndex(24); col24.setColName("IS_GENERATEDCOLUMN"); - col24.setColType(Types.NCHAR); + col24.setColType(TSDBConstants.TSDB_DATA_TYPE_NCHAR); return col24; } @@ -1205,7 +1204,7 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da ColumnMetaData col5 = new ColumnMetaData(); col5.setColIndex(colIndex); col5.setColName("KEY_SEQ"); - col5.setColType(Types.SMALLINT); + col5.setColType(TSDBConstants.TSDB_DATA_TYPE_SMALLINT); return col5; } @@ -1213,7 +1212,7 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da ColumnMetaData col6 = new ColumnMetaData(); col6.setColIndex(colIndex); col6.setColName("PK_NAME"); - col6.setColType(Types.NCHAR); + col6.setColType(TSDBConstants.TSDB_DATA_TYPE_NCHAR); return col6; } @@ -1275,7 +1274,7 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da ColumnMetaData col4 = new ColumnMetaData(); col4.setColIndex(colIndex); col4.setColName("SUPERTABLE_NAME"); - col4.setColType(Types.NCHAR); + col4.setColType(TSDBConstants.TSDB_DATA_TYPE_NCHAR); return col4; } diff --git a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/ColumnMetaData.java b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/ColumnMetaData.java index 14e75f0e09e3403e703658fb503019fefbb6156d..8398c8f84bb8b73b09cd6b7e3e2f27a20f28e8f7 100644 --- a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/ColumnMetaData.java +++ b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/ColumnMetaData.java @@ -16,7 +16,7 @@ package com.taosdata.jdbc; public class ColumnMetaData { - private int colType = 0; + private int colType = 0; //taosType private String colName = null; private int colSize = -1; private int colIndex = 0; diff --git a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/DatabaseMetaDataResultSet.java b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/DatabaseMetaDataResultSet.java index bda3d522123d09ece81384c6eba814c7e548e1ec..db4a5ccaa8fc15aa637363bc3f5e1b34c71dc5be 100644 --- a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/DatabaseMetaDataResultSet.java +++ b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/DatabaseMetaDataResultSet.java @@ -68,71 +68,61 @@ public class DatabaseMetaDataResultSet extends AbstractResultSet { @Override public String getString(int columnIndex) throws SQLException { int colType = columnMetaDataList.get(columnIndex - 1).getColType(); - int nativeType = TSDBConstants.jdbcType2TaosType(colType); - return rowCursor.getString(columnIndex, nativeType); + return rowCursor.getString(columnIndex, colType); } @Override public boolean getBoolean(int columnIndex) throws SQLException { int colType = columnMetaDataList.get(columnIndex - 1).getColType(); - int nativeType = TSDBConstants.jdbcType2TaosType(colType); - return rowCursor.getBoolean(columnIndex, nativeType); + return rowCursor.getBoolean(columnIndex, colType); } @Override public byte getByte(int columnIndex) throws SQLException { int colType = columnMetaDataList.get(columnIndex - 1).getColType(); - int nativeType = TSDBConstants.jdbcType2TaosType(colType); - return (byte) rowCursor.getInt(columnIndex, nativeType); + return (byte) rowCursor.getInt(columnIndex, colType); } @Override public short getShort(int columnIndex) throws SQLException { int colType = columnMetaDataList.get(columnIndex - 1).getColType(); - int nativeType = TSDBConstants.jdbcType2TaosType(colType); - return (short) rowCursor.getInt(columnIndex, nativeType); + return (short) rowCursor.getInt(columnIndex, colType); } @Override public int getInt(int columnIndex) throws SQLException { int colType = columnMetaDataList.get(columnIndex - 1).getColType(); - int nativeType = TSDBConstants.jdbcType2TaosType(colType); - return rowCursor.getInt(columnIndex, nativeType); + return rowCursor.getInt(columnIndex, colType); } @Override public long getLong(int columnIndex) throws SQLException { int colType = columnMetaDataList.get(columnIndex - 1).getColType(); - int nativeType = TSDBConstants.jdbcType2TaosType(colType); - return rowCursor.getLong(columnIndex, nativeType); + return rowCursor.getLong(columnIndex, colType); } @Override public float getFloat(int columnIndex) throws SQLException { int colType = columnMetaDataList.get(columnIndex - 1).getColType(); - int nativeType = TSDBConstants.jdbcType2TaosType(colType); - return rowCursor.getFloat(columnIndex, nativeType); + return rowCursor.getFloat(columnIndex, colType); } @Override public double getDouble(int columnIndex) throws SQLException { int colType = columnMetaDataList.get(columnIndex - 1).getColType(); - int nativeType = TSDBConstants.jdbcType2TaosType(colType); - return rowCursor.getDouble(columnIndex, nativeType); + return rowCursor.getDouble(columnIndex, colType); } @Override public byte[] getBytes(int columnIndex) throws SQLException { int colType = columnMetaDataList.get(columnIndex - 1).getColType(); - int nativeType = TSDBConstants.jdbcType2TaosType(colType); - return (rowCursor.getString(columnIndex, nativeType)).getBytes(); + return (rowCursor.getString(columnIndex, colType)).getBytes(); } @Override public Timestamp getTimestamp(int columnIndex) throws SQLException { int colType = columnMetaDataList.get(columnIndex - 1).getColType(); - int nativeType = TSDBConstants.jdbcType2TaosType(colType); - return rowCursor.getTimestamp(columnIndex, nativeType); + return rowCursor.getTimestamp(columnIndex, colType); } @Override @@ -158,8 +148,7 @@ public class DatabaseMetaDataResultSet extends AbstractResultSet { @Override public BigDecimal getBigDecimal(int columnIndex) throws SQLException { int colType = columnMetaDataList.get(columnIndex - 1).getColType(); - int nativeType = TSDBConstants.jdbcType2TaosType(colType); - double value = rowCursor.getDouble(columnIndex, nativeType); + double value = rowCursor.getDouble(columnIndex, colType); return new BigDecimal(value); } diff --git a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBConstants.java b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBConstants.java index 740e3c6c21be568bf71e4d68a3129c527da441a6..74a874513839fb076ce3f2dd9b2a6d0ecc72fb2e 100644 --- a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBConstants.java +++ b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBConstants.java @@ -129,8 +129,9 @@ public abstract class TSDBConstants { return Types.TIMESTAMP; case TSDBConstants.TSDB_DATA_TYPE_NCHAR: return Types.NCHAR; + default: + throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNKNOWN_TAOS_TYPE, "unknown taos type: " + taosType + " in tdengine"); } - throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNKNOWN_TAOS_TYPE); } public static String taosType2JdbcTypeName(int taosType) throws SQLException { @@ -160,7 +161,7 @@ public abstract class TSDBConstants { case TSDBConstants.TSDB_DATA_TYPE_NCHAR: return "NCHAR"; default: - throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNKNOWN_TAOS_TYPE); + throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNKNOWN_TAOS_TYPE, "unknown taos type: " + taosType + " in tdengine"); } } @@ -187,7 +188,7 @@ public abstract class TSDBConstants { case Types.NCHAR: return TSDBConstants.TSDB_DATA_TYPE_NCHAR; } - throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNKNOWN_SQL_TYPE_IN_TDENGINE); + throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNKNOWN_SQL_TYPE_IN_TDENGINE, "unknown sql type: " + jdbcType + " in tdengine"); } public static String jdbcType2TaosTypeName(int jdbcType) throws SQLException { @@ -213,7 +214,7 @@ public abstract class TSDBConstants { case Types.NCHAR: return "NCHAR"; default: - throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNKNOWN_SQL_TYPE_IN_TDENGINE); + throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNKNOWN_SQL_TYPE_IN_TDENGINE, "unknown sql type: " + jdbcType + " in tdengine"); } } diff --git a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBResultSetMetaData.java b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBResultSetMetaData.java index 6292673352529171cdc42ba73e0f47f8f05a21a4..f93384fcc7a9693c2b187498cdf0f60371d28fd0 100644 --- a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBResultSetMetaData.java +++ b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBResultSetMetaData.java @@ -110,7 +110,7 @@ public class TSDBResultSetMetaData extends WrapperImpl implements ResultSetMetaD ColumnMetaData columnMetaData = this.colMetaDataList.get(column - 1); switch (columnMetaData.getColType()) { - + case TSDBConstants.TSDB_DATA_TYPE_FLOAT: return 5; case TSDBConstants.TSDB_DATA_TYPE_DOUBLE: diff --git a/src/inc/taosdef.h b/src/inc/taosdef.h index 94be247b0d8163be09ffff981636258779b6bfca..5b96f0ebd91418f7b2bd4d5f2318ed5cf4da39bf 100644 --- a/src/inc/taosdef.h +++ b/src/inc/taosdef.h @@ -223,6 +223,7 @@ do { \ #define TSDB_IPv4ADDR_LEN 16 #define TSDB_FILENAME_LEN 128 #define TSDB_SHOW_SQL_LEN 512 +#define TSDB_SHOW_SUBQUERY_LEN 1000 #define TSDB_SLOW_QUERY_SQL_LEN 512 #define TSDB_STEP_NAME_LEN 32 diff --git a/src/inc/taosmsg.h b/src/inc/taosmsg.h index fb5bbe6c2d2442376f8937820822f654e1b41163..52162ea4b41ac176448df71a99965dd08216cfa2 100644 --- a/src/inc/taosmsg.h +++ b/src/inc/taosmsg.h @@ -877,7 +877,9 @@ typedef struct { uint64_t sqlObjId; int32_t pid; char fqdn[TSDB_FQDN_LEN]; + bool stableQuery; int32_t numOfSub; + char subSqlInfo[TSDB_SHOW_SUBQUERY_LEN]; //include subqueries' index, Obj IDs and states(C-complete/I-imcomplete) } SQueryDesc; typedef struct { diff --git a/src/mnode/src/mnodeProfile.c b/src/mnode/src/mnodeProfile.c index 2c117310b38632305463438e34d79dc1c439388d..15438fc234bb60089e9d0f52fe92eb5bf8b3eeae 100644 --- a/src/mnode/src/mnodeProfile.c +++ b/src/mnode/src/mnodeProfile.c @@ -32,7 +32,8 @@ #define CONN_KEEP_TIME (tsShellActivityTimer * 3) #define CONN_CHECK_TIME (tsShellActivityTimer * 2) #define QUERY_ID_SIZE 20 -#define QUERY_OBJ_ID_SIZE 10 +#define QUERY_OBJ_ID_SIZE 18 +#define SUBQUERY_INFO_SIZE 6 #define QUERY_STREAM_SAVE_SIZE 20 static SCacheObj *tsMnodeConnCache = NULL; @@ -380,12 +381,24 @@ static int32_t mnodeGetQueryMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pC pSchema[cols].bytes = htons(pShow->bytes[cols]); cols++; + pShow->bytes[cols] = 1; + pSchema[cols].type = TSDB_DATA_TYPE_BOOL; + strcpy(pSchema[cols].name, "stable_query"); + pSchema[cols].bytes = htons(pShow->bytes[cols]); + cols++; + pShow->bytes[cols] = 4; pSchema[cols].type = TSDB_DATA_TYPE_INT; strcpy(pSchema[cols].name, "sub_queries"); pSchema[cols].bytes = htons(pShow->bytes[cols]); cols++; + pShow->bytes[cols] = TSDB_SHOW_SUBQUERY_LEN + VARSTR_HEADER_SIZE; + pSchema[cols].type = TSDB_DATA_TYPE_BINARY; + strcpy(pSchema[cols].name, "sub_query_info"); + pSchema[cols].bytes = htons(pShow->bytes[cols]); + cols++; + pShow->bytes[cols] = TSDB_SHOW_SQL_LEN + VARSTR_HEADER_SIZE; pSchema[cols].type = TSDB_DATA_TYPE_BINARY; strcpy(pSchema[cols].name, "sql"); @@ -459,12 +472,8 @@ static int32_t mnodeRetrieveQueries(SShowObj *pShow, char *data, int32_t rows, v pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; *(int64_t *)pWrite = htobe64(pDesc->useconds); cols++; - /* - pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; - *(int64_t *)pWrite = htobe64(pDesc->sqlObjId); - cols++; - */ - snprintf(str, tListLen(str), "0x%08" PRIx64, htobe64(pDesc->sqlObjId)); + + snprintf(str, tListLen(str), "0x%" PRIx64, htobe64(pDesc->sqlObjId)); pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; STR_WITH_MAXSIZE_TO_VARSTR(pWrite, str, pShow->bytes[cols]); cols++; @@ -479,10 +488,18 @@ static int32_t mnodeRetrieveQueries(SShowObj *pShow, char *data, int32_t rows, v STR_WITH_MAXSIZE_TO_VARSTR(pWrite, epBuf, pShow->bytes[cols]); cols++; + pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; + *(bool *)pWrite = pDesc->stableQuery; + cols++; + pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; *(int32_t *)pWrite = htonl(pDesc->numOfSub); cols++; + pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; + STR_WITH_MAXSIZE_TO_VARSTR(pWrite, pDesc->subSqlInfo, pShow->bytes[cols]); + cols++; + pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; STR_WITH_MAXSIZE_TO_VARSTR(pWrite, pDesc->sql, pShow->bytes[cols]); cols++; diff --git a/tests/pytest/tag_lite/TestModifyTag.py b/tests/pytest/tag_lite/TestModifyTag.py new file mode 100644 index 0000000000000000000000000000000000000000..acf63695f6dcc52d2ae9df8cdead96802cd1f4b3 --- /dev/null +++ b/tests/pytest/tag_lite/TestModifyTag.py @@ -0,0 +1,125 @@ +################################################################### +# Copyright (c) 2016 by TAOS Technologies, Inc. +# All rights reserved. +# +# This file is proprietary and confidential to TAOS Technologies. +# No part of this file may be reproduced, stored, transmitted, +# disclosed or used in any form or by any means other than as +# expressly provided by the written permission from Jianhui Tao +# +################################################################### + +# -*- coding: utf-8 -*- + +import sys +import os +from util.log import * +from util.cases import * +from util.sql import * +from util.dnodes import * + + +class TDTestCase: + def init(self, conn, logSql): + tdLog.debug("start to execute %s" % __file__) + tdSql.init(conn.cursor(), logSql) + + self.ts = 1625068800000000000 # this is timestamp "2021-07-01 00:00:00" + self.numberOfTables = 10 + self.numberOfRecords = 100 + + def checkCommunity(self): + selfPath = os.path.dirname(os.path.realpath(__file__)) + if ("community" in selfPath): + return False + else: + return True + + def getBuildPath(self): + selfPath = os.path.dirname(os.path.realpath(__file__)) + + if ("community" in selfPath): + projPath = selfPath[:selfPath.find("community")] + else: + projPath = selfPath[:selfPath.find("tests")] + + for root, dirs, files in os.walk(projPath): + if ("taosdump" in files): + rootRealPath = os.path.dirname(os.path.realpath(root)) + if ("packaging" not in rootRealPath): + buildPath = root[:len(root) - len("/build/bin")] + break + return buildPath + + + + def run(self): + + buildPath = self.getBuildPath() + if (buildPath == ""): + tdLog.exit("taosdump not found!") + else: + tdLog.info("taosdump found in %s" % buildPath) + binPath = buildPath + "/build/bin/" + + # basic test for alter tags + tdSql.execute("create database tagdb ") + tdSql.execute(" use tagdb") + tdSql.execute("create table st (ts timestamp , a int) tags (tg1 binary(20), tg2 binary(20), tg3 binary(20))") + tdSql.execute("insert into t using st (tg3, tg2, tg1) tags ('tg3', 'tg2', 'tg1') values (now, 1)") + tdSql.execute("alter table t set tag tg1='newtg1'") + res = tdSql.getResult("select tg1,tg2,tg3 from t") + + if res == [('newtg1', 'tg2', 'tg3')]: + tdLog.info(" alter tag check has pass!") + else: + tdLog.info(" alter tag failed , please check !") + + tdSql.error("alter stable st modify tag tg2 binary(2)") + tdSql.execute("alter stable st modify tag tg2 binary(30) ") + tdSql.execute("alter table t set tag tg2 = 'abcdefghijklmnopqrstuvwxyz1234'") + res = tdSql.getResult("select tg1,tg2,tg3 from t") + if res == [('newtg1', 'abcdefghijklmnopqrstuvwxyz1234', 'tg3')]: + tdLog.info(" alter tag check has pass!") + else: + tdLog.info(" alter tag failed , please check !") + + # test boundary about tags + tdSql.execute("create stable stb1 (ts timestamp , a int) tags (tg1 binary(16374))") + tdSql.error("create stable stb1 (ts timestamp , a int) tags (tg1 binary(16375))") + bound_sql = "create stable stb2 (ts timestamp , a int) tags (tg1 binary(10)," + for i in range(127): + bound_sql+="tag"+str(i)+" binary(10)," + sql1 = bound_sql[:-1]+")" + tdSql.execute(sql1) + sql2 = bound_sql[:-1]+"tag127 binary(10))" + tdSql.error(sql2) + tdSql.execute("create stable stb3 (ts timestamp , a int) tags (tg1 nchar(4093))") + tdSql.error("create stable stb3 (ts timestamp , a int) tags (tg1 nchar(4094))") + tdSql.execute("create stable stb4 (ts timestamp , a int) tags (tg1 nchar(4093),tag2 binary(8))") + tdSql.error("create stable stb4 (ts timestamp , a int) tags (tg1 nchar(4093),tag2 binary(9))") + tdSql.execute("create stable stb5 (ts timestamp , a int) tags (tg1 nchar(4093),tag2 binary(4),tag3 binary(2))") + tdSql.error("create stable stb5 (ts timestamp , a int) tags (tg1 nchar(4093),tag2 binary(4),tag3 binary(3))") + + tdSql.execute("create table stt (ts timestamp , a binary(100)) tags (tg1 binary(20), tg2 binary(20), tg3 binary(20))") + tdSql.execute("insert into tt using stt (tg3, tg2, tg1) tags ('tg3', 'tg2', 'tg1') values (now, 1)") + tags = "t"*16337 + sql3 = "alter table tt set tag tg1=" +"'"+tags+"'" + tdSql.error(sql3) + tdSql.execute("alter stable stt modify tag tg1 binary(16337)") + tdSql.execute(sql3) + res = tdSql.getResult("select tg1,tg2,tg3 from tt") + if res == [(tags, 'tg2', 'tg3')]: + tdLog.info(" alter tag check has pass!") + else: + tdLog.info(" alter tag failed , please check !") + + os.system("rm -rf ./tag_lite/TestModifyTag.py.sql") + + def stop(self): + tdSql.close() + tdLog.success("%s successfully executed" % __file__) + + +tdCases.addWindows(__file__, TDTestCase()) +tdCases.addLinux(__file__, TDTestCase()) \ No newline at end of file