From c5b37377026167e2abac828617d4182296fc715f Mon Sep 17 00:00:00 2001 From: Ganlin Zhao Date: Sun, 23 Apr 2023 11:21:01 +0800 Subject: [PATCH 1/6] fix: forbid delete from system table --- include/common/systable.h | 1 + source/common/src/systable.c | 4 ++++ source/libs/planner/src/planLogicCreater.c | 6 +++++- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/include/common/systable.h b/include/common/systable.h index 558a1ca297..6e0c67bb3f 100644 --- a/include/common/systable.h +++ b/include/common/systable.h @@ -77,6 +77,7 @@ void getInfosDbMeta(const SSysTableMeta** pInfosTableMeta, size_t* size); void getPerfDbMeta(const SSysTableMeta** pPerfsTableMeta, size_t* size); void getVisibleInfosTablesNum(bool sysInfo, size_t* size); bool invisibleColumn(bool sysInfo, int8_t tableType, int8_t flags); +bool isSystemDb(const char *dbName); #ifdef __cplusplus } diff --git a/source/common/src/systable.c b/source/common/src/systable.c index cd3dd63ef0..de95a4a5be 100644 --- a/source/common/src/systable.c +++ b/source/common/src/systable.c @@ -448,3 +448,7 @@ bool invisibleColumn(bool sysInfo, int8_t tableType, int8_t flags) { } return 0 != (flags & COL_IS_SYSINFO); } + +bool isSystemDb(const char *dbName) { + return ((strcasecmp(dbName, TSDB_INFORMATION_SCHEMA_DB) == 0) || (strcasecmp(dbName, TSDB_PERFORMANCE_SCHEMA_DB) == 0)); +} diff --git a/source/libs/planner/src/planLogicCreater.c b/source/libs/planner/src/planLogicCreater.c index c9ee83a647..9e03095d2e 100644 --- a/source/libs/planner/src/planLogicCreater.c +++ b/source/libs/planner/src/planLogicCreater.c @@ -1442,8 +1442,12 @@ static int32_t createDeleteRootLogicNode(SLogicPlanContext* pCxt, SDeleteStmt* p } static int32_t createDeleteScanLogicNode(SLogicPlanContext* pCxt, SDeleteStmt* pDelete, SLogicNode** pLogicNode) { + if (isSystemDb(((SRealTableNode*)pDelete->pFromTable)->table.dbName)) { + return TSDB_CODE_TSC_INVALID_OPERATION; + } + SScanLogicNode* pScan = NULL; - int32_t code = makeScanLogicNode(pCxt, (SRealTableNode*)pDelete->pFromTable, false, (SLogicNode**)&pScan); + int32_t code = makeScanLogicNode(pCxt, (SRealTableNode*)pDelete->pFromTable, false, (SLogicNode**)&pScan); // set columns to scan if (TSDB_CODE_SUCCESS == code) { From cd85485c07e0ce9b37911da9e1b05df2f52ba5e8 Mon Sep 17 00:00:00 2001 From: Ganlin Zhao Date: Sun, 23 Apr 2023 11:21:35 +0800 Subject: [PATCH 2/6] add test cases --- tests/system-test/1-insert/delete_systable.py | 111 ++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 tests/system-test/1-insert/delete_systable.py diff --git a/tests/system-test/1-insert/delete_systable.py b/tests/system-test/1-insert/delete_systable.py new file mode 100644 index 0000000000..40422a7515 --- /dev/null +++ b/tests/system-test/1-insert/delete_systable.py @@ -0,0 +1,111 @@ + +################################################################### +# Copyright (c) 2016 by TAOS Technologies, Inc. +# All rights reserved. +# +# This file is proprietary and confidential to TAOS Technologies. +# No part of this file may be reproduced, stored, transmitted, +# disclosed or used in any form or by any means other than as +# expressly provided by the written permission from Jianhui Tao +# +################################################################### + +# -*- coding: utf-8 -*- + +import random +import string + +from numpy import logspace +from util import constant +from util.log import * +from util.cases import * +from util.sql import * +from util.common import * +from util.sqlset import TDSetSql + +info_schema_db = "information_schema" +perf_schema_db = "performance_schema" + +info_schema_tables = [ + "ins_dnodes", + "ins_mnodes", + "ins_modules", + "ins_qnodes", + "ins_snodes", + "ins_cluster", + "ins_databases", + "ins_functions", + "ins_indexes", + "ins_stables", + "ins_tables", + "ins_tags", + "ins_columns", + "ins_users", + "ins_grants", + "ins_vgroups", + "ins_configs", + "ins_dnode_variables", + "ins_topics", + "ins_subscriptions", + "ins_streams", + "ins_streams_tasks", + "ins_vnodes", + "ins_user_privileges" +] + +perf_schema_tables = [ + "perf_connections", + "perf_queries", + "perf_consumers", + "perf_trans", + "perf_apps" +] + +class TDTestCase: + def init(self, conn, logSql, replicaVar=1): + self.replicaVar = int(replicaVar) + tdLog.debug("start to execute %s" % __file__) + tdSql.init(conn.cursor()) + + def delete_systb(self): + tdSql.execute(f'use {info_schema_db}') + for i in info_schema_tables: + tdSql.error(f'delete from {i}') + tdSql.error(f'delete from {info_schema_db}.{i}') + tdSql.error(f'delete from {i} where ts >= 0') + tdSql.error(f'delete from {info_schema_db}.{i} where ts >= 0') + + tdSql.execute(f'use {perf_schema_db}') + for i in perf_schema_tables: + tdSql.error(f'delete from {i}') + tdSql.error(f'delete from {perf_schema_db}.{i}') + tdSql.error(f'delete from {i} where ts >= 0') + tdSql.error(f'delete from {perf_schema_db}.{i} where ts >= 0') + + def drop_systb(self): + tdSql.execute(f'use {info_schema_db}') + for i in info_schema_tables: + tdSql.error(f'drop table {i}') + tdSql.error(f'drop {info_schema_db}.{i}') + tdSql.error(f'drop database {info_schema_db}') + + tdSql.execute(f'use {perf_schema_db}') + for i in perf_schema_tables: + tdSql.error(f'drop table {i}') + tdSql.error(f'drop table {perf_schema_db}.{i}') + tdSql.error(f'drop database {perf_schema_db}') + + def delete_from_systb(self): + self.delete_systb() + self.drop_systb() + def run(self): + self.delete_from_systb() + tdDnodes.stoptaosd(1) + tdDnodes.starttaosd(1) + self.delete_from_systb() + def stop(self): + tdSql.close() + tdLog.success("%s successfully executed" % __file__) + +tdCases.addWindows(__file__, TDTestCase()) +tdCases.addLinux(__file__, TDTestCase()) From bdd2c8b81f6f2b754c15b519c65204d727538bdb Mon Sep 17 00:00:00 2001 From: Ganlin Zhao Date: Sun, 23 Apr 2023 11:22:42 +0800 Subject: [PATCH 3/6] add cases --- tests/parallel_test/cases.task | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/parallel_test/cases.task b/tests/parallel_test/cases.task index dda4ec3e84..f1a1a11185 100644 --- a/tests/parallel_test/cases.task +++ b/tests/parallel_test/cases.task @@ -337,6 +337,7 @@ ,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/tb_100w_data_order.py ,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/delete_childtable.py ,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/delete_normaltable.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/delete_systable.py ,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/keep_expired.py ,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/drop.py ,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/drop.py -N 3 -M 3 -i False -n 3 From 1251245c2a2c42388dddfd152bb3cec910cc5245 Mon Sep 17 00:00:00 2001 From: Ganlin Zhao Date: Mon, 24 Apr 2023 09:49:03 +0800 Subject: [PATCH 4/6] move code to parser --- source/libs/parser/src/parTranslater.c | 5 +++++ source/libs/planner/src/planLogicCreater.c | 6 +----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index b44c36dde1..52451d35a8 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -3792,6 +3792,11 @@ static int32_t translateDeleteWhere(STranslateContext* pCxt, SDeleteStmt* pDelet } static int32_t translateDelete(STranslateContext* pCxt, SDeleteStmt* pDelete) { + // check delete from system tables + if (isSystemDb(((SRealTableNode*)pDelete->pFromTable)->table.dbName)) { + return TSDB_CODE_TSC_INVALID_OPERATION; + } + pCxt->pCurrStmt = (SNode*)pDelete; int32_t code = translateFrom(pCxt, pDelete->pFromTable); if (TSDB_CODE_SUCCESS == code) { diff --git a/source/libs/planner/src/planLogicCreater.c b/source/libs/planner/src/planLogicCreater.c index 9e03095d2e..39783868b3 100644 --- a/source/libs/planner/src/planLogicCreater.c +++ b/source/libs/planner/src/planLogicCreater.c @@ -1442,12 +1442,8 @@ static int32_t createDeleteRootLogicNode(SLogicPlanContext* pCxt, SDeleteStmt* p } static int32_t createDeleteScanLogicNode(SLogicPlanContext* pCxt, SDeleteStmt* pDelete, SLogicNode** pLogicNode) { - if (isSystemDb(((SRealTableNode*)pDelete->pFromTable)->table.dbName)) { - return TSDB_CODE_TSC_INVALID_OPERATION; - } - SScanLogicNode* pScan = NULL; - int32_t code = makeScanLogicNode(pCxt, (SRealTableNode*)pDelete->pFromTable, false, (SLogicNode**)&pScan); + int32_t code = makeScanLogicNode(pCxt, (SRealTableNode*)pDelete->pFromTable, false, (SLogicNode**)&pScan); // set columns to scan if (TSDB_CODE_SUCCESS == code) { From 782566ad081d7ecb35b2dd3720cc0214cea5b0eb Mon Sep 17 00:00:00 2001 From: Ganlin Zhao Date: Mon, 24 Apr 2023 17:15:46 +0800 Subject: [PATCH 5/6] refactor --- include/common/systable.h | 3 +-- source/common/src/systable.c | 4 ---- source/libs/parser/src/parTranslater.c | 9 ++++----- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/include/common/systable.h b/include/common/systable.h index 6e0c67bb3f..ea18338e9e 100644 --- a/include/common/systable.h +++ b/include/common/systable.h @@ -12,7 +12,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ - + #ifndef TDENGINE_SYSTABLE_H #define TDENGINE_SYSTABLE_H @@ -77,7 +77,6 @@ void getInfosDbMeta(const SSysTableMeta** pInfosTableMeta, size_t* size); void getPerfDbMeta(const SSysTableMeta** pPerfsTableMeta, size_t* size); void getVisibleInfosTablesNum(bool sysInfo, size_t* size); bool invisibleColumn(bool sysInfo, int8_t tableType, int8_t flags); -bool isSystemDb(const char *dbName); #ifdef __cplusplus } diff --git a/source/common/src/systable.c b/source/common/src/systable.c index de95a4a5be..cd3dd63ef0 100644 --- a/source/common/src/systable.c +++ b/source/common/src/systable.c @@ -448,7 +448,3 @@ bool invisibleColumn(bool sysInfo, int8_t tableType, int8_t flags) { } return 0 != (flags & COL_IS_SYSINFO); } - -bool isSystemDb(const char *dbName) { - return ((strcasecmp(dbName, TSDB_INFORMATION_SCHEMA_DB) == 0) || (strcasecmp(dbName, TSDB_PERFORMANCE_SCHEMA_DB) == 0)); -} diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 52451d35a8..97fee72bf8 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -2580,6 +2580,10 @@ static int32_t translateTable(STranslateContext* pCxt, SNode* pTable) { if (TSDB_SYSTEM_TABLE == pRealTable->pMeta->tableType && isSelectStmt(pCxt->pCurrStmt)) { ((SSelectStmt*)pCxt->pCurrStmt)->isTimeLineResult = false; } + if (TSDB_SYSTEM_TABLE == pRealTable->pMeta->tableType && isDeleteStmt(pCxt->pCurrStmt)) { + code = TSDB_CODE_TSC_INVALID_OPERATION; + break; + } code = addNamespace(pCxt, pRealTable); } break; @@ -3792,11 +3796,6 @@ static int32_t translateDeleteWhere(STranslateContext* pCxt, SDeleteStmt* pDelet } static int32_t translateDelete(STranslateContext* pCxt, SDeleteStmt* pDelete) { - // check delete from system tables - if (isSystemDb(((SRealTableNode*)pDelete->pFromTable)->table.dbName)) { - return TSDB_CODE_TSC_INVALID_OPERATION; - } - pCxt->pCurrStmt = (SNode*)pDelete; int32_t code = translateFrom(pCxt, pDelete->pFromTable); if (TSDB_CODE_SUCCESS == code) { From 80621e14eba7e8d6e70793f730c95494524a644d Mon Sep 17 00:00:00 2001 From: Ganlin Zhao Date: Mon, 24 Apr 2023 17:15:46 +0800 Subject: [PATCH 6/6] refactor --- source/libs/parser/src/parTranslater.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 97fee72bf8..c7552445e3 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -2577,12 +2577,13 @@ static int32_t translateTable(STranslateContext* pCxt, SNode* pTable) { if (TSDB_SUPER_TABLE == pRealTable->pMeta->tableType) { pCxt->stableQuery = true; } - if (TSDB_SYSTEM_TABLE == pRealTable->pMeta->tableType && isSelectStmt(pCxt->pCurrStmt)) { - ((SSelectStmt*)pCxt->pCurrStmt)->isTimeLineResult = false; - } - if (TSDB_SYSTEM_TABLE == pRealTable->pMeta->tableType && isDeleteStmt(pCxt->pCurrStmt)) { - code = TSDB_CODE_TSC_INVALID_OPERATION; - break; + if (TSDB_SYSTEM_TABLE == pRealTable->pMeta->tableType) { + if (isSelectStmt(pCxt->pCurrStmt)) { + ((SSelectStmt*)pCxt->pCurrStmt)->isTimeLineResult = false; + } else if (isDeleteStmt(pCxt->pCurrStmt)) { + code = TSDB_CODE_TSC_INVALID_OPERATION; + break; + } } code = addNamespace(pCxt, pRealTable); }