Merge branch 'main' into enh/TD-22404-M
This commit is contained in:
commit
c1c1e72e21
|
@ -352,4 +352,4 @@ TDengine 提供了丰富的应用程序开发接口,其中包括 C/C++、Java
|
||||||
|
|
||||||
# 加入技术交流群
|
# 加入技术交流群
|
||||||
|
|
||||||
TDengine 官方社群「物联网大数据群」对外开放,欢迎您加入讨论。搜索微信号 "tdengine",加小 T 为好友,即可入群。
|
TDengine 官方社群「物联网大数据群」对外开放,欢迎您加入讨论。搜索微信号 "tdengine1",加小 T 为好友,即可入群。
|
||||||
|
|
|
@ -1484,14 +1484,23 @@ static int32_t setSelectValueColumnInfo(SqlFunctionCtx* pCtx, int32_t numOfOutpu
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SHashObj *pSelectFuncs = taosHashInit(8, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_ENTRY_LOCK);
|
||||||
for (int32_t i = 0; i < numOfOutput; ++i) {
|
for (int32_t i = 0; i < numOfOutput; ++i) {
|
||||||
const char* pName = pCtx[i].pExpr->pExpr->_function.functionName;
|
const char* pName = pCtx[i].pExpr->pExpr->_function.functionName;
|
||||||
if ((strcmp(pName, "_select_value") == 0) || (strcmp(pName, "_group_key") == 0)) {
|
if ((strcmp(pName, "_select_value") == 0) || (strcmp(pName, "_group_key") == 0)) {
|
||||||
pValCtx[num++] = &pCtx[i];
|
pValCtx[num++] = &pCtx[i];
|
||||||
} else if (fmIsSelectFunc(pCtx[i].functionId)) {
|
} else if (fmIsSelectFunc(pCtx[i].functionId)) {
|
||||||
p = &pCtx[i];
|
void* data = taosHashGet(pSelectFuncs, pName, strlen(pName));
|
||||||
|
if (taosHashGetSize(pSelectFuncs) != 0 && data == NULL) {
|
||||||
|
p = NULL;
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
taosHashPut(pSelectFuncs, pName, strlen(pName), &num, sizeof(num));
|
||||||
|
p = &pCtx[i];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
taosHashCleanup(pSelectFuncs);
|
||||||
|
|
||||||
if (p != NULL) {
|
if (p != NULL) {
|
||||||
p->subsidiaries.pCtx = pValCtx;
|
p->subsidiaries.pCtx = pValCtx;
|
||||||
|
|
|
@ -5326,7 +5326,8 @@ static int32_t checkAlterSuperTableBySchema(STranslateContext* pCxt, SAlterTable
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES == pStmt->alterType) {
|
if (TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES == pStmt->alterType) {
|
||||||
if (calcTypeBytes(pStmt->dataType) > TSDB_MAX_FIELD_LEN) {
|
if ((TSDB_DATA_TYPE_VARCHAR == pStmt->dataType.type && calcTypeBytes(pStmt->dataType) > TSDB_MAX_BINARY_LEN) ||
|
||||||
|
(TSDB_DATA_TYPE_NCHAR == pStmt->dataType.type && calcTypeBytes(pStmt->dataType) > TSDB_MAX_NCHAR_LEN)) {
|
||||||
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_VAR_COLUMN_LEN);
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_VAR_COLUMN_LEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5351,6 +5352,11 @@ static int32_t checkAlterSuperTableBySchema(STranslateContext* pCxt, SAlterTable
|
||||||
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_TOO_MANY_COLUMNS);
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_TOO_MANY_COLUMNS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((TSDB_DATA_TYPE_VARCHAR == pStmt->dataType.type && calcTypeBytes(pStmt->dataType) > TSDB_MAX_BINARY_LEN) ||
|
||||||
|
(TSDB_DATA_TYPE_NCHAR == pStmt->dataType.type && calcTypeBytes(pStmt->dataType) > TSDB_MAX_NCHAR_LEN)) {
|
||||||
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_VAR_COLUMN_LEN);
|
||||||
|
}
|
||||||
|
|
||||||
if (pTableMeta->tableInfo.rowSize + calcTypeBytes(pStmt->dataType) > TSDB_MAX_BYTES_PER_ROW) {
|
if (pTableMeta->tableInfo.rowSize + calcTypeBytes(pStmt->dataType) > TSDB_MAX_BYTES_PER_ROW) {
|
||||||
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_ROW_LENGTH, TSDB_MAX_BYTES_PER_ROW);
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_ROW_LENGTH, TSDB_MAX_BYTES_PER_ROW);
|
||||||
}
|
}
|
||||||
|
@ -8322,6 +8328,11 @@ static int32_t buildUpdateColReq(STranslateContext* pCxt, SAlterTableStmt* pStmt
|
||||||
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_MODIFY_COL);
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_MODIFY_COL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((TSDB_DATA_TYPE_VARCHAR == pStmt->dataType.type && calcTypeBytes(pStmt->dataType) > TSDB_MAX_BINARY_LEN) ||
|
||||||
|
(TSDB_DATA_TYPE_NCHAR == pStmt->dataType.type && calcTypeBytes(pStmt->dataType) > TSDB_MAX_NCHAR_LEN)) {
|
||||||
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_VAR_COLUMN_LEN);
|
||||||
|
}
|
||||||
|
|
||||||
if (pTableMeta->tableInfo.rowSize + pReq->colModBytes - pSchema->bytes > TSDB_MAX_BYTES_PER_ROW) {
|
if (pTableMeta->tableInfo.rowSize + pReq->colModBytes - pSchema->bytes > TSDB_MAX_BYTES_PER_ROW) {
|
||||||
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_ROW_LENGTH, TSDB_MAX_BYTES_PER_ROW);
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_ROW_LENGTH, TSDB_MAX_BYTES_PER_ROW);
|
||||||
}
|
}
|
||||||
|
|
|
@ -657,17 +657,34 @@ if $data20 != null then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
print =============== error
|
print =============== error for normal table
|
||||||
sql create table tb2023(ts timestamp, f int);
|
sql create table tb2023(ts timestamp, f int);
|
||||||
sql_error alter table tb2023 add column v varchar(16375);
|
sql_error alter table tb2023 add column v varchar(16375);
|
||||||
sql_error alter table tb2023 add column v varchar(16385);
|
sql_error alter table tb2023 add column v varchar(16385);
|
||||||
sql_error alter table tb2023 add column v varchar(33100);
|
sql_error alter table tb2023 add column v varchar(33100);
|
||||||
sql alter table tb2023 add column v varchar(16374);
|
sql alter table tb2023 add column v varchar(16374);
|
||||||
|
sql_error alter table tb2023 modify column v varchar(16375);
|
||||||
sql desc tb2023
|
sql desc tb2023
|
||||||
sql alter table tb2023 drop column v
|
sql alter table tb2023 drop column v
|
||||||
sql_error alter table tb2023 add column v nchar(4094);
|
sql_error alter table tb2023 add column v nchar(4094);
|
||||||
sql alter table tb2023 add column v nchar(4093);
|
sql alter table tb2023 add column v nchar(4093);
|
||||||
|
sql_error alter table tb2023 modify column v nchar(4094);
|
||||||
sql desc tb2023
|
sql desc tb2023
|
||||||
|
|
||||||
|
print =============== error for super table
|
||||||
|
sql create table stb2023(ts timestamp, f int) tags(t1 int);
|
||||||
|
sql_error alter table stb2023 add column v varchar(16375);
|
||||||
|
sql_error alter table stb2023 add column v varchar(16385);
|
||||||
|
sql_error alter table stb2023 add column v varchar(33100);
|
||||||
|
sql alter table stb2023 add column v varchar(16374);
|
||||||
|
sql_error alter table stb2023 modify column v varchar(16375);
|
||||||
|
sql desc stb2023
|
||||||
|
sql alter table stb2023 drop column v
|
||||||
|
sql_error alter table stb2023 add column v nchar(4094);
|
||||||
|
sql alter table stb2023 add column v nchar(4093);
|
||||||
|
sql_error alter table stb2023 modify column v nchar(4094);
|
||||||
|
sql desc stb2023
|
||||||
|
|
||||||
print ======= over
|
print ======= over
|
||||||
sql drop database d1
|
sql drop database d1
|
||||||
sql select * from information_schema.ins_databases
|
sql select * from information_schema.ins_databases
|
||||||
|
|
|
@ -48,7 +48,7 @@ sql_error alter table tb modify column c2 binary(10);
|
||||||
sql_error alter table tb modify column c2 binary(9);
|
sql_error alter table tb modify column c2 binary(9);
|
||||||
sql_error alter table tb modify column c2 binary(-9);
|
sql_error alter table tb modify column c2 binary(-9);
|
||||||
sql_error alter table tb modify column c2 binary(0);
|
sql_error alter table tb modify column c2 binary(0);
|
||||||
sql alter table tb modify column c2 binary(17000);
|
sql_error alter table tb modify column c2 binary(17000);
|
||||||
sql_error alter table tb modify column c2 nchar(30);
|
sql_error alter table tb modify column c2 nchar(30);
|
||||||
sql_error alter table tb modify column c3 double;
|
sql_error alter table tb modify column c3 double;
|
||||||
sql_error alter table tb modify column c3 nchar(10);
|
sql_error alter table tb modify column c3 nchar(10);
|
||||||
|
|
|
@ -29,6 +29,7 @@ class TDTestCase:
|
||||||
self.stbname = 'stb'
|
self.stbname = 'stb'
|
||||||
self.binary_length = 20 # the length of binary for column_dict
|
self.binary_length = 20 # the length of binary for column_dict
|
||||||
self.nchar_length = 20 # the length of nchar for column_dict
|
self.nchar_length = 20 # the length of nchar for column_dict
|
||||||
|
self.dbnames = ['db1', 'db2']
|
||||||
self.column_dict = {
|
self.column_dict = {
|
||||||
'ts': 'timestamp',
|
'ts': 'timestamp',
|
||||||
'col1': 'float',
|
'col1': 'float',
|
||||||
|
@ -57,21 +58,25 @@ class TDTestCase:
|
||||||
def create_user(self):
|
def create_user(self):
|
||||||
user_name = 'test'
|
user_name = 'test'
|
||||||
tdSql.execute(f'create user {user_name} pass "test"')
|
tdSql.execute(f'create user {user_name} pass "test"')
|
||||||
tdSql.execute(f'grant read on db.stb with t2 = "Beijing" to {user_name}')
|
tdSql.execute(f'grant read on {self.dbnames[0]}.{self.stbname} with t2 = "Beijing" to {user_name}')
|
||||||
|
tdSql.execute(f'grant write on {self.dbnames[1]}.{self.stbname} with t1 = 2 to {user_name}')
|
||||||
|
|
||||||
def prepare_data(self):
|
def prepare_data(self):
|
||||||
tdSql.execute(self.setsql.set_create_stable_sql(self.stbname, self.column_dict, self.tag_dict))
|
for db in self.dbnames:
|
||||||
for i in range(self.tbnum):
|
tdSql.execute(f"create database {db}")
|
||||||
tdSql.execute(f'create table {self.stbname}_{i} using {self.stbname} tags({self.tag_list[i]})')
|
tdSql.execute(f"use {db}")
|
||||||
for j in self.values_list:
|
tdSql.execute(self.setsql.set_create_stable_sql(self.stbname, self.column_dict, self.tag_dict))
|
||||||
tdSql.execute(f'insert into {self.stbname}_{i} values({j})')
|
for i in range(self.tbnum):
|
||||||
|
tdSql.execute(f'create table {self.stbname}_{i} using {self.stbname} tags({self.tag_list[i]})')
|
||||||
|
for j in self.values_list:
|
||||||
|
tdSql.execute(f'insert into {self.stbname}_{i} values({j})')
|
||||||
|
|
||||||
def user_privilege_check(self):
|
def user_read_privilege_check(self, dbname):
|
||||||
testconn = taos.connect(user='test', password='test')
|
testconn = taos.connect(user='test', password='test')
|
||||||
expectErrNotOccured = False
|
expectErrNotOccured = False
|
||||||
|
|
||||||
try:
|
try:
|
||||||
sql = "select count(*) from db.stb where t2 = 'Beijing'"
|
sql = f"select count(*) from {dbname}.stb where t2 = 'Beijing'"
|
||||||
res = testconn.query(sql)
|
res = testconn.query(sql)
|
||||||
data = res.fetch_all()
|
data = res.fetch_all()
|
||||||
count = data[0][0]
|
count = data[0][0]
|
||||||
|
@ -85,11 +90,30 @@ class TDTestCase:
|
||||||
tdLog.exit(f"{sql}, expect result doesn't match")
|
tdLog.exit(f"{sql}, expect result doesn't match")
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def user_write_privilege_check(self, dbname):
|
||||||
|
testconn = taos.connect(user='test', password='test')
|
||||||
|
expectErrNotOccured = False
|
||||||
|
|
||||||
|
try:
|
||||||
|
sql = f"insert into {dbname}.stb_1 values(now, 1.1, 200, 0.3)"
|
||||||
|
testconn.execute(sql)
|
||||||
|
except BaseException:
|
||||||
|
expectErrNotOccured = True
|
||||||
|
|
||||||
|
if expectErrNotOccured:
|
||||||
|
caller = inspect.getframeinfo(inspect.stack()[1][0])
|
||||||
|
tdLog.exit(f"{caller.filename}({caller.lineno}) failed: sql:{sql}, expect error not occured")
|
||||||
|
else:
|
||||||
|
pass
|
||||||
|
|
||||||
def user_privilege_error_check(self):
|
def user_privilege_error_check(self):
|
||||||
testconn = taos.connect(user='test', password='test')
|
testconn = taos.connect(user='test', password='test')
|
||||||
expectErrNotOccured = False
|
expectErrNotOccured = False
|
||||||
|
|
||||||
sql_list = ["alter talbe db.stb_1 set t2 = 'Wuhan'", "drop table db.stb_1"]
|
sql_list = [f"alter talbe {self.dbnames[0]}.stb_1 set t2 = 'Wuhan'",
|
||||||
|
f"insert into {self.dbnames[0]}.stb_1 values(now, 1.1, 200, 0.3)",
|
||||||
|
f"drop table {self.dbnames[0]}.stb_1",
|
||||||
|
f"select count(*) from {self.dbnames[1]}.stb"]
|
||||||
|
|
||||||
for sql in sql_list:
|
for sql in sql_list:
|
||||||
try:
|
try:
|
||||||
|
@ -104,11 +128,11 @@ class TDTestCase:
|
||||||
tdLog.exit(f"{caller.filename}({caller.lineno}) failed: sql:{sql}, expect error not occured")
|
tdLog.exit(f"{caller.filename}({caller.lineno}) failed: sql:{sql}, expect error not occured")
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
tdSql.prepare()
|
|
||||||
self.prepare_data()
|
self.prepare_data()
|
||||||
self.create_user()
|
self.create_user()
|
||||||
self.user_privilege_check()
|
self.user_read_privilege_check(self.dbnames[0])
|
||||||
|
self.user_write_privilege_check(self.dbnames[1])
|
||||||
self.user_privilege_error_check()
|
self.user_privilege_error_check()
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
|
|
Loading…
Reference in New Issue