Merge branch '3.0' into feature/stream
This commit is contained in:
commit
739e7ae76f
|
@ -2,7 +2,7 @@
|
||||||
# taos-tools
|
# taos-tools
|
||||||
ExternalProject_Add(taos-tools
|
ExternalProject_Add(taos-tools
|
||||||
GIT_REPOSITORY https://github.com/taosdata/taos-tools.git
|
GIT_REPOSITORY https://github.com/taosdata/taos-tools.git
|
||||||
GIT_TAG 2460442
|
GIT_TAG 212c34d
|
||||||
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools"
|
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools"
|
||||||
BINARY_DIR ""
|
BINARY_DIR ""
|
||||||
#BUILD_IN_SOURCE TRUE
|
#BUILD_IN_SOURCE TRUE
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
# taosws-rs
|
# taosws-rs
|
||||||
ExternalProject_Add(taosws-rs
|
ExternalProject_Add(taosws-rs
|
||||||
GIT_REPOSITORY https://github.com/taosdata/taos-connector-rust.git
|
GIT_REPOSITORY https://github.com/taosdata/taos-connector-rust.git
|
||||||
GIT_TAG 7a54d21
|
GIT_TAG b91b39c
|
||||||
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taosws-rs"
|
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taosws-rs"
|
||||||
BINARY_DIR ""
|
BINARY_DIR ""
|
||||||
#BUILD_IN_SOURCE TRUE
|
#BUILD_IN_SOURCE TRUE
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
sidebar_label: 支持的数据类型
|
sidebar_label: 数据类型
|
||||||
title: 支持的数据类型
|
title: 数据类型
|
||||||
description: "TDengine 支持的数据类型: 时间戳、浮点型、JSON 类型等"
|
description: "TDengine 支持的数据类型: 时间戳、浮点型、JSON 类型等"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
sidebar_label: 数据库管理
|
sidebar_label: 数据库
|
||||||
title: 数据库管理
|
title: 数据库
|
||||||
description: "创建、删除数据库,查看、修改数据库参数"
|
description: "创建、删除数据库,查看、修改数据库参数"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
---
|
---
|
||||||
title: 表管理
|
title: 表
|
||||||
sidebar_label: 表
|
sidebar_label: 表
|
||||||
description: 对表的各种管理操作
|
description: 对表的各种管理操作
|
||||||
---
|
---
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
sidebar_label: 超级表管理
|
sidebar_label: 超级表
|
||||||
title: 超级表 STable 管理
|
title: 超级表
|
||||||
description: 对超级表的各种管理操作
|
description: 对超级表的各种管理操作
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
sidebar_label: 时序数据特色查询
|
sidebar_label: 特色查询
|
||||||
title: 时序数据特色查询
|
title: 特色查询
|
||||||
description: TDengine 提供的时序数据特有的查询功能
|
description: TDengine 提供的时序数据特有的查询功能
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
sidebar_label: JSON 类型使用说明
|
sidebar_label: JSON 类型
|
||||||
title: JSON 类型使用说明
|
title: JSON 类型
|
||||||
description: 对 JSON 类型如何使用的详细说明
|
description: 对 JSON 类型如何使用的详细说明
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
---
|
---
|
||||||
title: 转义字符说明
|
title: 转义字符
|
||||||
sidebar_label: 转义字符
|
sidebar_label: 转义字符
|
||||||
description: TDengine 中使用转义字符的详细规则
|
description: TDengine 中使用转义字符的详细规则
|
||||||
---
|
---
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
sidebar_label: 命名与边界限制
|
sidebar_label: 命名与边界
|
||||||
title: 命名与边界限制
|
title: 命名与边界
|
||||||
description: 合法字符集和命名中的限制规则
|
description: 合法字符集和命名中的限制规则
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
sidebar_label: 保留关键字
|
sidebar_label: 保留关键字
|
||||||
title: TDengine 保留关键字
|
title: 保留关键字
|
||||||
description: TDengine 保留关键字的详细列表
|
description: TDengine 保留关键字的详细列表
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
sidebar_label: 元数据
|
sidebar_label: 元数据
|
||||||
title: 存储元数据的 Information_Schema 数据库
|
title: 元数据
|
||||||
description: Information_Schema 数据库中存储了系统中所有的元数据信息
|
description: Information_Schema 数据库中存储了系统中所有的元数据信息
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
sidebar_label: 统计数据
|
sidebar_label: 统计数据
|
||||||
title: 存储统计数据的 Performance_Schema 数据库
|
title: 统计数据
|
||||||
description: Performance_Schema 数据库中存储了系统中的各种统计信息
|
description: Performance_Schema 数据库中存储了系统中的各种统计信息
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
sidebar_label: SHOW 命令
|
sidebar_label: SHOW 命令
|
||||||
title: 使用 SHOW 命令查看系统元数据
|
title: SHOW 命令
|
||||||
description: SHOW 命令的完整列表
|
description: SHOW 命令的完整列表
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
sidebar_label: 自定义函数
|
sidebar_label: 自定义函数
|
||||||
title: 用户自定义函数
|
title: 自定义函数
|
||||||
description: 使用 UDF 的详细指南
|
description: 使用 UDF 的详细指南
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
sidebar_label: 索引
|
sidebar_label: 索引
|
||||||
title: 使用索引
|
title: 索引
|
||||||
description: 索引功能的使用细节
|
description: 索引功能的使用细节
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
sidebar_label: 3.0 版本语法变更
|
sidebar_label: 语法变更
|
||||||
title: 3.0 版本语法变更
|
title: 语法变更
|
||||||
description: "TDengine 3.0 版本的语法变更说明"
|
description: "TDengine 3.0 版本的语法变更说明"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
@ -784,6 +784,7 @@ typedef struct {
|
||||||
int64_t walRetentionSize;
|
int64_t walRetentionSize;
|
||||||
int32_t walRollPeriod;
|
int32_t walRollPeriod;
|
||||||
int64_t walSegmentSize;
|
int64_t walSegmentSize;
|
||||||
|
int32_t sstTrigger;
|
||||||
} SCreateDbReq;
|
} SCreateDbReq;
|
||||||
|
|
||||||
int32_t tSerializeSCreateDbReq(void* buf, int32_t bufLen, SCreateDbReq* pReq);
|
int32_t tSerializeSCreateDbReq(void* buf, int32_t bufLen, SCreateDbReq* pReq);
|
||||||
|
@ -805,6 +806,7 @@ typedef struct {
|
||||||
int8_t strict;
|
int8_t strict;
|
||||||
int8_t cacheLast;
|
int8_t cacheLast;
|
||||||
int8_t replications;
|
int8_t replications;
|
||||||
|
int32_t sstTrigger;
|
||||||
} SAlterDbReq;
|
} SAlterDbReq;
|
||||||
|
|
||||||
int32_t tSerializeSAlterDbReq(void* buf, int32_t bufLen, SAlterDbReq* pReq);
|
int32_t tSerializeSAlterDbReq(void* buf, int32_t bufLen, SAlterDbReq* pReq);
|
||||||
|
@ -2069,9 +2071,9 @@ int32_t tDeserializeSVCreateTbBatchRsp(void* buf, int32_t bufLen, SVCreateTbBatc
|
||||||
|
|
||||||
// TDMT_VND_DROP_TABLE =================
|
// TDMT_VND_DROP_TABLE =================
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char* name;
|
char* name;
|
||||||
uint64_t suid; // for tmq in wal format
|
uint64_t suid; // for tmq in wal format
|
||||||
int8_t igNotExists;
|
int8_t igNotExists;
|
||||||
} SVDropTbReq;
|
} SVDropTbReq;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -102,224 +102,225 @@
|
||||||
#define TK_WAL_RETENTION_SIZE 84
|
#define TK_WAL_RETENTION_SIZE 84
|
||||||
#define TK_WAL_ROLL_PERIOD 85
|
#define TK_WAL_ROLL_PERIOD 85
|
||||||
#define TK_WAL_SEGMENT_SIZE 86
|
#define TK_WAL_SEGMENT_SIZE 86
|
||||||
#define TK_NK_COLON 87
|
#define TK_SST_TRIGGER 87
|
||||||
#define TK_TABLE 88
|
#define TK_NK_COLON 88
|
||||||
#define TK_NK_LP 89
|
#define TK_TABLE 89
|
||||||
#define TK_NK_RP 90
|
#define TK_NK_LP 90
|
||||||
#define TK_STABLE 91
|
#define TK_NK_RP 91
|
||||||
#define TK_ADD 92
|
#define TK_STABLE 92
|
||||||
#define TK_COLUMN 93
|
#define TK_ADD 93
|
||||||
#define TK_MODIFY 94
|
#define TK_COLUMN 94
|
||||||
#define TK_RENAME 95
|
#define TK_MODIFY 95
|
||||||
#define TK_TAG 96
|
#define TK_RENAME 96
|
||||||
#define TK_SET 97
|
#define TK_TAG 97
|
||||||
#define TK_NK_EQ 98
|
#define TK_SET 98
|
||||||
#define TK_USING 99
|
#define TK_NK_EQ 99
|
||||||
#define TK_TAGS 100
|
#define TK_USING 100
|
||||||
#define TK_COMMENT 101
|
#define TK_TAGS 101
|
||||||
#define TK_BOOL 102
|
#define TK_COMMENT 102
|
||||||
#define TK_TINYINT 103
|
#define TK_BOOL 103
|
||||||
#define TK_SMALLINT 104
|
#define TK_TINYINT 104
|
||||||
#define TK_INT 105
|
#define TK_SMALLINT 105
|
||||||
#define TK_INTEGER 106
|
#define TK_INT 106
|
||||||
#define TK_BIGINT 107
|
#define TK_INTEGER 107
|
||||||
#define TK_FLOAT 108
|
#define TK_BIGINT 108
|
||||||
#define TK_DOUBLE 109
|
#define TK_FLOAT 109
|
||||||
#define TK_BINARY 110
|
#define TK_DOUBLE 110
|
||||||
#define TK_TIMESTAMP 111
|
#define TK_BINARY 111
|
||||||
#define TK_NCHAR 112
|
#define TK_TIMESTAMP 112
|
||||||
#define TK_UNSIGNED 113
|
#define TK_NCHAR 113
|
||||||
#define TK_JSON 114
|
#define TK_UNSIGNED 114
|
||||||
#define TK_VARCHAR 115
|
#define TK_JSON 115
|
||||||
#define TK_MEDIUMBLOB 116
|
#define TK_VARCHAR 116
|
||||||
#define TK_BLOB 117
|
#define TK_MEDIUMBLOB 117
|
||||||
#define TK_VARBINARY 118
|
#define TK_BLOB 118
|
||||||
#define TK_DECIMAL 119
|
#define TK_VARBINARY 119
|
||||||
#define TK_MAX_DELAY 120
|
#define TK_DECIMAL 120
|
||||||
#define TK_WATERMARK 121
|
#define TK_MAX_DELAY 121
|
||||||
#define TK_ROLLUP 122
|
#define TK_WATERMARK 122
|
||||||
#define TK_TTL 123
|
#define TK_ROLLUP 123
|
||||||
#define TK_SMA 124
|
#define TK_TTL 124
|
||||||
#define TK_FIRST 125
|
#define TK_SMA 125
|
||||||
#define TK_LAST 126
|
#define TK_FIRST 126
|
||||||
#define TK_SHOW 127
|
#define TK_LAST 127
|
||||||
#define TK_DATABASES 128
|
#define TK_SHOW 128
|
||||||
#define TK_TABLES 129
|
#define TK_DATABASES 129
|
||||||
#define TK_STABLES 130
|
#define TK_TABLES 130
|
||||||
#define TK_MNODES 131
|
#define TK_STABLES 131
|
||||||
#define TK_MODULES 132
|
#define TK_MNODES 132
|
||||||
#define TK_QNODES 133
|
#define TK_MODULES 133
|
||||||
#define TK_FUNCTIONS 134
|
#define TK_QNODES 134
|
||||||
#define TK_INDEXES 135
|
#define TK_FUNCTIONS 135
|
||||||
#define TK_ACCOUNTS 136
|
#define TK_INDEXES 136
|
||||||
#define TK_APPS 137
|
#define TK_ACCOUNTS 137
|
||||||
#define TK_CONNECTIONS 138
|
#define TK_APPS 138
|
||||||
#define TK_LICENCES 139
|
#define TK_CONNECTIONS 139
|
||||||
#define TK_GRANTS 140
|
#define TK_LICENCES 140
|
||||||
#define TK_QUERIES 141
|
#define TK_GRANTS 141
|
||||||
#define TK_SCORES 142
|
#define TK_QUERIES 142
|
||||||
#define TK_TOPICS 143
|
#define TK_SCORES 143
|
||||||
#define TK_VARIABLES 144
|
#define TK_TOPICS 144
|
||||||
#define TK_BNODES 145
|
#define TK_VARIABLES 145
|
||||||
#define TK_SNODES 146
|
#define TK_BNODES 146
|
||||||
#define TK_CLUSTER 147
|
#define TK_SNODES 147
|
||||||
#define TK_TRANSACTIONS 148
|
#define TK_CLUSTER 148
|
||||||
#define TK_DISTRIBUTED 149
|
#define TK_TRANSACTIONS 149
|
||||||
#define TK_CONSUMERS 150
|
#define TK_DISTRIBUTED 150
|
||||||
#define TK_SUBSCRIPTIONS 151
|
#define TK_CONSUMERS 151
|
||||||
#define TK_LIKE 152
|
#define TK_SUBSCRIPTIONS 152
|
||||||
#define TK_INDEX 153
|
#define TK_VNODES 153
|
||||||
#define TK_FUNCTION 154
|
#define TK_LIKE 154
|
||||||
#define TK_INTERVAL 155
|
#define TK_INDEX 155
|
||||||
#define TK_TOPIC 156
|
#define TK_FUNCTION 156
|
||||||
#define TK_AS 157
|
#define TK_INTERVAL 157
|
||||||
#define TK_WITH 158
|
#define TK_TOPIC 158
|
||||||
#define TK_META 159
|
#define TK_AS 159
|
||||||
#define TK_CONSUMER 160
|
#define TK_WITH 160
|
||||||
#define TK_GROUP 161
|
#define TK_META 161
|
||||||
#define TK_DESC 162
|
#define TK_CONSUMER 162
|
||||||
#define TK_DESCRIBE 163
|
#define TK_GROUP 163
|
||||||
#define TK_RESET 164
|
#define TK_DESC 164
|
||||||
#define TK_QUERY 165
|
#define TK_DESCRIBE 165
|
||||||
#define TK_CACHE 166
|
#define TK_RESET 166
|
||||||
#define TK_EXPLAIN 167
|
#define TK_QUERY 167
|
||||||
#define TK_ANALYZE 168
|
#define TK_CACHE 168
|
||||||
#define TK_VERBOSE 169
|
#define TK_EXPLAIN 169
|
||||||
#define TK_NK_BOOL 170
|
#define TK_ANALYZE 170
|
||||||
#define TK_RATIO 171
|
#define TK_VERBOSE 171
|
||||||
#define TK_NK_FLOAT 172
|
#define TK_NK_BOOL 172
|
||||||
#define TK_OUTPUTTYPE 173
|
#define TK_RATIO 173
|
||||||
#define TK_AGGREGATE 174
|
#define TK_NK_FLOAT 174
|
||||||
#define TK_BUFSIZE 175
|
#define TK_OUTPUTTYPE 175
|
||||||
#define TK_STREAM 176
|
#define TK_AGGREGATE 176
|
||||||
#define TK_INTO 177
|
#define TK_BUFSIZE 177
|
||||||
#define TK_TRIGGER 178
|
#define TK_STREAM 178
|
||||||
#define TK_AT_ONCE 179
|
#define TK_INTO 179
|
||||||
#define TK_WINDOW_CLOSE 180
|
#define TK_TRIGGER 180
|
||||||
#define TK_IGNORE 181
|
#define TK_AT_ONCE 181
|
||||||
#define TK_EXPIRED 182
|
#define TK_WINDOW_CLOSE 182
|
||||||
#define TK_KILL 183
|
#define TK_IGNORE 183
|
||||||
#define TK_CONNECTION 184
|
#define TK_EXPIRED 184
|
||||||
#define TK_TRANSACTION 185
|
#define TK_KILL 185
|
||||||
#define TK_BALANCE 186
|
#define TK_CONNECTION 186
|
||||||
#define TK_VGROUP 187
|
#define TK_TRANSACTION 187
|
||||||
#define TK_MERGE 188
|
#define TK_BALANCE 188
|
||||||
#define TK_REDISTRIBUTE 189
|
#define TK_VGROUP 189
|
||||||
#define TK_SPLIT 190
|
#define TK_MERGE 190
|
||||||
#define TK_DELETE 191
|
#define TK_REDISTRIBUTE 191
|
||||||
#define TK_INSERT 192
|
#define TK_SPLIT 192
|
||||||
#define TK_NULL 193
|
#define TK_DELETE 193
|
||||||
#define TK_NK_QUESTION 194
|
#define TK_INSERT 194
|
||||||
#define TK_NK_ARROW 195
|
#define TK_NULL 195
|
||||||
#define TK_ROWTS 196
|
#define TK_NK_QUESTION 196
|
||||||
#define TK_TBNAME 197
|
#define TK_NK_ARROW 197
|
||||||
#define TK_QSTART 198
|
#define TK_ROWTS 198
|
||||||
#define TK_QEND 199
|
#define TK_TBNAME 199
|
||||||
#define TK_QDURATION 200
|
#define TK_QSTART 200
|
||||||
#define TK_WSTART 201
|
#define TK_QEND 201
|
||||||
#define TK_WEND 202
|
#define TK_QDURATION 202
|
||||||
#define TK_WDURATION 203
|
#define TK_WSTART 203
|
||||||
#define TK_CAST 204
|
#define TK_WEND 204
|
||||||
#define TK_NOW 205
|
#define TK_WDURATION 205
|
||||||
#define TK_TODAY 206
|
#define TK_CAST 206
|
||||||
#define TK_TIMEZONE 207
|
#define TK_NOW 207
|
||||||
#define TK_CLIENT_VERSION 208
|
#define TK_TODAY 208
|
||||||
#define TK_SERVER_VERSION 209
|
#define TK_TIMEZONE 209
|
||||||
#define TK_SERVER_STATUS 210
|
#define TK_CLIENT_VERSION 210
|
||||||
#define TK_CURRENT_USER 211
|
#define TK_SERVER_VERSION 211
|
||||||
#define TK_COUNT 212
|
#define TK_SERVER_STATUS 212
|
||||||
#define TK_LAST_ROW 213
|
#define TK_CURRENT_USER 213
|
||||||
#define TK_BETWEEN 214
|
#define TK_COUNT 214
|
||||||
#define TK_IS 215
|
#define TK_LAST_ROW 215
|
||||||
#define TK_NK_LT 216
|
#define TK_BETWEEN 216
|
||||||
#define TK_NK_GT 217
|
#define TK_IS 217
|
||||||
#define TK_NK_LE 218
|
#define TK_NK_LT 218
|
||||||
#define TK_NK_GE 219
|
#define TK_NK_GT 219
|
||||||
#define TK_NK_NE 220
|
#define TK_NK_LE 220
|
||||||
#define TK_MATCH 221
|
#define TK_NK_GE 221
|
||||||
#define TK_NMATCH 222
|
#define TK_NK_NE 222
|
||||||
#define TK_CONTAINS 223
|
#define TK_MATCH 223
|
||||||
#define TK_IN 224
|
#define TK_NMATCH 224
|
||||||
#define TK_JOIN 225
|
#define TK_CONTAINS 225
|
||||||
#define TK_INNER 226
|
#define TK_IN 226
|
||||||
#define TK_SELECT 227
|
#define TK_JOIN 227
|
||||||
#define TK_DISTINCT 228
|
#define TK_INNER 228
|
||||||
#define TK_WHERE 229
|
#define TK_SELECT 229
|
||||||
#define TK_PARTITION 230
|
#define TK_DISTINCT 230
|
||||||
#define TK_BY 231
|
#define TK_WHERE 231
|
||||||
#define TK_SESSION 232
|
#define TK_PARTITION 232
|
||||||
#define TK_STATE_WINDOW 233
|
#define TK_BY 233
|
||||||
#define TK_SLIDING 234
|
#define TK_SESSION 234
|
||||||
#define TK_FILL 235
|
#define TK_STATE_WINDOW 235
|
||||||
#define TK_VALUE 236
|
#define TK_SLIDING 236
|
||||||
#define TK_NONE 237
|
#define TK_FILL 237
|
||||||
#define TK_PREV 238
|
#define TK_VALUE 238
|
||||||
#define TK_LINEAR 239
|
#define TK_NONE 239
|
||||||
#define TK_NEXT 240
|
#define TK_PREV 240
|
||||||
#define TK_HAVING 241
|
#define TK_LINEAR 241
|
||||||
#define TK_RANGE 242
|
#define TK_NEXT 242
|
||||||
#define TK_EVERY 243
|
#define TK_HAVING 243
|
||||||
#define TK_ORDER 244
|
#define TK_RANGE 244
|
||||||
#define TK_SLIMIT 245
|
#define TK_EVERY 245
|
||||||
#define TK_SOFFSET 246
|
#define TK_ORDER 246
|
||||||
#define TK_LIMIT 247
|
#define TK_SLIMIT 247
|
||||||
#define TK_OFFSET 248
|
#define TK_SOFFSET 248
|
||||||
#define TK_ASC 249
|
#define TK_LIMIT 249
|
||||||
#define TK_NULLS 250
|
#define TK_OFFSET 250
|
||||||
#define TK_ABORT 251
|
#define TK_ASC 251
|
||||||
#define TK_AFTER 252
|
#define TK_NULLS 252
|
||||||
#define TK_ATTACH 253
|
#define TK_ABORT 253
|
||||||
#define TK_BEFORE 254
|
#define TK_AFTER 254
|
||||||
#define TK_BEGIN 255
|
#define TK_ATTACH 255
|
||||||
#define TK_BITAND 256
|
#define TK_BEFORE 256
|
||||||
#define TK_BITNOT 257
|
#define TK_BEGIN 257
|
||||||
#define TK_BITOR 258
|
#define TK_BITAND 258
|
||||||
#define TK_BLOCKS 259
|
#define TK_BITNOT 259
|
||||||
#define TK_CHANGE 260
|
#define TK_BITOR 260
|
||||||
#define TK_COMMA 261
|
#define TK_BLOCKS 261
|
||||||
#define TK_COMPACT 262
|
#define TK_CHANGE 262
|
||||||
#define TK_CONCAT 263
|
#define TK_COMMA 263
|
||||||
#define TK_CONFLICT 264
|
#define TK_COMPACT 264
|
||||||
#define TK_COPY 265
|
#define TK_CONCAT 265
|
||||||
#define TK_DEFERRED 266
|
#define TK_CONFLICT 266
|
||||||
#define TK_DELIMITERS 267
|
#define TK_COPY 267
|
||||||
#define TK_DETACH 268
|
#define TK_DEFERRED 268
|
||||||
#define TK_DIVIDE 269
|
#define TK_DELIMITERS 269
|
||||||
#define TK_DOT 270
|
#define TK_DETACH 270
|
||||||
#define TK_EACH 271
|
#define TK_DIVIDE 271
|
||||||
#define TK_END 272
|
#define TK_DOT 272
|
||||||
#define TK_FAIL 273
|
#define TK_EACH 273
|
||||||
#define TK_FILE 274
|
#define TK_END 274
|
||||||
#define TK_FOR 275
|
#define TK_FAIL 275
|
||||||
#define TK_GLOB 276
|
#define TK_FILE 276
|
||||||
#define TK_ID 277
|
#define TK_FOR 277
|
||||||
#define TK_IMMEDIATE 278
|
#define TK_GLOB 278
|
||||||
#define TK_IMPORT 279
|
#define TK_ID 279
|
||||||
#define TK_INITIALLY 280
|
#define TK_IMMEDIATE 280
|
||||||
#define TK_INSTEAD 281
|
#define TK_IMPORT 281
|
||||||
#define TK_ISNULL 282
|
#define TK_INITIALLY 282
|
||||||
#define TK_KEY 283
|
#define TK_INSTEAD 283
|
||||||
#define TK_NK_BITNOT 284
|
#define TK_ISNULL 284
|
||||||
#define TK_NK_SEMI 285
|
#define TK_KEY 285
|
||||||
#define TK_NOTNULL 286
|
#define TK_NK_BITNOT 286
|
||||||
#define TK_OF 287
|
#define TK_NK_SEMI 287
|
||||||
#define TK_PLUS 288
|
#define TK_NOTNULL 288
|
||||||
#define TK_PRIVILEGE 289
|
#define TK_OF 289
|
||||||
#define TK_RAISE 290
|
#define TK_PLUS 290
|
||||||
#define TK_REPLACE 291
|
#define TK_PRIVILEGE 291
|
||||||
#define TK_RESTRICT 292
|
#define TK_RAISE 292
|
||||||
#define TK_ROW 293
|
#define TK_REPLACE 293
|
||||||
#define TK_SEMI 294
|
#define TK_RESTRICT 294
|
||||||
#define TK_STAR 295
|
#define TK_ROW 295
|
||||||
#define TK_STATEMENT 296
|
#define TK_SEMI 296
|
||||||
#define TK_STRING 297
|
#define TK_STAR 297
|
||||||
#define TK_TIMES 298
|
#define TK_STATEMENT 298
|
||||||
#define TK_UPDATE 299
|
#define TK_STRING 299
|
||||||
#define TK_VALUES 300
|
#define TK_TIMES 300
|
||||||
#define TK_VARIABLE 301
|
#define TK_UPDATE 301
|
||||||
#define TK_VIEW 302
|
#define TK_VALUES 302
|
||||||
#define TK_VNODES 303
|
#define TK_VARIABLE 303
|
||||||
#define TK_WAL 304
|
#define TK_VIEW 304
|
||||||
|
#define TK_WAL 305
|
||||||
|
|
||||||
#define TK_NK_SPACE 300
|
#define TK_NK_SPACE 300
|
||||||
#define TK_NK_COMMENT 301
|
#define TK_NK_COMMENT 301
|
||||||
|
|
|
@ -78,6 +78,10 @@ typedef struct SDatabaseOptions {
|
||||||
int32_t walRetentionSize;
|
int32_t walRetentionSize;
|
||||||
int32_t walRollPeriod;
|
int32_t walRollPeriod;
|
||||||
int32_t walSegmentSize;
|
int32_t walSegmentSize;
|
||||||
|
bool walRetentionPeriodIsSet;
|
||||||
|
bool walRetentionSizeIsSet;
|
||||||
|
bool walRollPeriodIsSet;
|
||||||
|
int32_t sstTrigger;
|
||||||
} SDatabaseOptions;
|
} SDatabaseOptions;
|
||||||
|
|
||||||
typedef struct SCreateDatabaseStmt {
|
typedef struct SCreateDatabaseStmt {
|
||||||
|
@ -268,6 +272,12 @@ typedef struct SShowDnodeVariablesStmt {
|
||||||
SNode* pDnodeId;
|
SNode* pDnodeId;
|
||||||
} SShowDnodeVariablesStmt;
|
} SShowDnodeVariablesStmt;
|
||||||
|
|
||||||
|
typedef struct SShowVnodesStmt {
|
||||||
|
ENodeType type;
|
||||||
|
SNode* pDnodeId;
|
||||||
|
SNode* pDnodeEndpoint;
|
||||||
|
} SShowVnodesStmt;
|
||||||
|
|
||||||
typedef enum EIndexType { INDEX_TYPE_SMA = 1, INDEX_TYPE_FULLTEXT } EIndexType;
|
typedef enum EIndexType { INDEX_TYPE_SMA = 1, INDEX_TYPE_FULLTEXT } EIndexType;
|
||||||
|
|
||||||
typedef struct SIndexOptions {
|
typedef struct SIndexOptions {
|
||||||
|
|
|
@ -183,12 +183,12 @@ typedef enum ENodeType {
|
||||||
QUERY_NODE_SHOW_DNODE_VARIABLES_STMT,
|
QUERY_NODE_SHOW_DNODE_VARIABLES_STMT,
|
||||||
QUERY_NODE_SHOW_TRANSACTIONS_STMT,
|
QUERY_NODE_SHOW_TRANSACTIONS_STMT,
|
||||||
QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT,
|
QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT,
|
||||||
|
QUERY_NODE_SHOW_VNODES_STMT,
|
||||||
QUERY_NODE_SHOW_CREATE_DATABASE_STMT,
|
QUERY_NODE_SHOW_CREATE_DATABASE_STMT,
|
||||||
QUERY_NODE_SHOW_CREATE_TABLE_STMT,
|
QUERY_NODE_SHOW_CREATE_TABLE_STMT,
|
||||||
QUERY_NODE_SHOW_CREATE_STABLE_STMT,
|
QUERY_NODE_SHOW_CREATE_STABLE_STMT,
|
||||||
QUERY_NODE_SHOW_TABLE_DISTRIBUTED_STMT,
|
QUERY_NODE_SHOW_TABLE_DISTRIBUTED_STMT,
|
||||||
QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT,
|
QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT,
|
||||||
QUERY_NODE_SHOW_VNODES_STMT,
|
|
||||||
QUERY_NODE_SHOW_SCORES_STMT,
|
QUERY_NODE_SHOW_SCORES_STMT,
|
||||||
QUERY_NODE_KILL_CONNECTION_STMT,
|
QUERY_NODE_KILL_CONNECTION_STMT,
|
||||||
QUERY_NODE_KILL_QUERY_STMT,
|
QUERY_NODE_KILL_QUERY_STMT,
|
||||||
|
|
|
@ -56,6 +56,7 @@ void taosRemoveDir(const char *dirname);
|
||||||
bool taosDirExist(const char *dirname);
|
bool taosDirExist(const char *dirname);
|
||||||
int32_t taosMkDir(const char *dirname);
|
int32_t taosMkDir(const char *dirname);
|
||||||
int32_t taosMulMkDir(const char *dirname);
|
int32_t taosMulMkDir(const char *dirname);
|
||||||
|
int32_t taosMulModeMkDir(const char *dirname, int mode);
|
||||||
void taosRemoveOldFiles(const char *dirname, int32_t keepDays);
|
void taosRemoveOldFiles(const char *dirname, int32_t keepDays);
|
||||||
int32_t taosExpandDir(const char *dirname, char *outname, int32_t maxlen);
|
int32_t taosExpandDir(const char *dirname, char *outname, int32_t maxlen);
|
||||||
int32_t taosRealPath(char *dirname, char *realPath, int32_t maxlen);
|
int32_t taosRealPath(char *dirname, char *realPath, int32_t maxlen);
|
||||||
|
|
|
@ -359,15 +359,21 @@ typedef enum ELogicConditionType {
|
||||||
#define TSDB_DB_SCHEMALESS_ON 1
|
#define TSDB_DB_SCHEMALESS_ON 1
|
||||||
#define TSDB_DB_SCHEMALESS_OFF 0
|
#define TSDB_DB_SCHEMALESS_OFF 0
|
||||||
#define TSDB_DEFAULT_DB_SCHEMALESS TSDB_DB_SCHEMALESS_OFF
|
#define TSDB_DEFAULT_DB_SCHEMALESS TSDB_DB_SCHEMALESS_OFF
|
||||||
|
#define TSDB_MIN_SST_TRIGGER 1
|
||||||
|
#define TSDB_MAX_SST_TRIGGER 128
|
||||||
|
#define TSDB_DEFAULT_SST_TRIGGER 8
|
||||||
|
|
||||||
#define TSDB_DB_MIN_WAL_RETENTION_PERIOD -1
|
#define TSDB_DB_MIN_WAL_RETENTION_PERIOD -1
|
||||||
#define TSDB_DEFAULT_DB_WAL_RETENTION_PERIOD (24 * 60 * 60 * 4)
|
#define TSDB_REP_DEF_DB_WAL_RET_PERIOD 0
|
||||||
#define TSDB_DB_MIN_WAL_RETENTION_SIZE -1
|
#define TSDB_REPS_DEF_DB_WAL_RET_PERIOD (24 * 60 * 60 * 4)
|
||||||
#define TSDB_DEFAULT_DB_WAL_RETENTION_SIZE -1
|
#define TSDB_DB_MIN_WAL_RETENTION_SIZE -1
|
||||||
#define TSDB_DB_MIN_WAL_ROLL_PERIOD 0
|
#define TSDB_REP_DEF_DB_WAL_RET_SIZE 0
|
||||||
#define TSDB_DEFAULT_DB_WAL_ROLL_PERIOD (24 * 60 * 60 * 1)
|
#define TSDB_REPS_DEF_DB_WAL_RET_SIZE -1
|
||||||
#define TSDB_DB_MIN_WAL_SEGMENT_SIZE 0
|
#define TSDB_DB_MIN_WAL_ROLL_PERIOD 0
|
||||||
#define TSDB_DEFAULT_DB_WAL_SEGMENT_SIZE 0
|
#define TSDB_REP_DEF_DB_WAL_ROLL_PERIOD 0
|
||||||
|
#define TSDB_REPS_DEF_DB_WAL_ROLL_PERIOD (24 * 60 * 60 * 1)
|
||||||
|
#define TSDB_DB_MIN_WAL_SEGMENT_SIZE 0
|
||||||
|
#define TSDB_DEFAULT_DB_WAL_SEGMENT_SIZE 0
|
||||||
|
|
||||||
#define TSDB_MIN_ROLLUP_MAX_DELAY 1 // unit millisecond
|
#define TSDB_MIN_ROLLUP_MAX_DELAY 1 // unit millisecond
|
||||||
#define TSDB_MAX_ROLLUP_MAX_DELAY (15 * 60 * 1000)
|
#define TSDB_MAX_ROLLUP_MAX_DELAY (15 * 60 * 1000)
|
||||||
|
@ -386,7 +392,7 @@ typedef enum ELogicConditionType {
|
||||||
|
|
||||||
#define TSDB_DEFAULT_EXPLAIN_VERBOSE false
|
#define TSDB_DEFAULT_EXPLAIN_VERBOSE false
|
||||||
|
|
||||||
#define TSDB_EXPLAIN_RESULT_ROW_SIZE (16*1024)
|
#define TSDB_EXPLAIN_RESULT_ROW_SIZE (16 * 1024)
|
||||||
#define TSDB_EXPLAIN_RESULT_COLUMN_NAME "QUERY_PLAN"
|
#define TSDB_EXPLAIN_RESULT_COLUMN_NAME "QUERY_PLAN"
|
||||||
|
|
||||||
#define TSDB_MAX_FIELD_LEN 16384
|
#define TSDB_MAX_FIELD_LEN 16384
|
||||||
|
|
|
@ -45,6 +45,7 @@ mkdir -p ${pkg_dir}${install_home_path}/include
|
||||||
mkdir -p ${pkg_dir}${install_home_path}/script
|
mkdir -p ${pkg_dir}${install_home_path}/script
|
||||||
|
|
||||||
cp ${compile_dir}/../packaging/cfg/taos.cfg ${pkg_dir}${install_home_path}/cfg
|
cp ${compile_dir}/../packaging/cfg/taos.cfg ${pkg_dir}${install_home_path}/cfg
|
||||||
|
cp ${compile_dir}/../packaging/cfg/taosd.service ${pkg_dir}${install_home_path}/cfg
|
||||||
if [ -f "${compile_dir}/test/cfg/taosadapter.toml" ]; then
|
if [ -f "${compile_dir}/test/cfg/taosadapter.toml" ]; then
|
||||||
cp ${compile_dir}/test/cfg/taosadapter.toml ${pkg_dir}${install_home_path}/cfg || :
|
cp ${compile_dir}/test/cfg/taosadapter.toml ${pkg_dir}${install_home_path}/cfg || :
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -537,7 +537,7 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) {
|
||||||
|
|
||||||
code = smlSendMetaMsg(info, &pName, pColumns, pTags, pTableMeta, action);
|
code = smlSendMetaMsg(info, &pName, pColumns, pTags, pTableMeta, action);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
uError("SML:0x%" PRIx64 " smlSendMetaMsg failed. can not create %s", info->id, superTable);
|
uError("SML:0x%" PRIx64 " smlSendMetaMsg failed. can not create %s", info->id, pName.tname);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -555,7 +555,7 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) {
|
||||||
|
|
||||||
code = catalogGetSTableMeta(info->pCatalog, &conn, &pName, &pTableMeta);
|
code = catalogGetSTableMeta(info->pCatalog, &conn, &pName, &pTableMeta);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
uError("SML:0x%" PRIx64 " catalogGetSTableMeta failed. super table name %s", info->id, (char *)superTable);
|
uError("SML:0x%" PRIx64 " catalogGetSTableMeta failed. super table name %s", info->id, pName.tname);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -563,12 +563,12 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) {
|
||||||
code = smlCheckMeta(&(pTableMeta->schema[pTableMeta->tableInfo.numOfColumns]), pTableMeta->tableInfo.numOfTags,
|
code = smlCheckMeta(&(pTableMeta->schema[pTableMeta->tableInfo.numOfColumns]), pTableMeta->tableInfo.numOfTags,
|
||||||
sTableData->tags, true);
|
sTableData->tags, true);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
uError("SML:0x%" PRIx64 " check tag failed. super table name %s", info->id, (char *)superTable);
|
uError("SML:0x%" PRIx64 " check tag failed. super table name %s", info->id, pName.tname);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
code = smlCheckMeta(&(pTableMeta->schema[0]), pTableMeta->tableInfo.numOfColumns, sTableData->cols, false);
|
code = smlCheckMeta(&(pTableMeta->schema[0]), pTableMeta->tableInfo.numOfColumns, sTableData->cols, false);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
uError("SML:0x%" PRIx64 " check cols failed. super table name %s", info->id, (char *)superTable);
|
uError("SML:0x%" PRIx64 " check cols failed. super table name %s", info->id, pName.tname);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1559,7 +1559,7 @@ cleanup:
|
||||||
|
|
||||||
/************* TSDB_SML_JSON_PROTOCOL function start **************/
|
/************* TSDB_SML_JSON_PROTOCOL function start **************/
|
||||||
static int32_t smlJsonCreateSring(const char **output, char *input, int32_t inputLen) {
|
static int32_t smlJsonCreateSring(const char **output, char *input, int32_t inputLen) {
|
||||||
*output = (const char *)taosMemoryMalloc(inputLen);
|
*output = (const char *)taosMemoryCalloc(1, inputLen);
|
||||||
if (*output == NULL) {
|
if (*output == NULL) {
|
||||||
return TSDB_CODE_TSC_OUT_OF_MEMORY;
|
return TSDB_CODE_TSC_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
@ -2450,9 +2450,11 @@ static void smlInsertCallback(void *param, void *res, int32_t code) {
|
||||||
uDebug("SML:0x%" PRIx64 " result. code:%d, msg:%s", info->id, pRequest->code, pRequest->msgBuf);
|
uDebug("SML:0x%" PRIx64 " result. code:%d, msg:%s", info->id, pRequest->code, pRequest->msgBuf);
|
||||||
// lock
|
// lock
|
||||||
taosThreadSpinLock(&info->params->lock);
|
taosThreadSpinLock(&info->params->lock);
|
||||||
info->params->request->body.resInfo.numOfRows += rows;
|
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
info->params->request->code = code;
|
info->params->request->code = code;
|
||||||
|
info->params->request->body.resInfo.numOfRows += rows;
|
||||||
|
}else{
|
||||||
|
info->params->request->body.resInfo.numOfRows += info->affectedRows;
|
||||||
}
|
}
|
||||||
taosThreadSpinUnlock(&info->params->lock);
|
taosThreadSpinUnlock(&info->params->lock);
|
||||||
// unlock
|
// unlock
|
||||||
|
|
|
@ -256,6 +256,13 @@ static const SSysDbTableSchema subscriptionSchema[] = {
|
||||||
{.name = "consumer_id", .bytes = 8, .type = TSDB_DATA_TYPE_BIGINT, .sysInfo = false},
|
{.name = "consumer_id", .bytes = 8, .type = TSDB_DATA_TYPE_BIGINT, .sysInfo = false},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const SSysDbTableSchema vnodesSchema[] = {
|
||||||
|
{.name = "dnode_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true},
|
||||||
|
{.name = "dnode_endpoint", .bytes = TSDB_EP_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true},
|
||||||
|
{.name = "vgroup_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true},
|
||||||
|
{.name = "status", .bytes = 20 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_BINARY, .sysInfo = true},
|
||||||
|
};
|
||||||
|
|
||||||
static const SSysTableMeta infosMeta[] = {
|
static const SSysTableMeta infosMeta[] = {
|
||||||
{TSDB_INS_TABLE_DNODES, dnodesSchema, tListLen(dnodesSchema), true},
|
{TSDB_INS_TABLE_DNODES, dnodesSchema, tListLen(dnodesSchema), true},
|
||||||
{TSDB_INS_TABLE_MNODES, mnodesSchema, tListLen(mnodesSchema), true},
|
{TSDB_INS_TABLE_MNODES, mnodesSchema, tListLen(mnodesSchema), true},
|
||||||
|
@ -279,6 +286,7 @@ static const SSysTableMeta infosMeta[] = {
|
||||||
{TSDB_INS_TABLE_TOPICS, topicSchema, tListLen(topicSchema), false},
|
{TSDB_INS_TABLE_TOPICS, topicSchema, tListLen(topicSchema), false},
|
||||||
{TSDB_INS_TABLE_SUBSCRIPTIONS, subscriptionSchema, tListLen(subscriptionSchema), false},
|
{TSDB_INS_TABLE_SUBSCRIPTIONS, subscriptionSchema, tListLen(subscriptionSchema), false},
|
||||||
{TSDB_INS_TABLE_STREAMS, streamSchema, tListLen(streamSchema), false},
|
{TSDB_INS_TABLE_STREAMS, streamSchema, tListLen(streamSchema), false},
|
||||||
|
{TSDB_INS_TABLE_VNODES, vnodesSchema, tListLen(vnodesSchema), true},
|
||||||
};
|
};
|
||||||
|
|
||||||
static const SSysDbTableSchema connectionsSchema[] = {
|
static const SSysDbTableSchema connectionsSchema[] = {
|
||||||
|
|
|
@ -1133,7 +1133,7 @@ int32_t taosCreateLog(const char *logname, int32_t logFileNum, const char *cfgDi
|
||||||
|
|
||||||
taosSetAllDebugFlag(cfgGetItem(pCfg, "debugFlag")->i32, false);
|
taosSetAllDebugFlag(cfgGetItem(pCfg, "debugFlag")->i32, false);
|
||||||
|
|
||||||
if (taosMulMkDir(tsLogDir) != 0) {
|
if (taosMulModeMkDir(tsLogDir, 0777) != 0) {
|
||||||
uError("failed to create dir:%s since %s", tsLogDir, terrstr());
|
uError("failed to create dir:%s since %s", tsLogDir, terrstr());
|
||||||
cfgCleanup(pCfg);
|
cfgCleanup(pCfg);
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -2024,6 +2024,7 @@ int32_t tSerializeSCreateDbReq(void *buf, int32_t bufLen, SCreateDbReq *pReq) {
|
||||||
if (tEncodeI64(&encoder, pReq->walRetentionSize) < 0) return -1;
|
if (tEncodeI64(&encoder, pReq->walRetentionSize) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->walRollPeriod) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->walRollPeriod) < 0) return -1;
|
||||||
if (tEncodeI64(&encoder, pReq->walSegmentSize) < 0) return -1;
|
if (tEncodeI64(&encoder, pReq->walSegmentSize) < 0) return -1;
|
||||||
|
if (tEncodeI32(&encoder, pReq->sstTrigger) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->ignoreExist) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->ignoreExist) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->numOfRetensions) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->numOfRetensions) < 0) return -1;
|
||||||
for (int32_t i = 0; i < pReq->numOfRetensions; ++i) {
|
for (int32_t i = 0; i < pReq->numOfRetensions; ++i) {
|
||||||
|
@ -2070,6 +2071,7 @@ int32_t tDeserializeSCreateDbReq(void *buf, int32_t bufLen, SCreateDbReq *pReq)
|
||||||
if (tDecodeI64(&decoder, &pReq->walRetentionSize) < 0) return -1;
|
if (tDecodeI64(&decoder, &pReq->walRetentionSize) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->walRollPeriod) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->walRollPeriod) < 0) return -1;
|
||||||
if (tDecodeI64(&decoder, &pReq->walSegmentSize) < 0) return -1;
|
if (tDecodeI64(&decoder, &pReq->walSegmentSize) < 0) return -1;
|
||||||
|
if (tDecodeI32(&decoder, &pReq->sstTrigger) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->ignoreExist) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->ignoreExist) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->numOfRetensions) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->numOfRetensions) < 0) return -1;
|
||||||
pReq->pRetensions = taosArrayInit(pReq->numOfRetensions, sizeof(SRetention));
|
pReq->pRetensions = taosArrayInit(pReq->numOfRetensions, sizeof(SRetention));
|
||||||
|
@ -2120,6 +2122,7 @@ int32_t tSerializeSAlterDbReq(void *buf, int32_t bufLen, SAlterDbReq *pReq) {
|
||||||
if (tEncodeI8(&encoder, pReq->strict) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->strict) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->cacheLast) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->cacheLast) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->replications) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->replications) < 0) return -1;
|
||||||
|
if (tEncodeI32(&encoder, pReq->sstTrigger) < 0) return -1;
|
||||||
tEndEncode(&encoder);
|
tEndEncode(&encoder);
|
||||||
|
|
||||||
int32_t tlen = encoder.pos;
|
int32_t tlen = encoder.pos;
|
||||||
|
@ -2146,6 +2149,7 @@ int32_t tDeserializeSAlterDbReq(void *buf, int32_t bufLen, SAlterDbReq *pReq) {
|
||||||
if (tDecodeI8(&decoder, &pReq->strict) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->strict) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->cacheLast) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->cacheLast) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->replications) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->replications) < 0) return -1;
|
||||||
|
if (tDecodeI32(&decoder, &pReq->sstTrigger) < 0) return -1;
|
||||||
tEndDecode(&decoder);
|
tEndDecode(&decoder);
|
||||||
|
|
||||||
tDecoderClear(&decoder);
|
tDecoderClear(&decoder);
|
||||||
|
|
|
@ -358,10 +358,10 @@ static void mndSetDefaultDbCfg(SDbCfg *pCfg) {
|
||||||
if (pCfg->numOfRetensions < 0) pCfg->numOfRetensions = 0;
|
if (pCfg->numOfRetensions < 0) pCfg->numOfRetensions = 0;
|
||||||
if (pCfg->schemaless < 0) pCfg->schemaless = TSDB_DB_SCHEMALESS_OFF;
|
if (pCfg->schemaless < 0) pCfg->schemaless = TSDB_DB_SCHEMALESS_OFF;
|
||||||
if (pCfg->walRetentionPeriod < 0 && pCfg->walRetentionPeriod != -1)
|
if (pCfg->walRetentionPeriod < 0 && pCfg->walRetentionPeriod != -1)
|
||||||
pCfg->walRetentionPeriod = TSDB_DEFAULT_DB_WAL_RETENTION_PERIOD;
|
pCfg->walRetentionPeriod = TSDB_REPS_DEF_DB_WAL_RET_PERIOD;
|
||||||
if (pCfg->walRetentionSize < 0 && pCfg->walRetentionSize != -1)
|
if (pCfg->walRetentionSize < 0 && pCfg->walRetentionSize != -1)
|
||||||
pCfg->walRetentionSize = TSDB_DEFAULT_DB_WAL_RETENTION_SIZE;
|
pCfg->walRetentionSize = TSDB_REPS_DEF_DB_WAL_RET_SIZE;
|
||||||
if (pCfg->walRollPeriod < 0) pCfg->walRollPeriod = TSDB_DEFAULT_DB_WAL_ROLL_PERIOD;
|
if (pCfg->walRollPeriod < 0) pCfg->walRollPeriod = TSDB_REPS_DEF_DB_WAL_ROLL_PERIOD;
|
||||||
if (pCfg->walSegmentSize < 0) pCfg->walSegmentSize = TSDB_DEFAULT_DB_WAL_SEGMENT_SIZE;
|
if (pCfg->walSegmentSize < 0) pCfg->walSegmentSize = TSDB_DEFAULT_DB_WAL_SEGMENT_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -184,9 +184,9 @@ static int32_t doAppendRowFromFileBlock(SSDataBlock* pResBlock, STsdbReader* pR
|
||||||
static void setComposedBlockFlag(STsdbReader* pReader, bool composed);
|
static void setComposedBlockFlag(STsdbReader* pReader, bool composed);
|
||||||
static bool hasBeenDropped(const SArray* pDelList, int32_t* index, TSDBKEY* pKey, int32_t order);
|
static bool hasBeenDropped(const SArray* pDelList, int32_t* index, TSDBKEY* pKey, int32_t order);
|
||||||
|
|
||||||
static void doMergeMemTableMultiRows(TSDBROW* pRow, uint64_t uid, SIterInfo* pIter, SArray* pDelList, STSRow** pTSRow,
|
static int32_t doMergeMemTableMultiRows(TSDBROW* pRow, uint64_t uid, SIterInfo* pIter, SArray* pDelList, STSRow** pTSRow,
|
||||||
STsdbReader* pReader, bool* freeTSRow);
|
STsdbReader* pReader, bool* freeTSRow);
|
||||||
static void doMergeMemIMemRows(TSDBROW* pRow, TSDBROW* piRow, STableBlockScanInfo* pBlockScanInfo, STsdbReader* pReader,
|
static int32_t doMergeMemIMemRows(TSDBROW* pRow, TSDBROW* piRow, STableBlockScanInfo* pBlockScanInfo, STsdbReader* pReader,
|
||||||
STSRow** pTSRow);
|
STSRow** pTSRow);
|
||||||
static int32_t mergeRowsInFileBlocks(SBlockData* pBlockData, STableBlockScanInfo* pBlockScanInfo, int64_t key, STsdbReader* pReader);
|
static int32_t mergeRowsInFileBlocks(SBlockData* pBlockData, STableBlockScanInfo* pBlockScanInfo, int64_t key, STsdbReader* pReader);
|
||||||
|
|
||||||
|
@ -1395,7 +1395,11 @@ static int32_t doMergeBufAndFileRows(STsdbReader* pReader, STableBlockScanInfo*
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tRowMergerGetRow(&merge, &pTSRow);
|
int32_t code = tRowMergerGetRow(&merge, &pTSRow);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, pBlockScanInfo->uid);
|
doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, pBlockScanInfo->uid);
|
||||||
|
|
||||||
taosMemoryFree(pTSRow);
|
taosMemoryFree(pTSRow);
|
||||||
|
@ -1422,7 +1426,11 @@ static int32_t doMergeFileBlockAndLastBlock(SLastBlockReader* pLastBlockReader,
|
||||||
doMergeRowsInFileBlocks(pBlockData, pBlockScanInfo, pReader, &merge);
|
doMergeRowsInFileBlocks(pBlockData, pBlockScanInfo, pReader, &merge);
|
||||||
}
|
}
|
||||||
|
|
||||||
tRowMergerGetRow(&merge, &pTSRow);
|
int32_t code = tRowMergerGetRow(&merge, &pTSRow);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, pBlockScanInfo->uid);
|
doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, pBlockScanInfo->uid);
|
||||||
|
|
||||||
taosMemoryFree(pTSRow);
|
taosMemoryFree(pTSRow);
|
||||||
|
@ -1456,12 +1464,16 @@ static int32_t mergeFileBlockAndLastBlock(STsdbReader* pReader, SLastBlockReader
|
||||||
doMergeRowsInFileBlocks(pBlockData, pBlockScanInfo, pReader, &merge);
|
doMergeRowsInFileBlocks(pBlockData, pBlockScanInfo, pReader, &merge);
|
||||||
doMergeRowsInLastBlock(pLastBlockReader, pBlockScanInfo, ts, &merge);
|
doMergeRowsInLastBlock(pLastBlockReader, pBlockScanInfo, ts, &merge);
|
||||||
|
|
||||||
tRowMergerGetRow(&merge, &pTSRow);
|
int32_t code = tRowMergerGetRow(&merge, &pTSRow);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, pBlockScanInfo->uid);
|
doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, pBlockScanInfo->uid);
|
||||||
|
|
||||||
taosMemoryFree(pTSRow);
|
taosMemoryFree(pTSRow);
|
||||||
tRowMergerClear(&merge);
|
tRowMergerClear(&merge);
|
||||||
return TSDB_CODE_SUCCESS;
|
return code;
|
||||||
} else {
|
} else {
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -1618,12 +1630,16 @@ static int32_t doMergeMultiLevelRows(STsdbReader* pReader, STableBlockScanInfo*
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tRowMergerGetRow(&merge, &pTSRow);
|
int32_t code = tRowMergerGetRow(&merge, &pTSRow);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, pBlockScanInfo->uid);
|
doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, pBlockScanInfo->uid);
|
||||||
|
|
||||||
taosMemoryFree(pTSRow);
|
taosMemoryFree(pTSRow);
|
||||||
tRowMergerClear(&merge);
|
tRowMergerClear(&merge);
|
||||||
return TSDB_CODE_SUCCESS;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -1907,7 +1923,11 @@ int32_t mergeRowsInFileBlocks(SBlockData* pBlockData, STableBlockScanInfo* pBloc
|
||||||
|
|
||||||
tRowMergerInit(&merge, &fRow, pReader->pSchema);
|
tRowMergerInit(&merge, &fRow, pReader->pSchema);
|
||||||
doMergeRowsInFileBlocks(pBlockData, pBlockScanInfo, pReader, &merge);
|
doMergeRowsInFileBlocks(pBlockData, pBlockScanInfo, pReader, &merge);
|
||||||
tRowMergerGetRow(&merge, &pTSRow);
|
int32_t code = tRowMergerGetRow(&merge, &pTSRow);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, pBlockScanInfo->uid);
|
doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, pBlockScanInfo->uid);
|
||||||
|
|
||||||
taosMemoryFree(pTSRow);
|
taosMemoryFree(pTSRow);
|
||||||
|
@ -3026,8 +3046,8 @@ int32_t doMergeRowsInLastBlock(SLastBlockReader* pLastBlockReader, STableBlockSc
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void doMergeMemTableMultiRows(TSDBROW* pRow, uint64_t uid, SIterInfo* pIter, SArray* pDelList, STSRow** pTSRow,
|
int32_t doMergeMemTableMultiRows(TSDBROW* pRow, uint64_t uid, SIterInfo* pIter, SArray* pDelList, STSRow** pTSRow,
|
||||||
STsdbReader* pReader, bool* freeTSRow) {
|
STsdbReader* pReader, bool* freeTSRow) {
|
||||||
TSDBROW* pNextRow = NULL;
|
TSDBROW* pNextRow = NULL;
|
||||||
TSDBROW current = *pRow;
|
TSDBROW current = *pRow;
|
||||||
|
|
||||||
|
@ -3037,19 +3057,19 @@ void doMergeMemTableMultiRows(TSDBROW* pRow, uint64_t uid, SIterInfo* pIter, SAr
|
||||||
if (!pIter->hasVal) {
|
if (!pIter->hasVal) {
|
||||||
*pTSRow = current.pTSRow;
|
*pTSRow = current.pTSRow;
|
||||||
*freeTSRow = false;
|
*freeTSRow = false;
|
||||||
return;
|
return TSDB_CODE_SUCCESS;
|
||||||
} else { // has next point in mem/imem
|
} else { // has next point in mem/imem
|
||||||
pNextRow = getValidMemRow(pIter, pDelList, pReader);
|
pNextRow = getValidMemRow(pIter, pDelList, pReader);
|
||||||
if (pNextRow == NULL) {
|
if (pNextRow == NULL) {
|
||||||
*pTSRow = current.pTSRow;
|
*pTSRow = current.pTSRow;
|
||||||
*freeTSRow = false;
|
*freeTSRow = false;
|
||||||
return;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (current.pTSRow->ts != pNextRow->pTSRow->ts) {
|
if (current.pTSRow->ts != pNextRow->pTSRow->ts) {
|
||||||
*pTSRow = current.pTSRow;
|
*pTSRow = current.pTSRow;
|
||||||
*freeTSRow = false;
|
*freeTSRow = false;
|
||||||
return;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3069,13 +3089,17 @@ void doMergeMemTableMultiRows(TSDBROW* pRow, uint64_t uid, SIterInfo* pIter, SAr
|
||||||
tRowMergerAdd(&merge, pNextRow, pTSchema1);
|
tRowMergerAdd(&merge, pNextRow, pTSchema1);
|
||||||
|
|
||||||
doMergeRowsInBuf(pIter, uid, current.pTSRow->ts, pDelList, &merge, pReader);
|
doMergeRowsInBuf(pIter, uid, current.pTSRow->ts, pDelList, &merge, pReader);
|
||||||
tRowMergerGetRow(&merge, pTSRow);
|
int32_t code = tRowMergerGetRow(&merge, pTSRow);
|
||||||
tRowMergerClear(&merge);
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
tRowMergerClear(&merge);
|
||||||
*freeTSRow = true;
|
*freeTSRow = true;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void doMergeMemIMemRows(TSDBROW* pRow, TSDBROW* piRow, STableBlockScanInfo* pBlockScanInfo, STsdbReader* pReader,
|
int32_t doMergeMemIMemRows(TSDBROW* pRow, TSDBROW* piRow, STableBlockScanInfo* pBlockScanInfo, STsdbReader* pReader,
|
||||||
STSRow** pTSRow) {
|
STSRow** pTSRow) {
|
||||||
SRowMerger merge = {0};
|
SRowMerger merge = {0};
|
||||||
|
|
||||||
|
@ -3100,7 +3124,8 @@ void doMergeMemIMemRows(TSDBROW* pRow, TSDBROW* piRow, STableBlockScanInfo* pBlo
|
||||||
doMergeRowsInBuf(&pBlockScanInfo->iiter, pBlockScanInfo->uid, k.ts, pBlockScanInfo->delSkyline, &merge, pReader);
|
doMergeRowsInBuf(&pBlockScanInfo->iiter, pBlockScanInfo->uid, k.ts, pBlockScanInfo->delSkyline, &merge, pReader);
|
||||||
}
|
}
|
||||||
|
|
||||||
tRowMergerGetRow(&merge, pTSRow);
|
int32_t code = tRowMergerGetRow(&merge, pTSRow);
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tsdbGetNextRowInMem(STableBlockScanInfo* pBlockScanInfo, STsdbReader* pReader, STSRow** pTSRow, int64_t endKey,
|
int32_t tsdbGetNextRowInMem(STableBlockScanInfo* pBlockScanInfo, STsdbReader* pReader, STSRow** pTSRow, int64_t endKey,
|
||||||
|
@ -3130,28 +3155,30 @@ int32_t tsdbGetNextRowInMem(STableBlockScanInfo* pBlockScanInfo, STsdbReader* pR
|
||||||
TSDBKEY k = TSDBROW_KEY(pRow);
|
TSDBKEY k = TSDBROW_KEY(pRow);
|
||||||
TSDBKEY ik = TSDBROW_KEY(piRow);
|
TSDBKEY ik = TSDBROW_KEY(piRow);
|
||||||
|
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
if (ik.ts != k.ts) {
|
if (ik.ts != k.ts) {
|
||||||
if (((ik.ts < k.ts) && asc) || ((ik.ts > k.ts) && (!asc))) { // ik.ts < k.ts
|
if (((ik.ts < k.ts) && asc) || ((ik.ts > k.ts) && (!asc))) { // ik.ts < k.ts
|
||||||
doMergeMemTableMultiRows(piRow, uid, &pBlockScanInfo->iiter, pDelList, pTSRow, pReader, freeTSRow);
|
code = doMergeMemTableMultiRows(piRow, uid, &pBlockScanInfo->iiter, pDelList, pTSRow, pReader, freeTSRow);
|
||||||
} else if (((k.ts < ik.ts) && asc) || ((k.ts > ik.ts) && (!asc))) {
|
} else if (((k.ts < ik.ts) && asc) || ((k.ts > ik.ts) && (!asc))) {
|
||||||
doMergeMemTableMultiRows(pRow, uid, &pBlockScanInfo->iter, pDelList, pTSRow, pReader, freeTSRow);
|
code = doMergeMemTableMultiRows(pRow, uid, &pBlockScanInfo->iter, pDelList, pTSRow, pReader, freeTSRow);
|
||||||
}
|
}
|
||||||
} else { // ik.ts == k.ts
|
} else { // ik.ts == k.ts
|
||||||
doMergeMemIMemRows(pRow, piRow, pBlockScanInfo, pReader, pTSRow);
|
|
||||||
*freeTSRow = true;
|
*freeTSRow = true;
|
||||||
|
code = doMergeMemIMemRows(pRow, piRow, pBlockScanInfo, pReader, pTSRow);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pBlockScanInfo->iter.hasVal && pRow != NULL) {
|
if (pBlockScanInfo->iter.hasVal && pRow != NULL) {
|
||||||
doMergeMemTableMultiRows(pRow, pBlockScanInfo->uid, &pBlockScanInfo->iter, pDelList, pTSRow, pReader, freeTSRow);
|
return doMergeMemTableMultiRows(pRow, pBlockScanInfo->uid, &pBlockScanInfo->iter, pDelList, pTSRow, pReader, freeTSRow);
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pBlockScanInfo->iiter.hasVal && piRow != NULL) {
|
if (pBlockScanInfo->iiter.hasVal && piRow != NULL) {
|
||||||
doMergeMemTableMultiRows(piRow, uid, &pBlockScanInfo->iiter, pDelList, pTSRow, pReader, freeTSRow);
|
return doMergeMemTableMultiRows(piRow, uid, &pBlockScanInfo->iiter, pDelList, pTSRow, pReader, freeTSRow);
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
|
|
@ -2039,7 +2039,7 @@ int32_t tsdbCmprColData(SColData *pColData, int8_t cmprAlg, SBlockCol *pBlockCol
|
||||||
size += pBlockCol->szOffset;
|
size += pBlockCol->szOffset;
|
||||||
|
|
||||||
// value
|
// value
|
||||||
if (pColData->flag != (HAS_NULL | HAS_NONE)) {
|
if ((pColData->flag != (HAS_NULL | HAS_NONE)) && pColData->nData) {
|
||||||
code = tsdbCmprData((uint8_t *)pColData->pData, pColData->nData, pColData->type, cmprAlg, ppOut, nOut + size,
|
code = tsdbCmprData((uint8_t *)pColData->pData, pColData->nData, pColData->type, cmprAlg, ppOut, nOut + size,
|
||||||
&pBlockCol->szValue, ppBuf);
|
&pBlockCol->szValue, ppBuf);
|
||||||
if (code) goto _exit;
|
if (code) goto _exit;
|
||||||
|
|
|
@ -496,6 +496,7 @@ static int32_t vnodeProcessCreateTbReq(SVnode *pVnode, int64_t version, void *pR
|
||||||
// loop to create table
|
// loop to create table
|
||||||
for (int32_t iReq = 0; iReq < req.nReqs; iReq++) {
|
for (int32_t iReq = 0; iReq < req.nReqs; iReq++) {
|
||||||
pCreateReq = req.pReqs + iReq;
|
pCreateReq = req.pReqs + iReq;
|
||||||
|
memset(&cRsp, 0, sizeof(cRsp));
|
||||||
|
|
||||||
if ((terrno = grantCheck(TSDB_GRANT_TIMESERIES)) < 0) {
|
if ((terrno = grantCheck(TSDB_GRANT_TIMESERIES)) < 0) {
|
||||||
rcode = -1;
|
rcode = -1;
|
||||||
|
|
|
@ -938,15 +938,17 @@ SArray* extractColMatchInfo(SNodeList* pNodeList, SDataBlockDescNode* pOutputNod
|
||||||
|
|
||||||
for (int32_t i = 0; i < numOfCols; ++i) {
|
for (int32_t i = 0; i < numOfCols; ++i) {
|
||||||
STargetNode* pNode = (STargetNode*)nodesListGetNode(pNodeList, i);
|
STargetNode* pNode = (STargetNode*)nodesListGetNode(pNodeList, i);
|
||||||
SColumnNode* pColNode = (SColumnNode*)pNode->pExpr;
|
if (nodeType(pNode->pExpr) == QUERY_NODE_COLUMN) {
|
||||||
|
SColumnNode* pColNode = (SColumnNode*)pNode->pExpr;
|
||||||
|
|
||||||
SColMatchInfo c = {0};
|
SColMatchInfo c = {0};
|
||||||
c.output = true;
|
c.output = true;
|
||||||
c.colId = pColNode->colId;
|
c.colId = pColNode->colId;
|
||||||
c.srcSlotId = pColNode->slotId;
|
c.srcSlotId = pColNode->slotId;
|
||||||
c.matchType = type;
|
c.matchType = type;
|
||||||
c.targetSlotId = pNode->slotId;
|
c.targetSlotId = pNode->slotId;
|
||||||
taosArrayPush(pList, &c);
|
taosArrayPush(pList, &c);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*numOfOutputCols = 0;
|
*numOfOutputCols = 0;
|
||||||
|
|
|
@ -263,8 +263,6 @@ SResultRow* doSetResultOutBufByKey(SDiskbasedBuf* pResultBuf, SResultRowInfo* pR
|
||||||
ASSERT(pSup->resultRowSize > 0);
|
ASSERT(pSup->resultRowSize > 0);
|
||||||
pResult = getNewResultRow(pResultBuf, &pSup->currentPageId, pSup->resultRowSize);
|
pResult = getNewResultRow(pResultBuf, &pSup->currentPageId, pSup->resultRowSize);
|
||||||
|
|
||||||
initResultRow(pResult);
|
|
||||||
|
|
||||||
// add a new result set for a new group
|
// add a new result set for a new group
|
||||||
SResultRowPosition pos = {.pageId = pResult->pageId, .offset = pResult->offset};
|
SResultRowPosition pos = {.pageId = pResult->pageId, .offset = pResult->offset};
|
||||||
tSimpleHashPut(pSup->pResultRowHashTable, pSup->keyBuf, GET_RES_WINDOW_KEY_LEN(bytes), &pos,
|
tSimpleHashPut(pSup->pResultRowHashTable, pSup->keyBuf, GET_RES_WINDOW_KEY_LEN(bytes), &pos,
|
||||||
|
@ -817,13 +815,6 @@ void setBlockSMAInfo(SqlFunctionCtx* pCtx, SExprInfo* pExprInfo, SSDataBlock* pB
|
||||||
} else {
|
} else {
|
||||||
pInput->colDataAggIsSet = false;
|
pInput->colDataAggIsSet = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// set the statistics data for primary time stamp column
|
|
||||||
// if (pCtx->functionId == FUNCTION_SPREAD && pColumn->colId == PRIMARYKEY_TIMESTAMP_COL_ID) {
|
|
||||||
// pCtx->isAggSet = true;
|
|
||||||
// pCtx->agg.min = pBlock->info.window.skey;
|
|
||||||
// pCtx->agg.max = pBlock->info.window.ekey;
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isTaskKilled(SExecTaskInfo* pTaskInfo) {
|
bool isTaskKilled(SExecTaskInfo* pTaskInfo) {
|
||||||
|
@ -860,146 +851,6 @@ STimeWindow getAlignQueryTimeWindow(SInterval* pInterval, int32_t precision, int
|
||||||
return win;
|
return win;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
static int32_t updateBlockLoadStatus(STaskAttr* pQuery, int32_t status) {
|
|
||||||
|
|
||||||
bool hasFirstLastFunc = false;
|
|
||||||
bool hasOtherFunc = false;
|
|
||||||
|
|
||||||
if (status == BLK_DATA_DATA_LOAD || status == BLK_DATA_FILTEROUT) {
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int32_t i = 0; i < pQuery->numOfOutput; ++i) {
|
|
||||||
int32_t functionId = getExprFunctionId(&pQuery->pExpr1[i]);
|
|
||||||
|
|
||||||
if (functionId == FUNCTION_TS || functionId == FUNCTION_TS_DUMMY || functionId == FUNCTION_TAG ||
|
|
||||||
functionId == FUNCTION_TAG_DUMMY) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (functionId == FUNCTION_FIRST_DST || functionId == FUNCTION_LAST_DST) {
|
|
||||||
hasFirstLastFunc = true;
|
|
||||||
} else {
|
|
||||||
hasOtherFunc = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hasFirstLastFunc && status == BLK_DATA_NOT_LOAD) {
|
|
||||||
if (!hasOtherFunc) {
|
|
||||||
return BLK_DATA_FILTEROUT;
|
|
||||||
} else {
|
|
||||||
return BLK_DATA_DATA_LOAD;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// static void updateDataCheckOrder(SQInfo *pQInfo, SQueryTableReq* pQueryMsg, bool stableQuery) {
|
|
||||||
// STaskAttr* pQueryAttr = pQInfo->runtimeEnv.pQueryAttr;
|
|
||||||
//
|
|
||||||
// // in case of point-interpolation query, use asc order scan
|
|
||||||
// char msg[] = "QInfo:0x%"PRIx64" scan order changed for %s query, old:%d, new:%d, qrange exchanged, old qrange:%"
|
|
||||||
// PRId64
|
|
||||||
// "-%" PRId64 ", new qrange:%" PRId64 "-%" PRId64;
|
|
||||||
//
|
|
||||||
// // todo handle the case the the order irrelevant query type mixed up with order critical query type
|
|
||||||
// // descending order query for last_row query
|
|
||||||
// if (isFirstLastRowQuery(pQueryAttr)) {
|
|
||||||
// //qDebug("QInfo:0x%"PRIx64" scan order changed for last_row query, old:%d, new:%d", pQInfo->qId,
|
|
||||||
// pQueryAttr->order.order, TSDB_ORDER_ASC);
|
|
||||||
//
|
|
||||||
// pQueryAttr->order.order = TSDB_ORDER_ASC;
|
|
||||||
// if (pQueryAttr->window.skey > pQueryAttr->window.ekey) {
|
|
||||||
// TSWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// pQueryAttr->needReverseScan = false;
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// if (pQueryAttr->groupbyColumn && pQueryAttr->order.order == TSDB_ORDER_DESC) {
|
|
||||||
// pQueryAttr->order.order = TSDB_ORDER_ASC;
|
|
||||||
// if (pQueryAttr->window.skey > pQueryAttr->window.ekey) {
|
|
||||||
// TSWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// pQueryAttr->needReverseScan = false;
|
|
||||||
// doUpdateLastKey(pQueryAttr);
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// if (pQueryAttr->pointInterpQuery && pQueryAttr->interval.interval == 0) {
|
|
||||||
// if (!QUERY_IS_ASC_QUERY(pQueryAttr)) {
|
|
||||||
// //qDebug(msg, pQInfo->qId, "interp", pQueryAttr->order.order, TSDB_ORDER_ASC, pQueryAttr->window.skey,
|
|
||||||
// pQueryAttr->window.ekey, pQueryAttr->window.ekey, pQueryAttr->window.skey); TSWAP(pQueryAttr->window.skey,
|
|
||||||
// pQueryAttr->window.ekey, TSKEY);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// pQueryAttr->order.order = TSDB_ORDER_ASC;
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// if (pQueryAttr->interval.interval == 0) {
|
|
||||||
// if (onlyFirstQuery(pQueryAttr)) {
|
|
||||||
// if (!QUERY_IS_ASC_QUERY(pQueryAttr)) {
|
|
||||||
// //qDebug(msg, pQInfo->qId, "only-first", pQueryAttr->order.order, TSDB_ORDER_ASC, pQueryAttr->window.skey,
|
|
||||||
//// pQueryAttr->window.ekey, pQueryAttr->window.ekey, pQueryAttr->window.skey);
|
|
||||||
//
|
|
||||||
// TSWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey);
|
|
||||||
// doUpdateLastKey(pQueryAttr);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// pQueryAttr->order.order = TSDB_ORDER_ASC;
|
|
||||||
// pQueryAttr->needReverseScan = false;
|
|
||||||
// } else if (onlyLastQuery(pQueryAttr) && notContainSessionOrStateWindow(pQueryAttr)) {
|
|
||||||
// if (QUERY_IS_ASC_QUERY(pQueryAttr)) {
|
|
||||||
// //qDebug(msg, pQInfo->qId, "only-last", pQueryAttr->order.order, TSDB_ORDER_DESC, pQueryAttr->window.skey,
|
|
||||||
//// pQueryAttr->window.ekey, pQueryAttr->window.ekey, pQueryAttr->window.skey);
|
|
||||||
//
|
|
||||||
// TSWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey);
|
|
||||||
// doUpdateLastKey(pQueryAttr);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// pQueryAttr->order.order = TSDB_ORDER_DESC;
|
|
||||||
// pQueryAttr->needReverseScan = false;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// } else { // interval query
|
|
||||||
// if (stableQuery) {
|
|
||||||
// if (onlyFirstQuery(pQueryAttr)) {
|
|
||||||
// if (!QUERY_IS_ASC_QUERY(pQueryAttr)) {
|
|
||||||
// //qDebug(msg, pQInfo->qId, "only-first stable", pQueryAttr->order.order, TSDB_ORDER_ASC,
|
|
||||||
//// pQueryAttr->window.skey, pQueryAttr->window.ekey, pQueryAttr->window.ekey,
|
|
||||||
/// pQueryAttr->window.skey);
|
|
||||||
//
|
|
||||||
// TSWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey);
|
|
||||||
// doUpdateLastKey(pQueryAttr);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// pQueryAttr->order.order = TSDB_ORDER_ASC;
|
|
||||||
// pQueryAttr->needReverseScan = false;
|
|
||||||
// } else if (onlyLastQuery(pQueryAttr)) {
|
|
||||||
// if (QUERY_IS_ASC_QUERY(pQueryAttr)) {
|
|
||||||
// //qDebug(msg, pQInfo->qId, "only-last stable", pQueryAttr->order.order, TSDB_ORDER_DESC,
|
|
||||||
//// pQueryAttr->window.skey, pQueryAttr->window.ekey, pQueryAttr->window.ekey,
|
|
||||||
/// pQueryAttr->window.skey);
|
|
||||||
//
|
|
||||||
// TSWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey);
|
|
||||||
// doUpdateLastKey(pQueryAttr);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// pQueryAttr->order.order = TSDB_ORDER_DESC;
|
|
||||||
// pQueryAttr->needReverseScan = false;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
static bool overlapWithTimeWindow(STaskAttr* pQueryAttr, SDataBlockInfo* pBlockInfo) {
|
static bool overlapWithTimeWindow(STaskAttr* pQueryAttr, SDataBlockInfo* pBlockInfo) {
|
||||||
STimeWindow w = {0};
|
STimeWindow w = {0};
|
||||||
|
@ -1225,24 +1076,6 @@ static void updateTableQueryInfoForReverseScan(STableQueryInfo* pTableQueryInfo)
|
||||||
if (pTableQueryInfo == NULL) {
|
if (pTableQueryInfo == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TSWAP(pTableQueryInfo->win.skey, pTableQueryInfo->win.ekey);
|
|
||||||
// pTableQueryInfo->lastKey = pTableQueryInfo->win.skey;
|
|
||||||
|
|
||||||
// SWITCH_ORDER(pTableQueryInfo->cur.order);
|
|
||||||
// pTableQueryInfo->cur.vgroupIndex = -1;
|
|
||||||
|
|
||||||
// set the index to be the end slot of result rows array
|
|
||||||
// SResultRowInfo* pResultRowInfo = &pTableQueryInfo->resInfo;
|
|
||||||
// if (pResultRowInfo->size > 0) {
|
|
||||||
// pResultRowInfo->curPos = pResultRowInfo->size - 1;
|
|
||||||
// } else {
|
|
||||||
// pResultRowInfo->curPos = -1;
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
|
|
||||||
void initResultRow(SResultRow* pResultRow) {
|
|
||||||
// pResultRow->pEntryInfo = (struct SResultRowEntryInfo*)((char*)pResultRow + sizeof(SResultRow));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setTaskStatus(SExecTaskInfo* pTaskInfo, int8_t status) {
|
void setTaskStatus(SExecTaskInfo* pTaskInfo, int8_t status) {
|
||||||
|
@ -1255,15 +1088,6 @@ void setTaskStatus(SExecTaskInfo* pTaskInfo, int8_t status) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void destroyTableQueryInfoImpl(STableQueryInfo* pTableQueryInfo) {
|
|
||||||
if (pTableQueryInfo == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// taosVariantDestroy(&pTableQueryInfo->tag);
|
|
||||||
// cleanupResultRowInfo(&pTableQueryInfo->resInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
void setResultRowInitCtx(SResultRow* pResult, SqlFunctionCtx* pCtx, int32_t numOfOutput, int32_t* rowEntryInfoOffset) {
|
void setResultRowInitCtx(SResultRow* pResult, SqlFunctionCtx* pCtx, int32_t numOfOutput, int32_t* rowEntryInfoOffset) {
|
||||||
bool init = false;
|
bool init = false;
|
||||||
for (int32_t i = 0; i < numOfOutput; ++i) {
|
for (int32_t i = 0; i < numOfOutput; ++i) {
|
||||||
|
@ -3022,7 +2846,6 @@ int32_t aggDecodeResultRow(SOperatorInfo* pOperator, char* result) {
|
||||||
resultRow->offset = pOffset;
|
resultRow->offset = pOffset;
|
||||||
offset += valueLen;
|
offset += valueLen;
|
||||||
|
|
||||||
initResultRow(resultRow);
|
|
||||||
pInfo->resultRowInfo.cur = (SResultRowPosition){.pageId = resultRow->pageId, .offset = resultRow->offset};
|
pInfo->resultRowInfo.cur = (SResultRowPosition){.pageId = resultRow->pageId, .offset = resultRow->offset};
|
||||||
// releaseBufPage(pSup->pResultBuf, getBufPage(pSup->pResultBuf, pageId));
|
// releaseBufPage(pSup->pResultBuf, getBufPage(pSup->pResultBuf, pageId));
|
||||||
}
|
}
|
||||||
|
|
|
@ -3873,7 +3873,6 @@ static int32_t setWindowOutputBuf(SResultWindowInfo* pWinInfo, SResultRow** pRes
|
||||||
if (*pResult == NULL) {
|
if (*pResult == NULL) {
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
initResultRow(*pResult);
|
|
||||||
|
|
||||||
// add a new result set for a new group
|
// add a new result set for a new group
|
||||||
pWinInfo->pos.pageId = (*pResult)->pageId;
|
pWinInfo->pos.pageId = (*pResult)->pageId;
|
||||||
|
|
|
@ -59,7 +59,8 @@ typedef enum EDatabaseOptionType {
|
||||||
DB_OPTION_WAL_RETENTION_PERIOD,
|
DB_OPTION_WAL_RETENTION_PERIOD,
|
||||||
DB_OPTION_WAL_RETENTION_SIZE,
|
DB_OPTION_WAL_RETENTION_SIZE,
|
||||||
DB_OPTION_WAL_ROLL_PERIOD,
|
DB_OPTION_WAL_ROLL_PERIOD,
|
||||||
DB_OPTION_WAL_SEGMENT_SIZE
|
DB_OPTION_WAL_SEGMENT_SIZE,
|
||||||
|
DB_OPTION_SST_TRIGGER
|
||||||
} EDatabaseOptionType;
|
} EDatabaseOptionType;
|
||||||
|
|
||||||
typedef enum ETableOptionType {
|
typedef enum ETableOptionType {
|
||||||
|
@ -170,6 +171,7 @@ SNode* createShowCreateDatabaseStmt(SAstCreateContext* pCxt, SToken* pDbName);
|
||||||
SNode* createShowCreateTableStmt(SAstCreateContext* pCxt, ENodeType type, SNode* pRealTable);
|
SNode* createShowCreateTableStmt(SAstCreateContext* pCxt, ENodeType type, SNode* pRealTable);
|
||||||
SNode* createShowTableDistributedStmt(SAstCreateContext* pCxt, SNode* pRealTable);
|
SNode* createShowTableDistributedStmt(SAstCreateContext* pCxt, SNode* pRealTable);
|
||||||
SNode* createShowDnodeVariablesStmt(SAstCreateContext* pCxt, SNode* pDnodeId);
|
SNode* createShowDnodeVariablesStmt(SAstCreateContext* pCxt, SNode* pDnodeId);
|
||||||
|
SNode* createShowVnodesStmt(SAstCreateContext* pCxt, SNode* pDnodeId, SNode* pDnodeEndpoint);
|
||||||
SNode* createCreateUserStmt(SAstCreateContext* pCxt, SToken* pUserName, const SToken* pPassword, int8_t sysinfo);
|
SNode* createCreateUserStmt(SAstCreateContext* pCxt, SToken* pUserName, const SToken* pPassword, int8_t sysinfo);
|
||||||
SNode* createAlterUserStmt(SAstCreateContext* pCxt, SToken* pUserName, int8_t alterType, const SToken* pVal);
|
SNode* createAlterUserStmt(SAstCreateContext* pCxt, SToken* pUserName, int8_t alterType, const SToken* pVal);
|
||||||
SNode* createDropUserStmt(SAstCreateContext* pCxt, SToken* pUserName);
|
SNode* createDropUserStmt(SAstCreateContext* pCxt, SToken* pUserName);
|
||||||
|
|
|
@ -207,6 +207,7 @@ db_options(A) ::= db_options(B) WAL_RETENTION_SIZE NK_MINUS(D) NK_INTEGER(C).
|
||||||
}
|
}
|
||||||
db_options(A) ::= db_options(B) WAL_ROLL_PERIOD NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_WAL_ROLL_PERIOD, &C); }
|
db_options(A) ::= db_options(B) WAL_ROLL_PERIOD NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_WAL_ROLL_PERIOD, &C); }
|
||||||
db_options(A) ::= db_options(B) WAL_SEGMENT_SIZE NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_WAL_SEGMENT_SIZE, &C); }
|
db_options(A) ::= db_options(B) WAL_SEGMENT_SIZE NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_WAL_SEGMENT_SIZE, &C); }
|
||||||
|
db_options(A) ::= db_options(B) SST_TRIGGER NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_SST_TRIGGER, &C); }
|
||||||
|
|
||||||
alter_db_options(A) ::= alter_db_option(B). { A = createAlterDatabaseOptions(pCxt); A = setAlterDatabaseOption(pCxt, A, &B); }
|
alter_db_options(A) ::= alter_db_option(B). { A = createAlterDatabaseOptions(pCxt); A = setAlterDatabaseOption(pCxt, A, &B); }
|
||||||
alter_db_options(A) ::= alter_db_options(B) alter_db_option(C). { A = setAlterDatabaseOption(pCxt, B, &C); }
|
alter_db_options(A) ::= alter_db_options(B) alter_db_option(C). { A = setAlterDatabaseOption(pCxt, B, &C); }
|
||||||
|
@ -223,6 +224,7 @@ alter_db_option(A) ::= KEEP variable_list(B).
|
||||||
//alter_db_option(A) ::= REPLICA NK_INTEGER(B). { A.type = DB_OPTION_REPLICA; A.val = B; }
|
//alter_db_option(A) ::= REPLICA NK_INTEGER(B). { A.type = DB_OPTION_REPLICA; A.val = B; }
|
||||||
//alter_db_option(A) ::= STRICT NK_STRING(B). { A.type = DB_OPTION_STRICT; A.val = B; }
|
//alter_db_option(A) ::= STRICT NK_STRING(B). { A.type = DB_OPTION_STRICT; A.val = B; }
|
||||||
alter_db_option(A) ::= WAL_LEVEL NK_INTEGER(B). { A.type = DB_OPTION_WAL; A.val = B; }
|
alter_db_option(A) ::= WAL_LEVEL NK_INTEGER(B). { A.type = DB_OPTION_WAL; A.val = B; }
|
||||||
|
alter_db_option(A) ::= SST_TRIGGER NK_INTEGER(B). { A.type = DB_OPTION_SST_TRIGGER; A.val = B; }
|
||||||
|
|
||||||
%type integer_list { SNodeList* }
|
%type integer_list { SNodeList* }
|
||||||
%destructor integer_list { nodesDestroyList($$); }
|
%destructor integer_list { nodesDestroyList($$); }
|
||||||
|
@ -410,6 +412,8 @@ cmd ::= SHOW TABLE DISTRIBUTED full_table_name(A).
|
||||||
cmd ::= SHOW CONSUMERS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CONSUMERS_STMT); }
|
cmd ::= SHOW CONSUMERS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CONSUMERS_STMT); }
|
||||||
cmd ::= SHOW SUBSCRIPTIONS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT); }
|
cmd ::= SHOW SUBSCRIPTIONS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT); }
|
||||||
cmd ::= SHOW TAGS FROM table_name_cond(A) from_db_opt(B). { pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TAGS_STMT, B, A, OP_TYPE_EQUAL); }
|
cmd ::= SHOW TAGS FROM table_name_cond(A) from_db_opt(B). { pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TAGS_STMT, B, A, OP_TYPE_EQUAL); }
|
||||||
|
cmd ::= SHOW VNODES NK_INTEGER(A). { pCxt->pRootNode = createShowVnodesStmt(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &A), NULL); }
|
||||||
|
cmd ::= SHOW VNODES NK_STRING(A). { pCxt->pRootNode = createShowVnodesStmt(pCxt, NULL, createValueNode(pCxt, TSDB_DATA_TYPE_VARCHAR, &A)); }
|
||||||
|
|
||||||
db_name_cond_opt(A) ::= . { A = createDefaultDatabaseCondValue(pCxt); }
|
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); }
|
||||||
|
@ -997,4 +1001,4 @@ null_ordering_opt(A) ::= NULLS LAST.
|
||||||
|
|
||||||
%fallback ABORT AFTER ATTACH BEFORE BEGIN BITAND BITNOT BITOR BLOCKS CHANGE COMMA COMPACT CONCAT CONFLICT COPY DEFERRED DELIMITERS DETACH DIVIDE DOT EACH END FAIL
|
%fallback ABORT AFTER ATTACH BEFORE BEGIN BITAND BITNOT BITOR BLOCKS CHANGE COMMA COMPACT CONCAT CONFLICT COPY DEFERRED DELIMITERS DETACH DIVIDE DOT EACH END FAIL
|
||||||
FILE FOR GLOB ID IMMEDIATE IMPORT INITIALLY INSTEAD ISNULL KEY NK_BITNOT NK_SEMI NOTNULL OF PLUS PRIVILEGE RAISE REPLACE RESTRICT ROW SEMI STAR STATEMENT STRING
|
FILE FOR GLOB ID IMMEDIATE IMPORT INITIALLY INSTEAD ISNULL KEY NK_BITNOT NK_SEMI NOTNULL OF PLUS PRIVILEGE RAISE REPLACE RESTRICT ROW SEMI STAR STATEMENT STRING
|
||||||
TIMES UPDATE VALUES VARIABLE VIEW VNODES WAL.
|
TIMES UPDATE VALUES VARIABLE VIEW WAL.
|
||||||
|
|
|
@ -795,6 +795,20 @@ SNode* createSetOperator(SAstCreateContext* pCxt, ESetOperatorType type, SNode*
|
||||||
return (SNode*)setOp;
|
return (SNode*)setOp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void updateWalOptionsDefault(SDatabaseOptions* pOptions) {
|
||||||
|
if (!pOptions->walRetentionPeriodIsSet) {
|
||||||
|
pOptions->walRetentionPeriod =
|
||||||
|
pOptions->replica > 1 ? TSDB_REPS_DEF_DB_WAL_RET_PERIOD : TSDB_REP_DEF_DB_WAL_RET_PERIOD;
|
||||||
|
}
|
||||||
|
if (!pOptions->walRetentionSizeIsSet) {
|
||||||
|
pOptions->walRetentionSize = pOptions->replica > 1 ? TSDB_REPS_DEF_DB_WAL_RET_SIZE : TSDB_REP_DEF_DB_WAL_RET_SIZE;
|
||||||
|
}
|
||||||
|
if (!pOptions->walRollPeriodIsSet) {
|
||||||
|
pOptions->walRollPeriod =
|
||||||
|
pOptions->replica > 1 ? TSDB_REPS_DEF_DB_WAL_ROLL_PERIOD : TSDB_REP_DEF_DB_WAL_ROLL_PERIOD;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SNode* createDefaultDatabaseOptions(SAstCreateContext* pCxt) {
|
SNode* createDefaultDatabaseOptions(SAstCreateContext* pCxt) {
|
||||||
CHECK_PARSER_STATUS(pCxt);
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SDatabaseOptions* pOptions = (SDatabaseOptions*)nodesMakeNode(QUERY_NODE_DATABASE_OPTIONS);
|
SDatabaseOptions* pOptions = (SDatabaseOptions*)nodesMakeNode(QUERY_NODE_DATABASE_OPTIONS);
|
||||||
|
@ -819,10 +833,9 @@ SNode* createDefaultDatabaseOptions(SAstCreateContext* pCxt) {
|
||||||
pOptions->numOfVgroups = TSDB_DEFAULT_VN_PER_DB;
|
pOptions->numOfVgroups = TSDB_DEFAULT_VN_PER_DB;
|
||||||
pOptions->singleStable = TSDB_DEFAULT_DB_SINGLE_STABLE;
|
pOptions->singleStable = TSDB_DEFAULT_DB_SINGLE_STABLE;
|
||||||
pOptions->schemaless = TSDB_DEFAULT_DB_SCHEMALESS;
|
pOptions->schemaless = TSDB_DEFAULT_DB_SCHEMALESS;
|
||||||
pOptions->walRetentionPeriod = TSDB_DEFAULT_DB_WAL_RETENTION_PERIOD;
|
updateWalOptionsDefault(pOptions);
|
||||||
pOptions->walRetentionSize = TSDB_DEFAULT_DB_WAL_RETENTION_SIZE;
|
|
||||||
pOptions->walRollPeriod = TSDB_DEFAULT_DB_WAL_ROLL_PERIOD;
|
|
||||||
pOptions->walSegmentSize = TSDB_DEFAULT_DB_WAL_SEGMENT_SIZE;
|
pOptions->walSegmentSize = TSDB_DEFAULT_DB_WAL_SEGMENT_SIZE;
|
||||||
|
pOptions->sstTrigger = TSDB_DEFAULT_SST_TRIGGER;
|
||||||
return (SNode*)pOptions;
|
return (SNode*)pOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -854,83 +867,92 @@ SNode* createAlterDatabaseOptions(SAstCreateContext* pCxt) {
|
||||||
pOptions->walRetentionSize = -1;
|
pOptions->walRetentionSize = -1;
|
||||||
pOptions->walRollPeriod = -1;
|
pOptions->walRollPeriod = -1;
|
||||||
pOptions->walSegmentSize = -1;
|
pOptions->walSegmentSize = -1;
|
||||||
|
pOptions->sstTrigger = -1;
|
||||||
return (SNode*)pOptions;
|
return (SNode*)pOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* setDatabaseOption(SAstCreateContext* pCxt, SNode* pOptions, EDatabaseOptionType type, void* pVal) {
|
SNode* setDatabaseOption(SAstCreateContext* pCxt, SNode* pOptions, EDatabaseOptionType type, void* pVal) {
|
||||||
CHECK_PARSER_STATUS(pCxt);
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
|
SDatabaseOptions* pDbOptions = (SDatabaseOptions*)pOptions;
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case DB_OPTION_BUFFER:
|
case DB_OPTION_BUFFER:
|
||||||
((SDatabaseOptions*)pOptions)->buffer = taosStr2Int32(((SToken*)pVal)->z, NULL, 10);
|
pDbOptions->buffer = taosStr2Int32(((SToken*)pVal)->z, NULL, 10);
|
||||||
break;
|
break;
|
||||||
case DB_OPTION_CACHEMODEL:
|
case DB_OPTION_CACHEMODEL:
|
||||||
COPY_STRING_FORM_STR_TOKEN(((SDatabaseOptions*)pOptions)->cacheModelStr, (SToken*)pVal);
|
COPY_STRING_FORM_STR_TOKEN(pDbOptions->cacheModelStr, (SToken*)pVal);
|
||||||
break;
|
break;
|
||||||
case DB_OPTION_CACHESIZE:
|
case DB_OPTION_CACHESIZE:
|
||||||
((SDatabaseOptions*)pOptions)->cacheLastSize = taosStr2Int32(((SToken*)pVal)->z, NULL, 10);
|
pDbOptions->cacheLastSize = taosStr2Int32(((SToken*)pVal)->z, NULL, 10);
|
||||||
break;
|
break;
|
||||||
case DB_OPTION_COMP:
|
case DB_OPTION_COMP:
|
||||||
((SDatabaseOptions*)pOptions)->compressionLevel = taosStr2Int8(((SToken*)pVal)->z, NULL, 10);
|
pDbOptions->compressionLevel = taosStr2Int8(((SToken*)pVal)->z, NULL, 10);
|
||||||
break;
|
break;
|
||||||
case DB_OPTION_DAYS: {
|
case DB_OPTION_DAYS: {
|
||||||
SToken* pToken = pVal;
|
SToken* pToken = pVal;
|
||||||
if (TK_NK_INTEGER == pToken->type) {
|
if (TK_NK_INTEGER == pToken->type) {
|
||||||
((SDatabaseOptions*)pOptions)->daysPerFile = taosStr2Int32(pToken->z, NULL, 10) * 1440;
|
pDbOptions->daysPerFile = taosStr2Int32(pToken->z, NULL, 10) * 1440;
|
||||||
} else {
|
} else {
|
||||||
((SDatabaseOptions*)pOptions)->pDaysPerFile = (SValueNode*)createDurationValueNode(pCxt, pToken);
|
pDbOptions->pDaysPerFile = (SValueNode*)createDurationValueNode(pCxt, pToken);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DB_OPTION_FSYNC:
|
case DB_OPTION_FSYNC:
|
||||||
((SDatabaseOptions*)pOptions)->fsyncPeriod = taosStr2Int32(((SToken*)pVal)->z, NULL, 10);
|
pDbOptions->fsyncPeriod = taosStr2Int32(((SToken*)pVal)->z, NULL, 10);
|
||||||
break;
|
break;
|
||||||
case DB_OPTION_MAXROWS:
|
case DB_OPTION_MAXROWS:
|
||||||
((SDatabaseOptions*)pOptions)->maxRowsPerBlock = taosStr2Int32(((SToken*)pVal)->z, NULL, 10);
|
pDbOptions->maxRowsPerBlock = taosStr2Int32(((SToken*)pVal)->z, NULL, 10);
|
||||||
break;
|
break;
|
||||||
case DB_OPTION_MINROWS:
|
case DB_OPTION_MINROWS:
|
||||||
((SDatabaseOptions*)pOptions)->minRowsPerBlock = taosStr2Int32(((SToken*)pVal)->z, NULL, 10);
|
pDbOptions->minRowsPerBlock = taosStr2Int32(((SToken*)pVal)->z, NULL, 10);
|
||||||
break;
|
break;
|
||||||
case DB_OPTION_KEEP:
|
case DB_OPTION_KEEP:
|
||||||
((SDatabaseOptions*)pOptions)->pKeep = pVal;
|
pDbOptions->pKeep = pVal;
|
||||||
break;
|
break;
|
||||||
case DB_OPTION_PAGES:
|
case DB_OPTION_PAGES:
|
||||||
((SDatabaseOptions*)pOptions)->pages = taosStr2Int32(((SToken*)pVal)->z, NULL, 10);
|
pDbOptions->pages = taosStr2Int32(((SToken*)pVal)->z, NULL, 10);
|
||||||
break;
|
break;
|
||||||
case DB_OPTION_PAGESIZE:
|
case DB_OPTION_PAGESIZE:
|
||||||
((SDatabaseOptions*)pOptions)->pagesize = taosStr2Int32(((SToken*)pVal)->z, NULL, 10);
|
pDbOptions->pagesize = taosStr2Int32(((SToken*)pVal)->z, NULL, 10);
|
||||||
break;
|
break;
|
||||||
case DB_OPTION_PRECISION:
|
case DB_OPTION_PRECISION:
|
||||||
COPY_STRING_FORM_STR_TOKEN(((SDatabaseOptions*)pOptions)->precisionStr, (SToken*)pVal);
|
COPY_STRING_FORM_STR_TOKEN(pDbOptions->precisionStr, (SToken*)pVal);
|
||||||
break;
|
break;
|
||||||
case DB_OPTION_REPLICA:
|
case DB_OPTION_REPLICA:
|
||||||
((SDatabaseOptions*)pOptions)->replica = taosStr2Int8(((SToken*)pVal)->z, NULL, 10);
|
pDbOptions->replica = taosStr2Int8(((SToken*)pVal)->z, NULL, 10);
|
||||||
|
updateWalOptionsDefault(pDbOptions);
|
||||||
break;
|
break;
|
||||||
case DB_OPTION_STRICT:
|
case DB_OPTION_STRICT:
|
||||||
COPY_STRING_FORM_STR_TOKEN(((SDatabaseOptions*)pOptions)->strictStr, (SToken*)pVal);
|
COPY_STRING_FORM_STR_TOKEN(pDbOptions->strictStr, (SToken*)pVal);
|
||||||
break;
|
break;
|
||||||
case DB_OPTION_WAL:
|
case DB_OPTION_WAL:
|
||||||
((SDatabaseOptions*)pOptions)->walLevel = taosStr2Int8(((SToken*)pVal)->z, NULL, 10);
|
pDbOptions->walLevel = taosStr2Int8(((SToken*)pVal)->z, NULL, 10);
|
||||||
break;
|
break;
|
||||||
case DB_OPTION_VGROUPS:
|
case DB_OPTION_VGROUPS:
|
||||||
((SDatabaseOptions*)pOptions)->numOfVgroups = taosStr2Int32(((SToken*)pVal)->z, NULL, 10);
|
pDbOptions->numOfVgroups = taosStr2Int32(((SToken*)pVal)->z, NULL, 10);
|
||||||
break;
|
break;
|
||||||
case DB_OPTION_SINGLE_STABLE:
|
case DB_OPTION_SINGLE_STABLE:
|
||||||
((SDatabaseOptions*)pOptions)->singleStable = taosStr2Int8(((SToken*)pVal)->z, NULL, 10);
|
pDbOptions->singleStable = taosStr2Int8(((SToken*)pVal)->z, NULL, 10);
|
||||||
break;
|
break;
|
||||||
case DB_OPTION_RETENTIONS:
|
case DB_OPTION_RETENTIONS:
|
||||||
((SDatabaseOptions*)pOptions)->pRetentions = pVal;
|
pDbOptions->pRetentions = pVal;
|
||||||
break;
|
break;
|
||||||
case DB_OPTION_WAL_RETENTION_PERIOD:
|
case DB_OPTION_WAL_RETENTION_PERIOD:
|
||||||
((SDatabaseOptions*)pOptions)->walRetentionPeriod = taosStr2Int32(((SToken*)pVal)->z, NULL, 10);
|
pDbOptions->walRetentionPeriod = taosStr2Int32(((SToken*)pVal)->z, NULL, 10);
|
||||||
|
pDbOptions->walRetentionPeriodIsSet = true;
|
||||||
break;
|
break;
|
||||||
case DB_OPTION_WAL_RETENTION_SIZE:
|
case DB_OPTION_WAL_RETENTION_SIZE:
|
||||||
((SDatabaseOptions*)pOptions)->walRetentionSize = taosStr2Int32(((SToken*)pVal)->z, NULL, 10);
|
pDbOptions->walRetentionSize = taosStr2Int32(((SToken*)pVal)->z, NULL, 10);
|
||||||
|
pDbOptions->walRetentionSizeIsSet = true;
|
||||||
break;
|
break;
|
||||||
case DB_OPTION_WAL_ROLL_PERIOD:
|
case DB_OPTION_WAL_ROLL_PERIOD:
|
||||||
((SDatabaseOptions*)pOptions)->walRollPeriod = taosStr2Int32(((SToken*)pVal)->z, NULL, 10);
|
pDbOptions->walRollPeriod = taosStr2Int32(((SToken*)pVal)->z, NULL, 10);
|
||||||
|
pDbOptions->walRollPeriodIsSet = true;
|
||||||
break;
|
break;
|
||||||
case DB_OPTION_WAL_SEGMENT_SIZE:
|
case DB_OPTION_WAL_SEGMENT_SIZE:
|
||||||
((SDatabaseOptions*)pOptions)->walSegmentSize = taosStr2Int32(((SToken*)pVal)->z, NULL, 10);
|
pDbOptions->walSegmentSize = taosStr2Int32(((SToken*)pVal)->z, NULL, 10);
|
||||||
|
break;
|
||||||
|
case DB_OPTION_SST_TRIGGER:
|
||||||
|
pDbOptions->sstTrigger = taosStr2Int32(((SToken*)pVal)->z, NULL, 10);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -1317,6 +1339,15 @@ SNode* createShowDnodeVariablesStmt(SAstCreateContext* pCxt, SNode* pDnodeId) {
|
||||||
return (SNode*)pStmt;
|
return (SNode*)pStmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SNode* createShowVnodesStmt(SAstCreateContext* pCxt, SNode* pDnodeId, SNode* pDnodeEndpoint) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
|
SShowVnodesStmt* pStmt = (SShowVnodesStmt*)nodesMakeNode(QUERY_NODE_SHOW_VNODES_STMT);
|
||||||
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
|
pStmt->pDnodeId = pDnodeId;
|
||||||
|
pStmt->pDnodeEndpoint = pDnodeEndpoint;
|
||||||
|
return (SNode*)pStmt;
|
||||||
|
}
|
||||||
|
|
||||||
SNode* createCreateUserStmt(SAstCreateContext* pCxt, SToken* pUserName, const SToken* pPassword, int8_t sysinfo) {
|
SNode* createCreateUserStmt(SAstCreateContext* pCxt, SToken* pUserName, const SToken* pPassword, int8_t sysinfo) {
|
||||||
CHECK_PARSER_STATUS(pCxt);
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
char password[TSDB_USET_PASSWORD_LEN] = {0};
|
char password[TSDB_USET_PASSWORD_LEN] = {0};
|
||||||
|
|
|
@ -464,6 +464,11 @@ static int32_t collectMetaKeyFromShowDnodeVariables(SCollectMetaKeyCxt* pCxt, SS
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t collectMetaKeyFromShowVnodes(SCollectMetaKeyCxt* pCxt, SShowVnodesStmt* pStmt) {
|
||||||
|
return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_VNODES,
|
||||||
|
pCxt->pMetaCache);
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t collectMetaKeyFromShowCreateDatabase(SCollectMetaKeyCxt* pCxt, SShowCreateDatabaseStmt* pStmt) {
|
static int32_t collectMetaKeyFromShowCreateDatabase(SCollectMetaKeyCxt* pCxt, SShowCreateDatabaseStmt* pStmt) {
|
||||||
return reserveDbCfgInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pCxt->pMetaCache);
|
return reserveDbCfgInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pCxt->pMetaCache);
|
||||||
}
|
}
|
||||||
|
@ -604,6 +609,8 @@ static int32_t collectMetaKeyFromQuery(SCollectMetaKeyCxt* pCxt, SNode* pStmt) {
|
||||||
return collectMetaKeyFromShowVariables(pCxt, (SShowStmt*)pStmt);
|
return collectMetaKeyFromShowVariables(pCxt, (SShowStmt*)pStmt);
|
||||||
case QUERY_NODE_SHOW_DNODE_VARIABLES_STMT:
|
case QUERY_NODE_SHOW_DNODE_VARIABLES_STMT:
|
||||||
return collectMetaKeyFromShowDnodeVariables(pCxt, (SShowDnodeVariablesStmt*)pStmt);
|
return collectMetaKeyFromShowDnodeVariables(pCxt, (SShowDnodeVariablesStmt*)pStmt);
|
||||||
|
case QUERY_NODE_SHOW_VNODES_STMT:
|
||||||
|
return collectMetaKeyFromShowVnodes(pCxt, (SShowVnodesStmt*)pStmt);
|
||||||
case QUERY_NODE_SHOW_CREATE_DATABASE_STMT:
|
case QUERY_NODE_SHOW_CREATE_DATABASE_STMT:
|
||||||
return collectMetaKeyFromShowCreateDatabase(pCxt, (SShowCreateDatabaseStmt*)pStmt);
|
return collectMetaKeyFromShowCreateDatabase(pCxt, (SShowCreateDatabaseStmt*)pStmt);
|
||||||
case QUERY_NODE_SHOW_CREATE_TABLE_STMT:
|
case QUERY_NODE_SHOW_CREATE_TABLE_STMT:
|
||||||
|
|
|
@ -2312,7 +2312,7 @@ static int32_t smlBoundColumnData(SArray* cols, SParsedDataColInfo* pColList, SS
|
||||||
SToken sToken = {.n = kv->keyLen, .z = (char*)kv->key};
|
SToken sToken = {.n = kv->keyLen, .z = (char*)kv->key};
|
||||||
col_id_t t = lastColIdx + 1;
|
col_id_t t = lastColIdx + 1;
|
||||||
col_id_t index = ((t == 0 && !isTag) ? 0 : findCol(&sToken, t, nCols, pSchema));
|
col_id_t index = ((t == 0 && !isTag) ? 0 : findCol(&sToken, t, nCols, pSchema));
|
||||||
uDebug("SML, index:%d, t:%d, ncols:%d, kv->name:%s", index, t, nCols, kv->key);
|
uDebug("SML, index:%d, t:%d, ncols:%d", index, t, nCols);
|
||||||
if (index < 0 && t > 0) {
|
if (index < 0 && t > 0) {
|
||||||
index = findCol(&sToken, 0, t, pSchema);
|
index = findCol(&sToken, 0, t, pSchema);
|
||||||
isOrdered = false;
|
isOrdered = false;
|
||||||
|
@ -2533,9 +2533,7 @@ int32_t smlBindData(void* handle, SArray* tags, SArray* colsSchema, SArray* cols
|
||||||
if (p) kv = *p;
|
if (p) kv = *p;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!kv || kv->length == 0) {
|
if (kv){
|
||||||
MemRowAppend(&pBuf, NULL, 0, ¶m);
|
|
||||||
} else {
|
|
||||||
int32_t colLen = kv->length;
|
int32_t colLen = kv->length;
|
||||||
if (pColSchema->type == TSDB_DATA_TYPE_TIMESTAMP) {
|
if (pColSchema->type == TSDB_DATA_TYPE_TIMESTAMP) {
|
||||||
// uError("SML:data before:%" PRId64 ", precision:%d", kv->i, pTableMeta->tableInfo.precision);
|
// uError("SML:data before:%" PRId64 ", precision:%d", kv->i, pTableMeta->tableInfo.precision);
|
||||||
|
@ -2548,6 +2546,8 @@ int32_t smlBindData(void* handle, SArray* tags, SArray* colsSchema, SArray* cols
|
||||||
} else {
|
} else {
|
||||||
MemRowAppend(&pBuf, &(kv->value), colLen, ¶m);
|
MemRowAppend(&pBuf, &(kv->value), colLen, ¶m);
|
||||||
}
|
}
|
||||||
|
}else{
|
||||||
|
pBuilder->hasNone = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PRIMARYKEY_TIMESTAMP_COL_ID == pColSchema->colId) {
|
if (PRIMARYKEY_TIMESTAMP_COL_ID == pColSchema->colId) {
|
||||||
|
|
|
@ -187,6 +187,7 @@ static SKeyword keywordTable[] = {
|
||||||
{"SNODES", TK_SNODES},
|
{"SNODES", TK_SNODES},
|
||||||
{"SOFFSET", TK_SOFFSET},
|
{"SOFFSET", TK_SOFFSET},
|
||||||
{"SPLIT", TK_SPLIT},
|
{"SPLIT", TK_SPLIT},
|
||||||
|
{"SST_TRIGGER", TK_SST_TRIGGER},
|
||||||
{"STABLE", TK_STABLE},
|
{"STABLE", TK_STABLE},
|
||||||
{"STABLES", TK_STABLES},
|
{"STABLES", TK_STABLES},
|
||||||
{"STATE", TK_STATE},
|
{"STATE", TK_STATE},
|
||||||
|
@ -228,6 +229,7 @@ static SKeyword keywordTable[] = {
|
||||||
{"VERBOSE", TK_VERBOSE},
|
{"VERBOSE", TK_VERBOSE},
|
||||||
{"VGROUP", TK_VGROUP},
|
{"VGROUP", TK_VGROUP},
|
||||||
{"VGROUPS", TK_VGROUPS},
|
{"VGROUPS", TK_VGROUPS},
|
||||||
|
{"VNODES", TK_VNODES},
|
||||||
{"WAL_FSYNC_PERIOD", TK_WAL_FSYNC_PERIOD},
|
{"WAL_FSYNC_PERIOD", TK_WAL_FSYNC_PERIOD},
|
||||||
{"WAL_LEVEL", TK_WAL_LEVEL},
|
{"WAL_LEVEL", TK_WAL_LEVEL},
|
||||||
{"WAL_RETENTION_PERIOD", TK_WAL_RETENTION_PERIOD},
|
{"WAL_RETENTION_PERIOD", TK_WAL_RETENTION_PERIOD},
|
||||||
|
|
|
@ -245,6 +245,12 @@ static const SSysTableShowAdapter sysTableShowAdapter[] = {
|
||||||
.numOfShowCols = 1,
|
.numOfShowCols = 1,
|
||||||
.pShowCols = {"*"}
|
.pShowCols = {"*"}
|
||||||
},
|
},
|
||||||
|
{ .showType = QUERY_NODE_SHOW_VNODES_STMT,
|
||||||
|
.pDbName = TSDB_INFORMATION_SCHEMA_DB,
|
||||||
|
.pTableName = TSDB_INS_TABLE_VNODES,
|
||||||
|
.numOfShowCols = 1,
|
||||||
|
.pShowCols = {"*"}
|
||||||
|
},
|
||||||
};
|
};
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
|
@ -3476,6 +3482,7 @@ static int32_t buildCreateDbReq(STranslateContext* pCxt, SCreateDatabaseStmt* pS
|
||||||
pReq->walRetentionSize = pStmt->pOptions->walRetentionSize;
|
pReq->walRetentionSize = pStmt->pOptions->walRetentionSize;
|
||||||
pReq->walRollPeriod = pStmt->pOptions->walRollPeriod;
|
pReq->walRollPeriod = pStmt->pOptions->walRollPeriod;
|
||||||
pReq->walSegmentSize = pStmt->pOptions->walSegmentSize;
|
pReq->walSegmentSize = pStmt->pOptions->walSegmentSize;
|
||||||
|
pReq->sstTrigger = pStmt->pOptions->sstTrigger;
|
||||||
pReq->ignoreExist = pStmt->ignoreExists;
|
pReq->ignoreExist = pStmt->ignoreExists;
|
||||||
return buildCreateDbRetentions(pStmt->pOptions->pRetentions, pReq);
|
return buildCreateDbRetentions(pStmt->pOptions->pRetentions, pReq);
|
||||||
}
|
}
|
||||||
|
@ -3760,6 +3767,9 @@ static int32_t checkDatabaseOptions(STranslateContext* pCxt, const char* pDbName
|
||||||
code =
|
code =
|
||||||
checkDbRangeOption(pCxt, "walSegmentSize", pOptions->walSegmentSize, TSDB_DB_MIN_WAL_SEGMENT_SIZE, INT32_MAX);
|
checkDbRangeOption(pCxt, "walSegmentSize", pOptions->walSegmentSize, TSDB_DB_MIN_WAL_SEGMENT_SIZE, INT32_MAX);
|
||||||
}
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = checkDbRangeOption(pCxt, "sstTrigger", pOptions->sstTrigger, TSDB_MIN_SST_TRIGGER, TSDB_MAX_SST_TRIGGER);
|
||||||
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = checkOptionsDependency(pCxt, pDbName, pOptions);
|
code = checkOptionsDependency(pCxt, pDbName, pOptions);
|
||||||
}
|
}
|
||||||
|
@ -3833,6 +3843,7 @@ static void buildAlterDbReq(STranslateContext* pCxt, SAlterDatabaseStmt* pStmt,
|
||||||
pReq->cacheLast = pStmt->pOptions->cacheModel;
|
pReq->cacheLast = pStmt->pOptions->cacheModel;
|
||||||
pReq->cacheLastSize = pStmt->pOptions->cacheLastSize;
|
pReq->cacheLastSize = pStmt->pOptions->cacheLastSize;
|
||||||
pReq->replications = pStmt->pOptions->replica;
|
pReq->replications = pStmt->pOptions->replica;
|
||||||
|
pReq->sstTrigger = pStmt->pOptions->sstTrigger;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5837,6 +5848,25 @@ static int32_t rewriteShowDnodeVariables(STranslateContext* pCxt, SQuery* pQuery
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t rewriteShowVnodes(STranslateContext* pCxt, SQuery* pQuery) {
|
||||||
|
SShowVnodesStmt* pShow = (SShowVnodesStmt*)(pQuery->pRoot);
|
||||||
|
SSelectStmt* pStmt = NULL;
|
||||||
|
int32_t code = createSelectStmtForShow(QUERY_NODE_SHOW_VNODES_STMT, &pStmt);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
if (NULL != pShow->pDnodeId) {
|
||||||
|
code = createOperatorNode(OP_TYPE_EQUAL, "dnode_id", pShow->pDnodeId, &pStmt->pWhere);
|
||||||
|
} else {
|
||||||
|
code = createOperatorNode(OP_TYPE_EQUAL, "dnode_endpoint", pShow->pDnodeEndpoint, &pStmt->pWhere);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
pQuery->showRewrite = true;
|
||||||
|
nodesDestroyNode(pQuery->pRoot);
|
||||||
|
pQuery->pRoot = (SNode*)pStmt;
|
||||||
|
}
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
static SNode* createBlockDistInfoFunc() {
|
static SNode* createBlockDistInfoFunc() {
|
||||||
SFunctionNode* pFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION);
|
SFunctionNode* pFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION);
|
||||||
if (NULL == pFunc) {
|
if (NULL == pFunc) {
|
||||||
|
@ -6408,7 +6438,8 @@ typedef struct SVgroupDropTableBatch {
|
||||||
char dbName[TSDB_DB_NAME_LEN];
|
char dbName[TSDB_DB_NAME_LEN];
|
||||||
} SVgroupDropTableBatch;
|
} SVgroupDropTableBatch;
|
||||||
|
|
||||||
static void addDropTbReqIntoVgroup(SHashObj* pVgroupHashmap, SDropTableClause* pClause, SVgroupInfo* pVgInfo, uint64_t suid) {
|
static void addDropTbReqIntoVgroup(SHashObj* pVgroupHashmap, SDropTableClause* pClause, SVgroupInfo* pVgInfo,
|
||||||
|
uint64_t suid) {
|
||||||
SVDropTbReq req = {.name = pClause->tableName, .suid = suid, .igNotExists = pClause->ignoreNotExists};
|
SVDropTbReq req = {.name = pClause->tableName, .suid = suid, .igNotExists = pClause->ignoreNotExists};
|
||||||
SVgroupDropTableBatch* pTableBatch = taosHashGet(pVgroupHashmap, &pVgInfo->vgId, sizeof(pVgInfo->vgId));
|
SVgroupDropTableBatch* pTableBatch = taosHashGet(pVgroupHashmap, &pVgInfo->vgId, sizeof(pVgInfo->vgId));
|
||||||
if (NULL == pTableBatch) {
|
if (NULL == pTableBatch) {
|
||||||
|
@ -6946,6 +6977,9 @@ static int32_t rewriteQuery(STranslateContext* pCxt, SQuery* pQuery) {
|
||||||
case QUERY_NODE_SHOW_DNODE_VARIABLES_STMT:
|
case QUERY_NODE_SHOW_DNODE_VARIABLES_STMT:
|
||||||
code = rewriteShowDnodeVariables(pCxt, pQuery);
|
code = rewriteShowDnodeVariables(pCxt, pQuery);
|
||||||
break;
|
break;
|
||||||
|
case QUERY_NODE_SHOW_VNODES_STMT:
|
||||||
|
code = rewriteShowVnodes(pCxt, pQuery);
|
||||||
|
break;
|
||||||
case QUERY_NODE_SHOW_TABLE_DISTRIBUTED_STMT:
|
case QUERY_NODE_SHOW_TABLE_DISTRIBUTED_STMT:
|
||||||
code = rewriteShowTableDist(pCxt, pQuery);
|
code = rewriteShowTableDist(pCxt, pQuery);
|
||||||
break;
|
break;
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -32,100 +32,59 @@
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
void generateInformationSchema(MockCatalogService* mcs) {
|
void generateInformationSchema(MockCatalogService* mcs) {
|
||||||
{
|
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_DNODES, TSDB_SYSTEM_TABLE, 1)
|
||||||
ITableBuilder& builder =
|
.addColumn("endpoint", TSDB_DATA_TYPE_BINARY, TSDB_EP_LEN)
|
||||||
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_DNODES, TSDB_SYSTEM_TABLE, 1)
|
.done();
|
||||||
.addColumn("endpoint", TSDB_DATA_TYPE_BINARY, TSDB_EP_LEN);
|
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_MNODES, TSDB_SYSTEM_TABLE, 1)
|
||||||
builder.done();
|
.addColumn("endpoint", TSDB_DATA_TYPE_BINARY, TSDB_EP_LEN)
|
||||||
}
|
.done();
|
||||||
{
|
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_MODULES, TSDB_SYSTEM_TABLE, 1)
|
||||||
ITableBuilder& builder =
|
.addColumn("endpoint", TSDB_DATA_TYPE_BINARY, TSDB_EP_LEN)
|
||||||
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_MNODES, TSDB_SYSTEM_TABLE, 1)
|
.done();
|
||||||
.addColumn("endpoint", TSDB_DATA_TYPE_BINARY, TSDB_EP_LEN);
|
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_QNODES, TSDB_SYSTEM_TABLE, 1)
|
||||||
builder.done();
|
.addColumn("endpoint", TSDB_DATA_TYPE_BINARY, TSDB_EP_LEN)
|
||||||
}
|
.done();
|
||||||
{
|
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_DATABASES, TSDB_SYSTEM_TABLE, 1)
|
||||||
ITableBuilder& builder =
|
.addColumn("name", TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN)
|
||||||
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_MODULES, TSDB_SYSTEM_TABLE, 1)
|
.done();
|
||||||
.addColumn("endpoint", TSDB_DATA_TYPE_BINARY, TSDB_EP_LEN);
|
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_FUNCTIONS, TSDB_SYSTEM_TABLE, 1)
|
||||||
builder.done();
|
.addColumn("name", TSDB_DATA_TYPE_BINARY, TSDB_FUNC_NAME_LEN)
|
||||||
}
|
.done();
|
||||||
{
|
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_INDEXES, TSDB_SYSTEM_TABLE, 3)
|
||||||
ITableBuilder& builder =
|
.addColumn("index_name", TSDB_DATA_TYPE_BINARY, TSDB_TABLE_NAME_LEN)
|
||||||
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_QNODES, TSDB_SYSTEM_TABLE, 1)
|
.addColumn("db_name", TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN)
|
||||||
.addColumn("endpoint", TSDB_DATA_TYPE_BINARY, TSDB_EP_LEN);
|
.addColumn("table_name", TSDB_DATA_TYPE_BINARY, TSDB_TABLE_NAME_LEN)
|
||||||
builder.done();
|
.done();
|
||||||
}
|
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_STABLES, TSDB_SYSTEM_TABLE, 2)
|
||||||
{
|
.addColumn("db_name", TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN)
|
||||||
ITableBuilder& builder =
|
.addColumn("stable_name", TSDB_DATA_TYPE_BINARY, TSDB_TABLE_NAME_LEN)
|
||||||
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_DATABASES, TSDB_SYSTEM_TABLE, 1)
|
.done();
|
||||||
.addColumn("name", TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN);
|
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_TABLES, TSDB_SYSTEM_TABLE, 2)
|
||||||
builder.done();
|
.addColumn("db_name", TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN)
|
||||||
}
|
.addColumn("table_name", TSDB_DATA_TYPE_BINARY, TSDB_TABLE_NAME_LEN)
|
||||||
{
|
.done();
|
||||||
ITableBuilder& builder =
|
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_TABLE_DISTRIBUTED, TSDB_SYSTEM_TABLE, 1)
|
||||||
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_FUNCTIONS, TSDB_SYSTEM_TABLE, 1)
|
.addColumn("db_name", TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN)
|
||||||
.addColumn("name", TSDB_DATA_TYPE_BINARY, TSDB_FUNC_NAME_LEN);
|
.done();
|
||||||
builder.done();
|
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_USERS, TSDB_SYSTEM_TABLE, 1)
|
||||||
}
|
.addColumn("name", TSDB_DATA_TYPE_BINARY, TSDB_USER_LEN)
|
||||||
{
|
.done();
|
||||||
ITableBuilder& builder =
|
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_VGROUPS, TSDB_SYSTEM_TABLE, 1)
|
||||||
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_INDEXES, TSDB_SYSTEM_TABLE, 3)
|
.addColumn("db_name", TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN)
|
||||||
.addColumn("index_name", TSDB_DATA_TYPE_BINARY, TSDB_TABLE_NAME_LEN)
|
.done();
|
||||||
.addColumn("db_name", TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN)
|
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_CONFIGS, TSDB_SYSTEM_TABLE, 1)
|
||||||
.addColumn("table_name", TSDB_DATA_TYPE_BINARY, TSDB_TABLE_NAME_LEN);
|
.addColumn("name", TSDB_DATA_TYPE_BINARY, TSDB_CONFIG_OPTION_LEN)
|
||||||
builder.done();
|
.done();
|
||||||
}
|
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_DNODE_VARIABLES, TSDB_SYSTEM_TABLE, 1)
|
||||||
{
|
.addColumn("dnode_id", TSDB_DATA_TYPE_INT)
|
||||||
ITableBuilder& builder =
|
.done();
|
||||||
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_STABLES, TSDB_SYSTEM_TABLE, 2)
|
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_CLUSTER, TSDB_SYSTEM_TABLE, 1)
|
||||||
.addColumn("db_name", TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN)
|
.addColumn("name", TSDB_DATA_TYPE_BINARY, TSDB_CLUSTER_ID_LEN)
|
||||||
.addColumn("stable_name", TSDB_DATA_TYPE_BINARY, TSDB_TABLE_NAME_LEN);
|
.done();
|
||||||
builder.done();
|
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_VNODES, TSDB_SYSTEM_TABLE, 2)
|
||||||
}
|
.addColumn("dnode_id", TSDB_DATA_TYPE_INT)
|
||||||
{
|
.addColumn("dnode_endpoint", TSDB_DATA_TYPE_BINARY, TSDB_EP_LEN)
|
||||||
ITableBuilder& builder =
|
.done();
|
||||||
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_TABLES, TSDB_SYSTEM_TABLE, 2)
|
|
||||||
.addColumn("db_name", TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN)
|
|
||||||
.addColumn("table_name", TSDB_DATA_TYPE_BINARY, TSDB_TABLE_NAME_LEN);
|
|
||||||
builder.done();
|
|
||||||
}
|
|
||||||
{
|
|
||||||
ITableBuilder& builder =
|
|
||||||
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_TABLE_DISTRIBUTED, TSDB_SYSTEM_TABLE, 1)
|
|
||||||
.addColumn("db_name", TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN);
|
|
||||||
builder.done();
|
|
||||||
}
|
|
||||||
{
|
|
||||||
ITableBuilder& builder =
|
|
||||||
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_USERS, TSDB_SYSTEM_TABLE, 1)
|
|
||||||
.addColumn("name", TSDB_DATA_TYPE_BINARY, TSDB_USER_LEN);
|
|
||||||
builder.done();
|
|
||||||
}
|
|
||||||
{
|
|
||||||
ITableBuilder& builder =
|
|
||||||
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_VGROUPS, TSDB_SYSTEM_TABLE, 1)
|
|
||||||
.addColumn("db_name", TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN);
|
|
||||||
builder.done();
|
|
||||||
}
|
|
||||||
{
|
|
||||||
ITableBuilder& builder =
|
|
||||||
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_CONFIGS, TSDB_SYSTEM_TABLE, 1)
|
|
||||||
.addColumn("name", TSDB_DATA_TYPE_BINARY, TSDB_CONFIG_OPTION_LEN);
|
|
||||||
builder.done();
|
|
||||||
}
|
|
||||||
{
|
|
||||||
ITableBuilder& builder =
|
|
||||||
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_DNODE_VARIABLES, TSDB_SYSTEM_TABLE, 1)
|
|
||||||
.addColumn("dnode_id", TSDB_DATA_TYPE_INT);
|
|
||||||
builder.done();
|
|
||||||
}
|
|
||||||
{
|
|
||||||
ITableBuilder& builder =
|
|
||||||
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_CLUSTER, TSDB_SYSTEM_TABLE, 1)
|
|
||||||
.addColumn("name", TSDB_DATA_TYPE_BINARY, TSDB_CLUSTER_ID_LEN);
|
|
||||||
builder.done();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void generatePerformanceSchema(MockCatalogService* mcs) {
|
void generatePerformanceSchema(MockCatalogService* mcs) {
|
||||||
|
|
|
@ -88,6 +88,7 @@ TEST_F(ParserInitialATest, alterDnode) {
|
||||||
* | REPLICA int_value -- todo: enum 1, 3, default 1, unit replica
|
* | REPLICA int_value -- todo: enum 1, 3, default 1, unit replica
|
||||||
* | STRICT {'off' | 'on'} -- todo: default 'off'
|
* | STRICT {'off' | 'on'} -- todo: default 'off'
|
||||||
* | WAL_LEVEL int_value -- enum 1, 2, default 1
|
* | WAL_LEVEL int_value -- enum 1, 2, default 1
|
||||||
|
* | SST_TRIGGER int_value -- rang [1, 128], default 8
|
||||||
* }
|
* }
|
||||||
*/
|
*/
|
||||||
TEST_F(ParserInitialATest, alterDatabase) {
|
TEST_F(ParserInitialATest, alterDatabase) {
|
||||||
|
@ -112,6 +113,7 @@ TEST_F(ParserInitialATest, alterDatabase) {
|
||||||
expect.cacheLast = -1;
|
expect.cacheLast = -1;
|
||||||
expect.cacheLastSize = -1;
|
expect.cacheLastSize = -1;
|
||||||
expect.replications = -1;
|
expect.replications = -1;
|
||||||
|
expect.sstTrigger = -1;
|
||||||
};
|
};
|
||||||
auto setAlterDbBuffer = [&](int32_t buffer) { expect.buffer = buffer; };
|
auto setAlterDbBuffer = [&](int32_t buffer) { expect.buffer = buffer; };
|
||||||
auto setAlterDbPageSize = [&](int32_t pageSize) { expect.pageSize = pageSize; };
|
auto setAlterDbPageSize = [&](int32_t pageSize) { expect.pageSize = pageSize; };
|
||||||
|
@ -128,6 +130,7 @@ TEST_F(ParserInitialATest, alterDatabase) {
|
||||||
auto setAlterDbStrict = [&](int8_t strict) { expect.strict = strict; };
|
auto setAlterDbStrict = [&](int8_t strict) { expect.strict = strict; };
|
||||||
auto setAlterDbCacheModel = [&](int8_t cacheModel) { expect.cacheLast = cacheModel; };
|
auto setAlterDbCacheModel = [&](int8_t cacheModel) { expect.cacheLast = cacheModel; };
|
||||||
auto setAlterDbReplica = [&](int8_t replications) { expect.replications = replications; };
|
auto setAlterDbReplica = [&](int8_t replications) { expect.replications = replications; };
|
||||||
|
auto setAlterDbSstTrigger = [&](int8_t sstTrigger) { expect.sstTrigger = sstTrigger; };
|
||||||
|
|
||||||
setCheckDdlFunc([&](const SQuery* pQuery, ParserStage stage) {
|
setCheckDdlFunc([&](const SQuery* pQuery, ParserStage stage) {
|
||||||
ASSERT_EQ(nodeType(pQuery->pRoot), QUERY_NODE_ALTER_DATABASE_STMT);
|
ASSERT_EQ(nodeType(pQuery->pRoot), QUERY_NODE_ALTER_DATABASE_STMT);
|
||||||
|
@ -146,6 +149,7 @@ TEST_F(ParserInitialATest, alterDatabase) {
|
||||||
ASSERT_EQ(req.strict, expect.strict);
|
ASSERT_EQ(req.strict, expect.strict);
|
||||||
ASSERT_EQ(req.cacheLast, expect.cacheLast);
|
ASSERT_EQ(req.cacheLast, expect.cacheLast);
|
||||||
ASSERT_EQ(req.replications, expect.replications);
|
ASSERT_EQ(req.replications, expect.replications);
|
||||||
|
ASSERT_EQ(req.sstTrigger, expect.sstTrigger);
|
||||||
});
|
});
|
||||||
|
|
||||||
const int32_t MINUTE_PER_DAY = MILLISECOND_PER_DAY / MILLISECOND_PER_MINUTE;
|
const int32_t MINUTE_PER_DAY = MILLISECOND_PER_DAY / MILLISECOND_PER_MINUTE;
|
||||||
|
@ -157,7 +161,8 @@ TEST_F(ParserInitialATest, alterDatabase) {
|
||||||
setAlterDbFsync(200);
|
setAlterDbFsync(200);
|
||||||
setAlterDbWal(1);
|
setAlterDbWal(1);
|
||||||
setAlterDbCacheModel(TSDB_CACHE_MODEL_LAST_ROW);
|
setAlterDbCacheModel(TSDB_CACHE_MODEL_LAST_ROW);
|
||||||
run("ALTER DATABASE test CACHEMODEL 'last_row' CACHESIZE 32 WAL_FSYNC_PERIOD 200 KEEP 10 WAL_LEVEL 1");
|
setAlterDbSstTrigger(20);
|
||||||
|
run("ALTER DATABASE test CACHEMODEL 'last_row' CACHESIZE 32 WAL_FSYNC_PERIOD 200 KEEP 10 WAL_LEVEL 1 SST_TRIGGER 20");
|
||||||
clearAlterDbReq();
|
clearAlterDbReq();
|
||||||
|
|
||||||
initAlterDb("test");
|
initAlterDb("test");
|
||||||
|
@ -231,6 +236,8 @@ TEST_F(ParserInitialATest, alterDatabaseSemanticCheck) {
|
||||||
run("ALTER DATABASE test KEEP 1w", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
run("ALTER DATABASE test KEEP 1w", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
||||||
run("ALTER DATABASE test WAL_LEVEL 0", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
run("ALTER DATABASE test WAL_LEVEL 0", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
||||||
run("ALTER DATABASE test WAL_LEVEL 3", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
run("ALTER DATABASE test WAL_LEVEL 3", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
||||||
|
run("ALTER DATABASE test SST_TRIGGER 0", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
||||||
|
run("ALTER DATABASE test SST_TRIGGER 129", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
||||||
// Regardless of the specific sentence
|
// Regardless of the specific sentence
|
||||||
run("ALTER DATABASE db WAL_LEVEL 0 # td-14436", TSDB_CODE_PAR_SYNTAX_ERROR, PARSER_STAGE_PARSE);
|
run("ALTER DATABASE db WAL_LEVEL 0 # td-14436", TSDB_CODE_PAR_SYNTAX_ERROR, PARSER_STAGE_PARSE);
|
||||||
}
|
}
|
||||||
|
|
|
@ -111,10 +111,11 @@ TEST_F(ParserInitialCTest, createDatabase) {
|
||||||
expect.numOfVgroups = TSDB_DEFAULT_VN_PER_DB;
|
expect.numOfVgroups = TSDB_DEFAULT_VN_PER_DB;
|
||||||
expect.numOfStables = TSDB_DEFAULT_DB_SINGLE_STABLE;
|
expect.numOfStables = TSDB_DEFAULT_DB_SINGLE_STABLE;
|
||||||
expect.schemaless = TSDB_DEFAULT_DB_SCHEMALESS;
|
expect.schemaless = TSDB_DEFAULT_DB_SCHEMALESS;
|
||||||
expect.walRetentionPeriod = TSDB_DEFAULT_DB_WAL_RETENTION_PERIOD;
|
expect.walRetentionPeriod = TSDB_REP_DEF_DB_WAL_RET_PERIOD;
|
||||||
expect.walRetentionSize = TSDB_DEFAULT_DB_WAL_RETENTION_SIZE;
|
expect.walRetentionSize = TSDB_REP_DEF_DB_WAL_RET_SIZE;
|
||||||
expect.walRollPeriod = TSDB_DEFAULT_DB_WAL_ROLL_PERIOD;
|
expect.walRollPeriod = TSDB_REP_DEF_DB_WAL_ROLL_PERIOD;
|
||||||
expect.walSegmentSize = TSDB_DEFAULT_DB_WAL_SEGMENT_SIZE;
|
expect.walSegmentSize = TSDB_DEFAULT_DB_WAL_SEGMENT_SIZE;
|
||||||
|
expect.sstTrigger = TSDB_DEFAULT_SST_TRIGGER;
|
||||||
};
|
};
|
||||||
|
|
||||||
auto setDbBufferFunc = [&](int32_t buffer) { expect.buffer = buffer; };
|
auto setDbBufferFunc = [&](int32_t buffer) { expect.buffer = buffer; };
|
||||||
|
@ -155,6 +156,7 @@ TEST_F(ParserInitialCTest, createDatabase) {
|
||||||
auto setDbWalRetentionSize = [&](int32_t walRetentionSize) { expect.walRetentionSize = walRetentionSize; };
|
auto setDbWalRetentionSize = [&](int32_t walRetentionSize) { expect.walRetentionSize = walRetentionSize; };
|
||||||
auto setDbWalRollPeriod = [&](int32_t walRollPeriod) { expect.walRollPeriod = walRollPeriod; };
|
auto setDbWalRollPeriod = [&](int32_t walRollPeriod) { expect.walRollPeriod = walRollPeriod; };
|
||||||
auto setDbWalSegmentSize = [&](int32_t walSegmentSize) { expect.walSegmentSize = walSegmentSize; };
|
auto setDbWalSegmentSize = [&](int32_t walSegmentSize) { expect.walSegmentSize = walSegmentSize; };
|
||||||
|
auto setDbSstTrigger = [&](int32_t sstTrigger) { expect.sstTrigger = sstTrigger; };
|
||||||
|
|
||||||
setCheckDdlFunc([&](const SQuery* pQuery, ParserStage stage) {
|
setCheckDdlFunc([&](const SQuery* pQuery, ParserStage stage) {
|
||||||
ASSERT_EQ(nodeType(pQuery->pRoot), QUERY_NODE_CREATE_DATABASE_STMT);
|
ASSERT_EQ(nodeType(pQuery->pRoot), QUERY_NODE_CREATE_DATABASE_STMT);
|
||||||
|
@ -185,7 +187,7 @@ TEST_F(ParserInitialCTest, createDatabase) {
|
||||||
ASSERT_EQ(req.walRetentionSize, expect.walRetentionSize);
|
ASSERT_EQ(req.walRetentionSize, expect.walRetentionSize);
|
||||||
ASSERT_EQ(req.walRollPeriod, expect.walRollPeriod);
|
ASSERT_EQ(req.walRollPeriod, expect.walRollPeriod);
|
||||||
ASSERT_EQ(req.walSegmentSize, expect.walSegmentSize);
|
ASSERT_EQ(req.walSegmentSize, expect.walSegmentSize);
|
||||||
// ASSERT_EQ(req.schemaless, expect.schemaless);
|
ASSERT_EQ(req.sstTrigger, expect.sstTrigger);
|
||||||
ASSERT_EQ(req.ignoreExist, expect.ignoreExist);
|
ASSERT_EQ(req.ignoreExist, expect.ignoreExist);
|
||||||
ASSERT_EQ(req.numOfRetensions, expect.numOfRetensions);
|
ASSERT_EQ(req.numOfRetensions, expect.numOfRetensions);
|
||||||
if (expect.numOfRetensions > 0) {
|
if (expect.numOfRetensions > 0) {
|
||||||
|
@ -233,6 +235,7 @@ TEST_F(ParserInitialCTest, createDatabase) {
|
||||||
setDbWalRetentionSize(-1);
|
setDbWalRetentionSize(-1);
|
||||||
setDbWalRollPeriod(10);
|
setDbWalRollPeriod(10);
|
||||||
setDbWalSegmentSize(20);
|
setDbWalSegmentSize(20);
|
||||||
|
setDbSstTrigger(16);
|
||||||
run("CREATE DATABASE IF NOT EXISTS wxy_db "
|
run("CREATE DATABASE IF NOT EXISTS wxy_db "
|
||||||
"BUFFER 64 "
|
"BUFFER 64 "
|
||||||
"CACHEMODEL 'last_value' "
|
"CACHEMODEL 'last_value' "
|
||||||
|
@ -256,7 +259,8 @@ TEST_F(ParserInitialCTest, createDatabase) {
|
||||||
"WAL_RETENTION_PERIOD -1 "
|
"WAL_RETENTION_PERIOD -1 "
|
||||||
"WAL_RETENTION_SIZE -1 "
|
"WAL_RETENTION_SIZE -1 "
|
||||||
"WAL_ROLL_PERIOD 10 "
|
"WAL_ROLL_PERIOD 10 "
|
||||||
"WAL_SEGMENT_SIZE 20");
|
"WAL_SEGMENT_SIZE 20 "
|
||||||
|
"SST_TRIGGER 16");
|
||||||
clearCreateDbReq();
|
clearCreateDbReq();
|
||||||
|
|
||||||
setCreateDbReqFunc("wxy_db", 1);
|
setCreateDbReqFunc("wxy_db", 1);
|
||||||
|
@ -266,6 +270,14 @@ TEST_F(ParserInitialCTest, createDatabase) {
|
||||||
"DURATION 100m "
|
"DURATION 100m "
|
||||||
"KEEP 1440m,300h,400d ");
|
"KEEP 1440m,300h,400d ");
|
||||||
clearCreateDbReq();
|
clearCreateDbReq();
|
||||||
|
|
||||||
|
setCreateDbReqFunc("wxy_db", 1);
|
||||||
|
setDbReplicaFunc(3);
|
||||||
|
setDbWalRetentionPeriod(TSDB_REPS_DEF_DB_WAL_RET_PERIOD);
|
||||||
|
setDbWalRetentionSize(TSDB_REPS_DEF_DB_WAL_RET_SIZE);
|
||||||
|
setDbWalRollPeriod(TSDB_REPS_DEF_DB_WAL_ROLL_PERIOD);
|
||||||
|
run("CREATE DATABASE IF NOT EXISTS wxy_db REPLICA 3");
|
||||||
|
clearCreateDbReq();
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserInitialCTest, createDatabaseSemanticCheck) {
|
TEST_F(ParserInitialCTest, createDatabaseSemanticCheck) {
|
||||||
|
|
|
@ -218,7 +218,13 @@ TEST_F(ParserShowToUseTest, showVgroups) {
|
||||||
run("SHOW test.vgroups");
|
run("SHOW test.vgroups");
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo SHOW vnodes
|
TEST_F(ParserShowToUseTest, showVnodes) {
|
||||||
|
useDb("root", "test");
|
||||||
|
|
||||||
|
run("SHOW VNODES 1");
|
||||||
|
|
||||||
|
run("SHOW VNODES 'node1:7030'");
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(ParserShowToUseTest, splitVgroup) {
|
TEST_F(ParserShowToUseTest, splitVgroup) {
|
||||||
useDb("root", "test");
|
useDb("root", "test");
|
||||||
|
|
|
@ -160,6 +160,66 @@ int32_t taosMulMkDir(const char *dirname) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t taosMulModeMkDir(const char *dirname, int mode) {
|
||||||
|
if (dirname == NULL) return -1;
|
||||||
|
char temp[1024];
|
||||||
|
char *pos = temp;
|
||||||
|
int32_t code = 0;
|
||||||
|
#ifdef WINDOWS
|
||||||
|
taosRealPath(dirname, temp, sizeof(temp));
|
||||||
|
if (temp[1] == ':') pos += 3;
|
||||||
|
#else
|
||||||
|
strcpy(temp, dirname);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (taosDirExist(temp)) {
|
||||||
|
chmod(temp, mode);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strncmp(temp, TD_DIRSEP, 1) == 0) {
|
||||||
|
pos += 1;
|
||||||
|
} else if (strncmp(temp, "." TD_DIRSEP, 2) == 0) {
|
||||||
|
pos += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (; *pos != '\0'; pos++) {
|
||||||
|
if (*pos == TD_DIRSEP[0]) {
|
||||||
|
*pos = '\0';
|
||||||
|
#ifdef WINDOWS
|
||||||
|
code = _mkdir(temp, mode);
|
||||||
|
#else
|
||||||
|
code = mkdir(temp, mode);
|
||||||
|
#endif
|
||||||
|
if (code < 0 && errno != EEXIST) {
|
||||||
|
terrno = TAOS_SYSTEM_ERROR(errno);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
*pos = TD_DIRSEP[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*(pos - 1) != TD_DIRSEP[0]) {
|
||||||
|
#ifdef WINDOWS
|
||||||
|
code = _mkdir(temp, mode);
|
||||||
|
#else
|
||||||
|
code = mkdir(temp, mode);
|
||||||
|
#endif
|
||||||
|
if (code < 0 && errno != EEXIST) {
|
||||||
|
terrno = TAOS_SYSTEM_ERROR(errno);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (code < 0 && errno == EEXIST) {
|
||||||
|
chmod(temp, mode);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
chmod(temp, mode);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
void taosRemoveOldFiles(const char *dirname, int32_t keepDays) {
|
void taosRemoveOldFiles(const char *dirname, int32_t keepDays) {
|
||||||
TdDirPtr pDir = taosOpenDir(dirname);
|
TdDirPtr pDir = taosOpenDir(dirname);
|
||||||
if (pDir == NULL) return;
|
if (pDir == NULL) return;
|
||||||
|
|
|
@ -134,7 +134,6 @@ class TDTestCase:
|
||||||
os.system("%s -i ./taosdumptest/tmp -y" % binPath)
|
os.system("%s -i ./taosdumptest/tmp -y" % binPath)
|
||||||
|
|
||||||
tdSql.execute("use test")
|
tdSql.execute("use test")
|
||||||
tdSql.error("show vnodes '' ")
|
|
||||||
tdSql.query("show stables")
|
tdSql.query("show stables")
|
||||||
tdSql.checkRows(1)
|
tdSql.checkRows(1)
|
||||||
tdSql.checkData(0, 0, 'stb')
|
tdSql.checkData(0, 0, 'stb')
|
||||||
|
|
|
@ -53,7 +53,7 @@ class TDTestCase:
|
||||||
tdSql.query(f"select * from {dbname}.t_0799064f5487946e5d22164a822acfc8 order by _ts")
|
tdSql.query(f"select * from {dbname}.t_0799064f5487946e5d22164a822acfc8 order by _ts")
|
||||||
tdSql.checkRows(2)
|
tdSql.checkRows(2)
|
||||||
tdSql.checkData(0, 3, "kk")
|
tdSql.checkData(0, 3, "kk")
|
||||||
tdSql.checkData(1, 3, None)
|
tdSql.checkData(1, 3, "")
|
||||||
|
|
||||||
|
|
||||||
tdSql.query(f"select distinct tbname from {dbname}.`sys.if.bytes.out`")
|
tdSql.query(f"select distinct tbname from {dbname}.`sys.if.bytes.out`")
|
||||||
|
|
|
@ -63,6 +63,7 @@ int smlProcess_influx_Test() {
|
||||||
printf("%s result:%s\n", __FUNCTION__, taos_errstr(pRes));
|
printf("%s result:%s\n", __FUNCTION__, taos_errstr(pRes));
|
||||||
int code = taos_errno(pRes);
|
int code = taos_errno(pRes);
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1100,34 +1101,91 @@ int sml_add_tag_col_Test() {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int smlProcess_18784_Test() {
|
||||||
|
TAOS *taos = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
|
|
||||||
|
TAOS_RES *pRes = taos_query(taos, "create database if not exists sml_db schemaless 1");
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(taos, "use sml_db");
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
const char *sql[] = {
|
||||||
|
"disk,device=sdc inodes_used=176059i,total=1081101176832i 1661943960000000000",
|
||||||
|
"disk,device=sdc inodes_free=66932805i 1661943960000000000",
|
||||||
|
};
|
||||||
|
pRes = taos_schemaless_insert(taos, (char **)sql, sizeof(sql) / sizeof(sql[0]), TSDB_SML_LINE_PROTOCOL, 0);
|
||||||
|
printf("%s result:%s, rows:%d\n", __FUNCTION__, taos_errstr(pRes), taos_affected_rows(pRes));
|
||||||
|
int code = taos_errno(pRes);
|
||||||
|
ASSERT(!code);
|
||||||
|
ASSERT(taos_affected_rows(pRes) == 2);
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(taos, "select * from disk");
|
||||||
|
ASSERT(pRes);
|
||||||
|
int fieldNum = taos_field_count(pRes);
|
||||||
|
ASSERT(fieldNum == 5);
|
||||||
|
printf("fieldNum:%d\n", fieldNum);
|
||||||
|
TAOS_ROW row = NULL;
|
||||||
|
int32_t rowIndex = 0;
|
||||||
|
while((row = taos_fetch_row(pRes)) != NULL) {
|
||||||
|
int64_t ts = *(int64_t*)row[0];
|
||||||
|
int64_t used = *(int64_t*)row[1];
|
||||||
|
int64_t total = *(int64_t*)row[2];
|
||||||
|
int64_t freed = *(int64_t*)row[3];
|
||||||
|
if(rowIndex == 0){
|
||||||
|
ASSERT(ts == 1661943960000);
|
||||||
|
ASSERT(used == 176059);
|
||||||
|
ASSERT(total == 1081101176832);
|
||||||
|
ASSERT(freed == 66932805);
|
||||||
|
// ASSERT_EQ(latitude, 24.5208);
|
||||||
|
// ASSERT_EQ(longitude, 28.09377);
|
||||||
|
// ASSERT_EQ(elevation, 428);
|
||||||
|
// ASSERT_EQ(velocity, 0);
|
||||||
|
// ASSERT_EQ(heading, 304);
|
||||||
|
// ASSERT_EQ(grade, 0);
|
||||||
|
// ASSERT_EQ(fuel_consumption, 25);
|
||||||
|
}else{
|
||||||
|
// ASSERT(0);
|
||||||
|
}
|
||||||
|
rowIndex++;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
ret = smlProcess_influx_Test();
|
ret = smlProcess_influx_Test();
|
||||||
if(ret) return ret;
|
ASSERT(!ret);
|
||||||
ret = smlProcess_telnet_Test();
|
ret = smlProcess_telnet_Test();
|
||||||
if(ret) return ret;
|
ASSERT(!ret);
|
||||||
ret = smlProcess_json1_Test();
|
ret = smlProcess_json1_Test();
|
||||||
if(ret) return ret;
|
ASSERT(!ret);
|
||||||
ret = smlProcess_json2_Test();
|
ret = smlProcess_json2_Test();
|
||||||
if(ret) return ret;
|
ASSERT(!ret);
|
||||||
ret = smlProcess_json3_Test();
|
ret = smlProcess_json3_Test();
|
||||||
if(ret) return ret;
|
ASSERT(!ret);
|
||||||
ret = smlProcess_json4_Test();
|
ret = smlProcess_json4_Test();
|
||||||
if(ret) return ret;
|
ASSERT(!ret);
|
||||||
ret = sml_TD15662_Test();
|
ret = sml_TD15662_Test();
|
||||||
if(ret) return ret;
|
ASSERT(!ret);
|
||||||
ret = sml_TD15742_Test();
|
ret = sml_TD15742_Test();
|
||||||
if(ret) return ret;
|
ASSERT(!ret);
|
||||||
ret = sml_16384_Test();
|
ret = sml_16384_Test();
|
||||||
if(ret) return ret;
|
ASSERT(!ret);
|
||||||
ret = sml_oom_Test();
|
ret = sml_oom_Test();
|
||||||
if(ret) return ret;
|
ASSERT(!ret);
|
||||||
ret = sml_16368_Test();
|
ret = sml_16368_Test();
|
||||||
if(ret) return ret;
|
ASSERT(!ret);
|
||||||
ret = sml_dup_time_Test();
|
ret = sml_dup_time_Test();
|
||||||
if(ret) return ret;
|
ASSERT(!ret);
|
||||||
ret = sml_16960_Test();
|
ret = sml_16960_Test();
|
||||||
if(ret) return ret;
|
ASSERT(!ret);
|
||||||
ret = sml_add_tag_col_Test();
|
ret = sml_add_tag_col_Test();
|
||||||
|
ASSERT(!ret);
|
||||||
|
ret = smlProcess_18784_Test();
|
||||||
|
ASSERT(!ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue