2022-03-31 06:19:11 +00:00
/*
* Copyright ( c ) 2019 TAOS Data , Inc . < jhtao @ taosdata . com >
*
* This program is free software : you can use , redistribute , and / or modify
* it under the terms of the GNU Affero General Public License , version 3
* or later ( " AGPL " ) , as published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful , but WITHOUT
* ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE .
*
* You should have received a copy of the GNU Affero General Public License
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
# include "command.h"
2022-06-17 06:41:17 +00:00
# include "catalog.h"
2022-07-14 10:42:26 +00:00
# include "commandInt.h"
# include "scheduler.h"
2022-08-24 09:36:10 +00:00
# include "systable.h"
2022-07-16 06:22:30 +00:00
# include "tdatablock.h"
# include "tglobal.h"
2022-08-01 11:54:13 +00:00
# include "tgrant.h"
2022-12-29 10:07:57 +00:00
# include "taosdef.h"
2022-03-31 06:19:11 +00:00
2022-06-28 05:59:49 +00:00
extern SConfig * tsCfg ;
2022-06-29 03:41:32 +00:00
static int32_t buildRetrieveTableRsp ( SSDataBlock * pBlock , int32_t numOfCols , SRetrieveTableRsp * * pRsp ) {
size_t rspSize = sizeof ( SRetrieveTableRsp ) + blockGetEncodeSize ( pBlock ) ;
* pRsp = taosMemoryCalloc ( 1 , rspSize ) ;
if ( NULL = = * pRsp ) {
return TSDB_CODE_OUT_OF_MEMORY ;
}
( * pRsp ) - > useconds = 0 ;
( * pRsp ) - > completed = 1 ;
( * pRsp ) - > precision = 0 ;
( * pRsp ) - > compressed = 0 ;
( * pRsp ) - > compLen = 0 ;
2022-12-02 15:20:19 +00:00
( * pRsp ) - > numOfRows = htobe64 ( ( int64_t ) pBlock - > info . rows ) ;
2022-06-29 03:41:32 +00:00
( * pRsp ) - > numOfCols = htonl ( numOfCols ) ;
2022-11-09 05:45:46 +00:00
int32_t len = blockEncode ( pBlock , ( * pRsp ) - > data , numOfCols ) ;
2022-06-29 03:41:32 +00:00
return TSDB_CODE_SUCCESS ;
}
2022-04-02 07:27:07 +00:00
static int32_t getSchemaBytes ( const SSchema * pSchema ) {
switch ( pSchema - > type ) {
case TSDB_DATA_TYPE_BINARY :
2023-09-01 05:24:47 +00:00
case TSDB_DATA_TYPE_VARBINARY :
2023-05-24 07:36:46 +00:00
case TSDB_DATA_TYPE_GEOMETRY :
2022-04-02 07:27:07 +00:00
return ( pSchema - > bytes - VARSTR_HEADER_SIZE ) ;
case TSDB_DATA_TYPE_NCHAR :
2022-05-23 11:57:49 +00:00
case TSDB_DATA_TYPE_JSON :
2022-04-02 07:27:07 +00:00
return ( pSchema - > bytes - VARSTR_HEADER_SIZE ) / TSDB_NCHAR_SIZE ;
default :
return pSchema - > bytes ;
}
}
2022-03-31 06:19:11 +00:00
2022-10-17 07:43:42 +00:00
static int32_t buildDescResultDataBlock ( SSDataBlock * * pOutput ) {
2022-06-22 09:21:04 +00:00
SSDataBlock * pBlock = createDataBlock ( ) ;
2022-10-17 07:43:42 +00:00
if ( NULL = = pBlock ) {
return TSDB_CODE_OUT_OF_MEMORY ;
}
2022-03-31 06:19:11 +00:00
2022-06-22 09:21:04 +00:00
SColumnInfoData infoData = createColumnInfoData ( TSDB_DATA_TYPE_VARCHAR , DESCRIBE_RESULT_FIELD_LEN , 1 ) ;
2022-10-17 07:43:42 +00:00
int32_t code = blockDataAppendColInfo ( pBlock , & infoData ) ;
if ( TSDB_CODE_SUCCESS = = code ) {
infoData = createColumnInfoData ( TSDB_DATA_TYPE_VARCHAR , DESCRIBE_RESULT_TYPE_LEN , 2 ) ;
code = blockDataAppendColInfo ( pBlock , & infoData ) ;
}
if ( TSDB_CODE_SUCCESS = = code ) {
infoData = createColumnInfoData ( TSDB_DATA_TYPE_INT , tDataTypes [ TSDB_DATA_TYPE_INT ] . bytes , 3 ) ;
code = blockDataAppendColInfo ( pBlock , & infoData ) ;
}
if ( TSDB_CODE_SUCCESS = = code ) {
infoData = createColumnInfoData ( TSDB_DATA_TYPE_VARCHAR , DESCRIBE_RESULT_NOTE_LEN , 4 ) ;
code = blockDataAppendColInfo ( pBlock , & infoData ) ;
}
2022-06-08 10:41:05 +00:00
2022-10-17 07:43:42 +00:00
if ( TSDB_CODE_SUCCESS = = code ) {
* pOutput = pBlock ;
} else {
blockDataDestroy ( pBlock ) ;
}
return code ;
2022-06-08 10:41:05 +00:00
}
2023-09-18 08:59:07 +00:00
static int32_t setDescResultIntoDataBlock ( bool sysInfoUser , SSDataBlock * pBlock , int32_t numOfRows , STableMeta * pMeta , int8_t biMode ) {
2023-09-21 01:55:13 +00:00
int32_t blockCap = ( biMode ! = 0 ) ? numOfRows + 1 : numOfRows ;
blockDataEnsureCapacity ( pBlock , blockCap ) ;
2022-08-24 09:36:10 +00:00
pBlock - > info . rows = 0 ;
2022-06-08 10:41:05 +00:00
// field
SColumnInfoData * pCol1 = taosArrayGet ( pBlock - > pDataBlock , 0 ) ;
2022-03-31 06:19:11 +00:00
// Type
2022-06-08 10:41:05 +00:00
SColumnInfoData * pCol2 = taosArrayGet ( pBlock - > pDataBlock , 1 ) ;
2022-03-31 06:19:11 +00:00
// Length
2022-06-08 10:41:05 +00:00
SColumnInfoData * pCol3 = taosArrayGet ( pBlock - > pDataBlock , 2 ) ;
2022-03-31 06:19:11 +00:00
// Note
2022-06-08 10:41:05 +00:00
SColumnInfoData * pCol4 = taosArrayGet ( pBlock - > pDataBlock , 3 ) ;
2022-08-24 09:36:10 +00:00
char buf [ DESCRIBE_RESULT_FIELD_LEN ] = { 0 } ;
2022-03-31 06:19:11 +00:00
for ( int32_t i = 0 ; i < numOfRows ; + + i ) {
2022-08-24 09:36:10 +00:00
if ( invisibleColumn ( sysInfoUser , pMeta - > tableType , pMeta - > schema [ i ] . flags ) ) {
continue ;
}
STR_TO_VARSTR ( buf , pMeta - > schema [ i ] . name ) ;
2023-02-20 02:04:08 +00:00
colDataSetVal ( pCol1 , pBlock - > info . rows , buf , false ) ;
2022-08-24 09:36:10 +00:00
STR_TO_VARSTR ( buf , tDataTypes [ pMeta - > schema [ i ] . type ] . name ) ;
2023-02-20 02:04:08 +00:00
colDataSetVal ( pCol2 , pBlock - > info . rows , buf , false ) ;
2022-08-24 09:36:10 +00:00
int32_t bytes = getSchemaBytes ( pMeta - > schema + i ) ;
2023-02-20 02:04:08 +00:00
colDataSetVal ( pCol3 , pBlock - > info . rows , ( const char * ) & bytes , false ) ;
2023-10-11 10:49:47 +00:00
if ( TSDB_VIEW_TABLE ! = pMeta - > tableType ) {
STR_TO_VARSTR ( buf , i > = pMeta - > tableInfo . numOfColumns ? " TAG " : " " ) ;
} else {
2023-10-20 00:41:49 +00:00
STR_TO_VARSTR ( buf , " VIEW COL " ) ;
2023-10-11 10:49:47 +00:00
}
2023-02-20 02:04:08 +00:00
colDataSetVal ( pCol4 , pBlock - > info . rows , buf , false ) ;
2022-08-24 09:36:10 +00:00
+ + ( pBlock - > info . rows ) ;
2022-03-31 06:19:11 +00:00
}
2023-09-19 08:14:17 +00:00
if ( pMeta - > tableType = = TSDB_SUPER_TABLE & & biMode ! = 0 ) {
2023-09-18 08:59:07 +00:00
STR_TO_VARSTR ( buf , " tbname " ) ;
colDataSetVal ( pCol1 , pBlock - > info . rows , buf , false ) ;
STR_TO_VARSTR ( buf , " VARCHAR " ) ;
colDataSetVal ( pCol2 , pBlock - > info . rows , buf , false ) ;
int32_t bytes = TSDB_TABLE_NAME_LEN - 1 ;
colDataSetVal ( pCol3 , pBlock - > info . rows , ( const char * ) & bytes , false ) ;
STR_TO_VARSTR ( buf , " TAG " ) ;
colDataSetVal ( pCol4 , pBlock - > info . rows , buf , false ) ;
+ + ( pBlock - > info . rows ) ;
}
2023-07-07 01:04:44 +00:00
if ( pBlock - > info . rows < = 0 ) {
qError ( " no permission to view any columns " ) ;
return TSDB_CODE_PAR_PERMISSION_DENIED ;
}
return TSDB_CODE_SUCCESS ;
2022-03-31 06:19:11 +00:00
}
2023-09-18 08:59:07 +00:00
static int32_t execDescribe ( bool sysInfoUser , SNode * pStmt , SRetrieveTableRsp * * pRsp , int8_t biMode ) {
2022-06-17 13:16:13 +00:00
SDescribeStmt * pDesc = ( SDescribeStmt * ) pStmt ;
int32_t numOfRows = TABLE_TOTAL_COL_NUM ( pDesc - > pMeta ) ;
2022-06-08 10:41:05 +00:00
2022-10-17 07:43:42 +00:00
SSDataBlock * pBlock = NULL ;
int32_t code = buildDescResultDataBlock ( & pBlock ) ;
if ( TSDB_CODE_SUCCESS = = code ) {
2023-09-18 08:59:07 +00:00
code = setDescResultIntoDataBlock ( sysInfoUser , pBlock , numOfRows , pDesc - > pMeta , biMode ) ;
2022-10-17 07:43:42 +00:00
}
if ( TSDB_CODE_SUCCESS = = code ) {
code = buildRetrieveTableRsp ( pBlock , DESCRIBE_RESULT_COLS , pRsp ) ;
}
blockDataDestroy ( pBlock ) ;
return code ;
2022-03-31 06:19:11 +00:00
}
2022-06-17 13:16:13 +00:00
static int32_t execResetQueryCache ( ) { return catalogClearCache ( ) ; }
2022-10-17 07:43:42 +00:00
static int32_t buildCreateDBResultDataBlock ( SSDataBlock * * pOutput ) {
SSDataBlock * pBlock = createDataBlock ( ) ;
if ( NULL = = pBlock ) {
return TSDB_CODE_OUT_OF_MEMORY ;
}
2022-06-22 09:36:48 +00:00
SColumnInfoData infoData = createColumnInfoData ( TSDB_DATA_TYPE_VARCHAR , SHOW_CREATE_DB_RESULT_COLS , 1 ) ;
2022-10-17 07:43:42 +00:00
int32_t code = blockDataAppendColInfo ( pBlock , & infoData ) ;
if ( TSDB_CODE_SUCCESS = = code ) {
infoData = createColumnInfoData ( TSDB_DATA_TYPE_VARCHAR , SHOW_CREATE_DB_RESULT_FIELD2_LEN , 2 ) ;
code = blockDataAppendColInfo ( pBlock , & infoData ) ;
}
2022-06-18 11:50:53 +00:00
2022-10-17 07:43:42 +00:00
if ( TSDB_CODE_SUCCESS = = code ) {
* pOutput = pBlock ;
} else {
blockDataDestroy ( pBlock ) ;
}
return code ;
2022-06-18 11:50:53 +00:00
}
2022-12-29 10:07:57 +00:00
static int32_t buildAliveResultDataBlock ( SSDataBlock * * pOutput ) {
SSDataBlock * pBlock = createDataBlock ( ) ;
if ( NULL = = pBlock ) {
return TSDB_CODE_OUT_OF_MEMORY ;
}
SColumnInfoData infoData = createColumnInfoData ( TSDB_DATA_TYPE_INT , sizeof ( int32_t ) , 1 ) ;
int32_t code = blockDataAppendColInfo ( pBlock , & infoData ) ;
if ( TSDB_CODE_SUCCESS = = code ) {
* pOutput = pBlock ;
} else {
blockDataDestroy ( pBlock ) ;
}
return code ;
}
2022-06-18 11:50:53 +00:00
int64_t getValOfDiffPrecision ( int8_t unit , int64_t val ) {
int64_t v = 0 ;
switch ( unit ) {
case ' s ' :
v = val / 1000 ;
break ;
case ' m ' :
v = val / tsTickPerMin [ TSDB_TIME_PRECISION_MILLI ] ;
break ;
case ' h ' :
v = val / ( tsTickPerMin [ TSDB_TIME_PRECISION_MILLI ] * 60 ) ;
break ;
case ' d ' :
v = val / ( tsTickPerMin [ TSDB_TIME_PRECISION_MILLI ] * 24 * 60 ) ;
break ;
case ' w ' :
v = val / ( tsTickPerMin [ TSDB_TIME_PRECISION_MILLI ] * 24 * 60 * 7 ) ;
break ;
default :
break ;
}
return v ;
}
2023-10-30 06:02:31 +00:00
static char * buildRetension ( SArray * pRetension ) {
2022-06-18 11:50:53 +00:00
size_t size = taosArrayGetSize ( pRetension ) ;
if ( size = = 0 ) {
return NULL ;
}
2023-10-30 06:02:31 +00:00
char * p1 = taosMemoryCalloc ( 1 , 100 ) ;
2022-06-18 11:50:53 +00:00
int32_t len = 0 ;
2023-10-30 06:02:31 +00:00
for ( int32_t i = 0 ; i < size ; + + i ) {
SRetention * p = TARRAY_GET_ELEM ( pRetension , i ) ;
int64_t v1 = getValOfDiffPrecision ( p - > freqUnit , p - > freq ) ;
int64_t v2 = getValOfDiffPrecision ( p - > keepUnit , p - > keep ) ;
if ( i = = 0 ) {
len + = sprintf ( p1 + len , " -:% " PRId64 " %c " , v2 , p - > keepUnit ) ;
} else {
len + = sprintf ( p1 + len , " % " PRId64 " %c:% " PRId64 " %c " , v1 , p - > freqUnit , v2 , p - > keepUnit ) ;
}
2022-06-18 11:50:53 +00:00
2023-10-30 06:02:31 +00:00
if ( i < size - 1 ) {
len + = sprintf ( p1 + len , " , " ) ;
}
2022-06-18 11:50:53 +00:00
}
return p1 ;
}
2022-08-02 12:20:44 +00:00
static const char * cacheModelStr ( int8_t cacheModel ) {
switch ( cacheModel ) {
case TSDB_CACHE_MODEL_NONE :
return TSDB_CACHE_MODEL_NONE_STR ;
case TSDB_CACHE_MODEL_LAST_ROW :
return TSDB_CACHE_MODEL_LAST_ROW_STR ;
case TSDB_CACHE_MODEL_LAST_VALUE :
return TSDB_CACHE_MODEL_LAST_VALUE_STR ;
case TSDB_CACHE_MODEL_BOTH :
return TSDB_CACHE_MODEL_BOTH_STR ;
default :
break ;
}
return TSDB_CACHE_MODEL_NONE_STR ;
}
2023-03-02 03:33:29 +00:00
static void setCreateDBResultIntoDataBlock ( SSDataBlock * pBlock , char * dbName , char * dbFName , SDbCfgInfo * pCfg ) {
2022-06-18 11:50:53 +00:00
blockDataEnsureCapacity ( pBlock , 1 ) ;
pBlock - > info . rows = 1 ;
SColumnInfoData * pCol1 = taosArrayGet ( pBlock - > pDataBlock , 0 ) ;
char buf1 [ SHOW_CREATE_DB_RESULT_FIELD1_LEN ] = { 0 } ;
2023-03-02 03:33:29 +00:00
STR_TO_VARSTR ( buf1 , dbName ) ;
2023-02-20 02:04:08 +00:00
colDataSetVal ( pCol1 , 0 , buf1 , false ) ;
2022-06-18 11:50:53 +00:00
SColumnInfoData * pCol2 = taosArrayGet ( pBlock - > pDataBlock , 1 ) ;
char buf2 [ SHOW_CREATE_DB_RESULT_FIELD2_LEN ] = { 0 } ;
int32_t len = 0 ;
2022-06-28 05:59:49 +00:00
char * prec = NULL ;
2022-06-18 11:50:53 +00:00
switch ( pCfg - > precision ) {
case TSDB_TIME_PRECISION_MILLI :
prec = TSDB_TIME_PRECISION_MILLI_STR ;
break ;
case TSDB_TIME_PRECISION_MICRO :
prec = TSDB_TIME_PRECISION_MICRO_STR ;
break ;
case TSDB_TIME_PRECISION_NANO :
prec = TSDB_TIME_PRECISION_NANO_STR ;
break ;
default :
prec = " none " ;
break ;
}
2022-06-28 05:59:49 +00:00
char * retentions = buildRetension ( pCfg - > pRetensions ) ;
2023-03-02 03:33:29 +00:00
int32_t dbFNameLen = strlen ( dbFName ) ;
2023-04-21 06:17:07 +00:00
int32_t hashPrefix = 0 ;
if ( pCfg - > hashPrefix > 0 ) {
hashPrefix = pCfg - > hashPrefix - dbFNameLen - 1 ;
} else if ( pCfg - > hashPrefix < 0 ) {
hashPrefix = pCfg - > hashPrefix + dbFNameLen + 1 ;
}
2022-06-28 05:59:49 +00:00
2023-07-11 05:56:02 +00:00
if ( IS_SYS_DBNAME ( dbName ) ) {
2023-07-11 06:12:02 +00:00
len + = sprintf ( buf2 + VARSTR_HEADER_SIZE , " CREATE DATABASE `%s` " , dbName ) ;
2023-07-11 05:56:02 +00:00
} else {
len + = sprintf (
buf2 + VARSTR_HEADER_SIZE ,
" CREATE DATABASE `%s` BUFFER %d CACHESIZE %d CACHEMODEL '%s' COMP %d DURATION %dm "
" WAL_FSYNC_PERIOD %d MAXROWS %d MINROWS %d STT_TRIGGER %d KEEP %dm,%dm,%dm PAGES %d PAGESIZE %d PRECISION '%s' REPLICA %d "
" WAL_LEVEL %d VGROUPS %d SINGLE_STABLE %d TABLE_PREFIX %d TABLE_SUFFIX %d TSDB_PAGESIZE %d "
2023-09-19 10:44:27 +00:00
" WAL_RETENTION_PERIOD %d WAL_RETENTION_SIZE % " PRId64 " KEEP_TIME_OFFSET %d " ,
2023-07-11 05:56:02 +00:00
dbName , pCfg - > buffer , pCfg - > cacheSize , cacheModelStr ( pCfg - > cacheLast ) , pCfg - > compression , pCfg - > daysPerFile ,
pCfg - > walFsyncPeriod , pCfg - > maxRows , pCfg - > minRows , pCfg - > sstTrigger , pCfg - > daysToKeep0 , pCfg - > daysToKeep1 , pCfg - > daysToKeep2 ,
pCfg - > pages , pCfg - > pageSize , prec , pCfg - > replications , pCfg - > walLevel , pCfg - > numOfVgroups ,
2023-09-19 10:44:27 +00:00
1 = = pCfg - > numOfStables , hashPrefix , pCfg - > hashSuffix , pCfg - > tsdbPageSize , pCfg - > walRetentionPeriod , pCfg - > walRetentionSize ,
pCfg - > keepTimeOffset ) ;
2023-07-11 05:56:02 +00:00
if ( retentions ) {
len + = sprintf ( buf2 + VARSTR_HEADER_SIZE + len , " RETENTIONS %s " , retentions ) ;
}
2022-06-18 11:50:53 +00:00
}
2023-09-06 02:57:49 +00:00
taosMemoryFree ( retentions ) ;
2022-06-18 11:50:53 +00:00
( varDataLen ( buf2 ) ) = len ;
2022-06-28 05:59:49 +00:00
2023-02-20 02:04:08 +00:00
colDataSetVal ( pCol2 , 0 , buf2 , false ) ;
2022-06-18 11:50:53 +00:00
}
2022-12-29 10:07:57 +00:00
# define CHECK_LEADER(n) (row[n] && (fields[n].type == TSDB_DATA_TYPE_VARCHAR && strncasecmp(row[n], "leader", varDataLen((char *)row[n] - VARSTR_HEADER_SIZE)) == 0))
// on this row, if have leader return true else return false
bool existLeaderRole ( TAOS_ROW row , TAOS_FIELD * fields , int nFields ) {
// vgroup_id | db_name | tables | v1_dnode | v1_status | v2_dnode | v2_status | v3_dnode | v3_status | v4_dnode |
// v4_status | cacheload | tsma |
2023-03-22 08:08:16 +00:00
if ( nFields ! = 14 ) {
2022-12-29 10:07:57 +00:00
return false ;
}
// check have leader on cloumn v*_status on 4 6 8 10
if ( CHECK_LEADER ( 4 ) | | CHECK_LEADER ( 6 ) | | CHECK_LEADER ( 8 ) | | CHECK_LEADER ( 10 ) ) {
return true ;
}
return false ;
}
// get db alive status, return 1 is alive else return 0
int32_t getAliveStatusFromApi ( int64_t * pConnId , char * dbName , int32_t * pStatus ) {
char sql [ 128 + TSDB_DB_NAME_LEN ] = " select * from information_schema.ins_vgroups " ;
int32_t code ;
// filter with db name
if ( dbName & & dbName [ 0 ] ! = 0 ) {
char str [ 64 + TSDB_DB_NAME_LEN ] = " " ;
// test db name exist
sprintf ( str , " show create database %s ; " , dbName ) ;
TAOS_RES * dbRes = taos_query ( pConnId , str ) ;
code = taos_errno ( dbRes ) ;
if ( code ! = TSDB_CODE_SUCCESS ) {
taos_free_result ( dbRes ) ;
return code ;
}
taos_free_result ( dbRes ) ;
sprintf ( str , " where db_name='%s' ; " , dbName ) ;
strcat ( sql , str ) ;
}
TAOS_RES * res = taos_query ( pConnId , sql ) ;
code = taos_errno ( res ) ;
if ( code ! = TSDB_CODE_SUCCESS ) {
taos_free_result ( res ) ;
return code ;
}
TAOS_ROW row = NULL ;
TAOS_FIELD * fields = taos_fetch_fields ( res ) ;
int32_t nFields = taos_num_fields ( res ) ;
int32_t nAvailble = 0 ;
int32_t nUnAvailble = 0 ;
while ( ( row = taos_fetch_row ( res ) ) ! = NULL ) {
if ( existLeaderRole ( row , fields , nFields ) ) {
nAvailble + + ;
} else {
nUnAvailble + + ;
}
}
taos_free_result ( res ) ;
int32_t status = 0 ;
if ( nAvailble + nUnAvailble = = 0 | | nUnAvailble = = 0 ) {
status = SHOW_STATUS_AVAILABLE ;
} else if ( nAvailble > 0 & & nUnAvailble > 0 ) {
status = SHOW_STATUS_HALF_AVAILABLE ;
} else {
status = SHOW_STATUS_NOT_AVAILABLE ;
}
if ( pStatus ) {
* pStatus = status ;
}
return TSDB_CODE_SUCCESS ;
}
static int32_t setAliveResultIntoDataBlock ( int64_t * pConnId , SSDataBlock * pBlock , char * dbName ) {
blockDataEnsureCapacity ( pBlock , 1 ) ;
pBlock - > info . rows = 1 ;
SColumnInfoData * pCol1 = taosArrayGet ( pBlock - > pDataBlock , 0 ) ;
int32_t status = 0 ;
int32_t code = getAliveStatusFromApi ( pConnId , dbName , & status ) ;
if ( code = = TSDB_CODE_SUCCESS ) {
2023-06-15 02:40:25 +00:00
colDataSetVal ( pCol1 , 0 , ( const char * ) & status , false ) ;
2022-12-29 10:07:57 +00:00
}
return code ;
}
static int32_t execShowAliveStatus ( int64_t * pConnId , SShowAliveStmt * pStmt , SRetrieveTableRsp * * pRsp ) {
SSDataBlock * pBlock = NULL ;
int32_t code = buildAliveResultDataBlock ( & pBlock ) ;
if ( TSDB_CODE_SUCCESS = = code ) {
code = setAliveResultIntoDataBlock ( pConnId , pBlock , pStmt - > dbName ) ;
}
if ( TSDB_CODE_SUCCESS = = code ) {
code = buildRetrieveTableRsp ( pBlock , SHOW_ALIVE_RESULT_COLS , pRsp ) ;
}
blockDataDestroy ( pBlock ) ;
return code ;
}
2022-06-18 11:50:53 +00:00
static int32_t execShowCreateDatabase ( SShowCreateDatabaseStmt * pStmt , SRetrieveTableRsp * * pRsp ) {
2022-10-17 07:43:42 +00:00
SSDataBlock * pBlock = NULL ;
int32_t code = buildCreateDBResultDataBlock ( & pBlock ) ;
if ( TSDB_CODE_SUCCESS = = code ) {
2023-03-02 03:33:29 +00:00
setCreateDBResultIntoDataBlock ( pBlock , pStmt - > dbName , pStmt - > dbFName , pStmt - > pCfg ) ;
2022-10-17 07:43:42 +00:00
}
if ( TSDB_CODE_SUCCESS = = code ) {
code = buildRetrieveTableRsp ( pBlock , SHOW_CREATE_DB_RESULT_COLS , pRsp ) ;
}
blockDataDestroy ( pBlock ) ;
return code ;
2022-06-18 11:50:53 +00:00
}
2022-06-17 13:16:13 +00:00
2022-10-17 07:43:42 +00:00
static int32_t buildCreateTbResultDataBlock ( SSDataBlock * * pOutput ) {
2022-06-22 09:36:48 +00:00
SSDataBlock * pBlock = createDataBlock ( ) ;
2022-10-17 07:43:42 +00:00
if ( NULL = = pBlock ) {
return TSDB_CODE_OUT_OF_MEMORY ;
}
2022-06-20 12:58:36 +00:00
2022-06-22 09:36:48 +00:00
SColumnInfoData infoData = createColumnInfoData ( TSDB_DATA_TYPE_VARCHAR , SHOW_CREATE_TB_RESULT_FIELD1_LEN , 1 ) ;
2022-10-17 07:43:42 +00:00
int32_t code = blockDataAppendColInfo ( pBlock , & infoData ) ;
if ( TSDB_CODE_SUCCESS = = code ) {
infoData = createColumnInfoData ( TSDB_DATA_TYPE_VARCHAR , SHOW_CREATE_TB_RESULT_FIELD2_LEN , 2 ) ;
code = blockDataAppendColInfo ( pBlock , & infoData ) ;
}
2022-06-20 12:58:36 +00:00
2022-10-17 07:43:42 +00:00
if ( TSDB_CODE_SUCCESS = = code ) {
* pOutput = pBlock ;
} else {
blockDataDestroy ( pBlock ) ;
}
return code ;
2022-06-20 12:58:36 +00:00
}
2023-10-11 02:38:22 +00:00
static int32_t buildCreateViewResultDataBlock ( SSDataBlock * * pOutput ) {
SSDataBlock * pBlock = createDataBlock ( ) ;
if ( NULL = = pBlock ) {
return TSDB_CODE_OUT_OF_MEMORY ;
}
SColumnInfoData infoData = createColumnInfoData ( TSDB_DATA_TYPE_VARCHAR , SHOW_CREATE_VIEW_RESULT_FIELD1_LEN , 1 ) ;
int32_t code = blockDataAppendColInfo ( pBlock , & infoData ) ;
if ( TSDB_CODE_SUCCESS = = code ) {
infoData = createColumnInfoData ( TSDB_DATA_TYPE_VARCHAR , SHOW_CREATE_VIEW_RESULT_FIELD2_LEN , 2 ) ;
code = blockDataAppendColInfo ( pBlock , & infoData ) ;
}
if ( TSDB_CODE_SUCCESS = = code ) {
* pOutput = pBlock ;
} else {
blockDataDestroy ( pBlock ) ;
}
return code ;
}
2022-06-20 12:58:36 +00:00
void appendColumnFields ( char * buf , int32_t * len , STableCfg * pCfg ) {
for ( int32_t i = 0 ; i < pCfg - > numOfColumns ; + + i ) {
SSchema * pSchema = pCfg - > pSchemas + i ;
2022-06-28 05:59:49 +00:00
char type [ 32 ] ;
2022-06-20 12:58:36 +00:00
sprintf ( type , " %s " , tDataTypes [ pSchema - > type ] . name ) ;
2023-09-01 05:24:47 +00:00
if ( TSDB_DATA_TYPE_VARCHAR = = pSchema - > type | | TSDB_DATA_TYPE_VARBINARY = = pSchema - > type | | TSDB_DATA_TYPE_GEOMETRY = = pSchema - > type ) {
2022-06-20 12:58:36 +00:00
sprintf ( type + strlen ( type ) , " (%d) " , ( int32_t ) ( pSchema - > bytes - VARSTR_HEADER_SIZE ) ) ;
} else if ( TSDB_DATA_TYPE_NCHAR = = pSchema - > type ) {
2022-06-28 05:59:49 +00:00
sprintf ( type + strlen ( type ) , " (%d) " , ( int32_t ) ( ( pSchema - > bytes - VARSTR_HEADER_SIZE ) / TSDB_NCHAR_SIZE ) ) ;
2022-06-20 12:58:36 +00:00
}
2022-06-28 05:59:49 +00:00
2022-11-14 07:48:01 +00:00
* len + = sprintf ( buf + VARSTR_HEADER_SIZE + * len , " %s`%s` %s " , ( ( i > 0 ) ? " , " : " " ) , pSchema - > name , type ) ;
2022-06-20 12:58:36 +00:00
}
}
void appendTagFields ( char * buf , int32_t * len , STableCfg * pCfg ) {
for ( int32_t i = 0 ; i < pCfg - > numOfTags ; + + i ) {
SSchema * pSchema = pCfg - > pSchemas + pCfg - > numOfColumns + i ;
2022-06-28 05:59:49 +00:00
char type [ 32 ] ;
2022-06-20 12:58:36 +00:00
sprintf ( type , " %s " , tDataTypes [ pSchema - > type ] . name ) ;
2023-09-01 05:24:47 +00:00
if ( TSDB_DATA_TYPE_VARCHAR = = pSchema - > type | | TSDB_DATA_TYPE_VARBINARY = = pSchema - > type | | TSDB_DATA_TYPE_GEOMETRY = = pSchema - > type ) {
2022-06-20 12:58:36 +00:00
sprintf ( type + strlen ( type ) , " (%d) " , ( int32_t ) ( pSchema - > bytes - VARSTR_HEADER_SIZE ) ) ;
} else if ( TSDB_DATA_TYPE_NCHAR = = pSchema - > type ) {
2022-06-28 05:59:49 +00:00
sprintf ( type + strlen ( type ) , " (%d) " , ( int32_t ) ( ( pSchema - > bytes - VARSTR_HEADER_SIZE ) / TSDB_NCHAR_SIZE ) ) ;
2022-06-20 12:58:36 +00:00
}
2022-11-14 07:48:01 +00:00
* len + = sprintf ( buf + VARSTR_HEADER_SIZE + * len , " %s`%s` %s " , ( ( i > 0 ) ? " , " : " " ) , pSchema - > name , type ) ;
2022-06-20 12:58:36 +00:00
}
}
2022-06-21 01:18:53 +00:00
void appendTagNameFields ( char * buf , int32_t * len , STableCfg * pCfg ) {
for ( int32_t i = 0 ; i < pCfg - > numOfTags ; + + i ) {
SSchema * pSchema = pCfg - > pSchemas + pCfg - > numOfColumns + i ;
2022-11-14 07:48:01 +00:00
* len + = sprintf ( buf + VARSTR_HEADER_SIZE + * len , " %s`%s` " , ( ( i > 0 ) ? " , " : " " ) , pSchema - > name ) ;
2022-06-21 01:18:53 +00:00
}
}
2022-06-20 12:58:36 +00:00
int32_t appendTagValues ( char * buf , int32_t * len , STableCfg * pCfg ) {
2022-06-28 05:59:49 +00:00
SArray * pTagVals = NULL ;
STag * pTag = ( STag * ) pCfg - > pTags ;
2022-10-18 08:33:27 +00:00
if ( NULL = = pCfg - > pTags | | pCfg - > numOfTags < = 0 ) {
qError ( " tag missed in table cfg, pointer:%p, numOfTags:%d " , pCfg - > pTags , pCfg - > numOfTags ) ;
return TSDB_CODE_APP_ERROR ;
}
if ( tTagIsJson ( pTag ) ) {
2022-06-28 05:59:49 +00:00
char * pJson = parseTagDatatoJson ( pTag ) ;
2022-06-20 12:58:36 +00:00
if ( pJson ) {
2022-11-14 07:48:01 +00:00
* len + = sprintf ( buf + VARSTR_HEADER_SIZE + * len , " %s " , pJson ) ;
2022-06-21 01:18:53 +00:00
taosMemoryFree ( pJson ) ;
2022-06-20 12:58:36 +00:00
}
return TSDB_CODE_SUCCESS ;
}
2022-06-28 05:59:49 +00:00
int32_t code = tTagToValArray ( ( const STag * ) pCfg - > pTags , & pTagVals ) ;
2022-06-20 12:58:36 +00:00
if ( code ) {
return code ;
}
2022-06-21 01:18:53 +00:00
int16_t valueNum = taosArrayGetSize ( pTagVals ) ;
2022-06-20 12:58:36 +00:00
int32_t num = 0 ;
2022-06-21 01:18:53 +00:00
int32_t j = 0 ;
for ( int32_t i = 0 ; i < pCfg - > numOfTags ; + + i ) {
SSchema * pSchema = pCfg - > pSchemas + pCfg - > numOfColumns + i ;
if ( i > 0 ) {
2022-11-14 07:48:01 +00:00
* len + = sprintf ( buf + VARSTR_HEADER_SIZE + * len , " , " ) ;
2022-06-21 01:18:53 +00:00
}
2022-06-28 05:59:49 +00:00
2022-06-21 01:18:53 +00:00
if ( j > = valueNum ) {
2022-11-14 07:48:01 +00:00
* len + = sprintf ( buf + VARSTR_HEADER_SIZE + * len , " NULL " ) ;
2022-06-21 01:18:53 +00:00
continue ;
}
2022-06-28 05:59:49 +00:00
STagVal * pTagVal = ( STagVal * ) taosArrayGet ( pTagVals , j ) ;
2022-06-21 01:18:53 +00:00
if ( pSchema - > colId > pTagVal - > cid ) {
qError ( " tag value and column mismatch, schemaId:%d, valId:%d " , pSchema - > colId , pTagVal - > cid ) ;
taosArrayDestroy ( pTagVals ) ;
return TSDB_CODE_APP_ERROR ;
} else if ( pSchema - > colId = = pTagVal - > cid ) {
2022-06-28 05:59:49 +00:00
char type = pTagVal - > type ;
int32_t tlen = 0 ;
2022-06-21 01:18:53 +00:00
if ( IS_VAR_DATA_TYPE ( type ) ) {
2022-11-14 07:48:01 +00:00
dataConverToStr ( buf + VARSTR_HEADER_SIZE + * len , type , pTagVal - > pData , pTagVal - > nData , & tlen ) ;
2022-06-21 01:18:53 +00:00
} else {
2022-11-14 07:48:01 +00:00
dataConverToStr ( buf + VARSTR_HEADER_SIZE + * len , type , & pTagVal - > i64 , tDataTypes [ type ] . bytes , & tlen ) ;
2022-06-21 01:18:53 +00:00
}
* len + = tlen ;
j + + ;
} else {
2022-11-14 07:48:01 +00:00
* len + = sprintf ( buf + VARSTR_HEADER_SIZE + * len , " NULL " ) ;
2022-06-21 01:18:53 +00:00
}
2022-06-20 12:58:36 +00:00
/*
2023-05-24 07:36:46 +00:00
if ( type = = TSDB_DATA_TYPE_BINARY | | type = = TSDB_DATA_TYPE_GEOMETRY ) {
2022-06-20 12:58:36 +00:00
if ( pTagVal - > nData > 0 ) {
if ( num ) {
* len + = sprintf ( buf + VARSTR_HEADER_SIZE + * len , " , " ) ;
}
2022-06-28 05:59:49 +00:00
2022-06-20 12:58:36 +00:00
memcpy ( buf + VARSTR_HEADER_SIZE + * len , pTagVal - > pData , pTagVal - > nData ) ;
* len + = pTagVal - > nData ;
}
} else if ( type = = TSDB_DATA_TYPE_NCHAR ) {
if ( pTagVal - > nData > 0 ) {
if ( num ) {
* len + = sprintf ( buf + VARSTR_HEADER_SIZE + * len , " , " ) ;
}
int32_t tlen = taosUcs4ToMbs ( ( TdUcs4 * ) pTagVal - > pData , pTagVal - > nData , buf + VARSTR_HEADER_SIZE + * len ) ;
}
} else if ( type = = TSDB_DATA_TYPE_DOUBLE ) {
double val = * ( double * ) ( & pTagVal - > i64 ) ;
int len = 0 ;
term = indexTermCreate ( suid , ADD_VALUE , type , key , nKey , ( const char * ) & val , len ) ;
} else if ( type = = TSDB_DATA_TYPE_BOOL ) {
int val = * ( int * ) ( & pTagVal - > i64 ) ;
int len = 0 ;
term = indexTermCreate ( suid , ADD_VALUE , TSDB_DATA_TYPE_INT , key , nKey , ( const char * ) & val , len ) ;
}
*/
}
2022-06-21 01:18:53 +00:00
taosArrayDestroy ( pTagVals ) ;
2022-06-28 05:59:49 +00:00
return TSDB_CODE_SUCCESS ;
2022-06-20 12:58:36 +00:00
}
2022-08-02 12:20:44 +00:00
void appendTableOptions ( char * buf , int32_t * len , SDbCfgInfo * pDbCfg , STableCfg * pCfg ) {
2022-06-20 12:58:36 +00:00
if ( pCfg - > commentLen > 0 ) {
2022-11-14 07:48:01 +00:00
* len + = sprintf ( buf + VARSTR_HEADER_SIZE + * len , " COMMENT '%s' " , pCfg - > pComment ) ;
2022-06-20 12:58:36 +00:00
} else if ( 0 = = pCfg - > commentLen ) {
2022-11-14 07:48:01 +00:00
* len + = sprintf ( buf + VARSTR_HEADER_SIZE + * len , " COMMENT '' " ) ;
2022-06-20 12:58:36 +00:00
}
2022-08-02 12:20:44 +00:00
if ( NULL ! = pDbCfg - > pRetensions & & pCfg - > watermark1 > 0 ) {
2022-11-14 07:48:01 +00:00
* len + = sprintf ( buf + VARSTR_HEADER_SIZE + * len , " WATERMARK % " PRId64 " a " , pCfg - > watermark1 ) ;
2022-06-20 12:58:36 +00:00
if ( pCfg - > watermark2 > 0 ) {
2022-11-14 07:48:01 +00:00
* len + = sprintf ( buf + VARSTR_HEADER_SIZE + * len , " , % " PRId64 " a " , pCfg - > watermark2 ) ;
2022-06-20 12:58:36 +00:00
}
}
2022-08-02 12:20:44 +00:00
if ( NULL ! = pDbCfg - > pRetensions & & pCfg - > delay1 > 0 ) {
2022-11-14 07:48:01 +00:00
* len + = sprintf ( buf + VARSTR_HEADER_SIZE + * len , " MAX_DELAY % " PRId64 " a " , pCfg - > delay1 ) ;
2022-06-20 12:58:36 +00:00
if ( pCfg - > delay2 > 0 ) {
2022-11-14 07:48:01 +00:00
* len + = sprintf ( buf + VARSTR_HEADER_SIZE + * len , " , % " PRId64 " a " , pCfg - > delay2 ) ;
2022-06-20 12:58:36 +00:00
}
}
int32_t funcNum = taosArrayGetSize ( pCfg - > pFuncs ) ;
2022-08-02 12:20:44 +00:00
if ( NULL ! = pDbCfg - > pRetensions & & funcNum > 0 ) {
2022-11-14 07:48:01 +00:00
* len + = sprintf ( buf + VARSTR_HEADER_SIZE + * len , " ROLLUP( " ) ;
2022-06-20 12:58:36 +00:00
for ( int32_t i = 0 ; i < funcNum ; + + i ) {
char * pFunc = taosArrayGet ( pCfg - > pFuncs , i ) ;
2022-11-14 07:48:01 +00:00
* len + = sprintf ( buf + VARSTR_HEADER_SIZE + * len , " %s%s " , ( ( i > 0 ) ? " , " : " " ) , pFunc ) ;
2022-06-20 12:58:36 +00:00
}
2022-11-14 07:48:01 +00:00
* len + = sprintf ( buf + VARSTR_HEADER_SIZE + * len , " ) " ) ;
2022-06-20 12:58:36 +00:00
}
2022-06-21 10:41:12 +00:00
if ( pCfg - > ttl > 0 ) {
2022-11-14 07:48:01 +00:00
* len + = sprintf ( buf + VARSTR_HEADER_SIZE + * len , " TTL %d " , pCfg - > ttl ) ;
2022-06-21 10:41:12 +00:00
}
2023-07-17 14:24:27 +00:00
if ( TSDB_SUPER_TABLE = = pCfg - > tableType | | TSDB_NORMAL_TABLE = = pCfg - > tableType ) {
int32_t nSma = 0 ;
for ( int32_t i = 0 ; i < pCfg - > numOfColumns ; + + i ) {
if ( IS_BSMA_ON ( pCfg - > pSchemas + i ) ) {
+ + nSma ;
}
}
2023-08-10 05:02:34 +00:00
if ( nSma < pCfg - > numOfColumns & & nSma > 0 ) {
2023-07-17 14:24:27 +00:00
bool smaOn = false ;
2023-07-17 14:40:22 +00:00
* len + = sprintf ( buf + VARSTR_HEADER_SIZE + * len , " SMA( " ) ;
2023-07-17 14:24:27 +00:00
for ( int32_t i = 0 ; i < pCfg - > numOfColumns ; + + i ) {
if ( IS_BSMA_ON ( pCfg - > pSchemas + i ) ) {
if ( smaOn ) {
* len + = sprintf ( buf + VARSTR_HEADER_SIZE + * len , " ,`%s` " , ( pCfg - > pSchemas + i ) - > name ) ;
} else {
smaOn = true ;
2023-07-17 14:40:22 +00:00
* len + = sprintf ( buf + VARSTR_HEADER_SIZE + * len , " `%s` " , ( pCfg - > pSchemas + i ) - > name ) ;
2023-07-17 14:24:27 +00:00
}
}
}
* len + = sprintf ( buf + VARSTR_HEADER_SIZE + * len , " ) " ) ;
}
}
2022-06-20 12:58:36 +00:00
}
2022-08-02 12:20:44 +00:00
static int32_t setCreateTBResultIntoDataBlock ( SSDataBlock * pBlock , SDbCfgInfo * pDbCfg , char * tbName , STableCfg * pCfg ) {
2022-06-20 12:58:36 +00:00
int32_t code = 0 ;
blockDataEnsureCapacity ( pBlock , 1 ) ;
pBlock - > info . rows = 1 ;
SColumnInfoData * pCol1 = taosArrayGet ( pBlock - > pDataBlock , 0 ) ;
char buf1 [ SHOW_CREATE_TB_RESULT_FIELD1_LEN ] = { 0 } ;
STR_TO_VARSTR ( buf1 , tbName ) ;
2023-02-20 02:04:08 +00:00
colDataSetVal ( pCol1 , 0 , buf1 , false ) ;
2022-06-20 12:58:36 +00:00
SColumnInfoData * pCol2 = taosArrayGet ( pBlock - > pDataBlock , 1 ) ;
2022-10-21 09:24:06 +00:00
char * buf2 = taosMemoryMalloc ( SHOW_CREATE_TB_RESULT_FIELD2_LEN ) ;
if ( NULL = = buf2 ) {
2022-12-03 02:03:18 +00:00
terrno = TSDB_CODE_OUT_OF_MEMORY ;
2022-10-21 09:24:06 +00:00
return terrno ;
}
2022-11-28 03:22:11 +00:00
int32_t len = 0 ;
2022-06-20 12:58:36 +00:00
if ( TSDB_SUPER_TABLE = = pCfg - > tableType ) {
2022-11-14 07:48:01 +00:00
len + = sprintf ( buf2 + VARSTR_HEADER_SIZE , " CREATE STABLE `%s` ( " , tbName ) ;
2022-06-20 12:58:36 +00:00
appendColumnFields ( buf2 , & len , pCfg ) ;
2022-11-14 07:48:01 +00:00
len + = sprintf ( buf2 + VARSTR_HEADER_SIZE + len , " ) TAGS ( " ) ;
2022-06-28 05:59:49 +00:00
appendTagFields ( buf2 , & len , pCfg ) ;
2022-11-14 07:48:01 +00:00
len + = sprintf ( buf2 + VARSTR_HEADER_SIZE + len , " ) " ) ;
2022-08-02 12:20:44 +00:00
appendTableOptions ( buf2 , & len , pDbCfg , pCfg ) ;
2022-06-20 12:58:36 +00:00
} else if ( TSDB_CHILD_TABLE = = pCfg - > tableType ) {
2022-11-14 07:48:01 +00:00
len + = sprintf ( buf2 + VARSTR_HEADER_SIZE , " CREATE TABLE `%s` USING `%s` ( " , tbName , pCfg - > stbName ) ;
2022-06-21 01:18:53 +00:00
appendTagNameFields ( buf2 , & len , pCfg ) ;
2022-11-14 07:48:01 +00:00
len + = sprintf ( buf2 + VARSTR_HEADER_SIZE + len , " ) TAGS ( " ) ;
2022-06-20 12:58:36 +00:00
code = appendTagValues ( buf2 , & len , pCfg ) ;
if ( code ) {
2022-10-21 09:24:06 +00:00
taosMemoryFree ( buf2 ) ;
2022-06-20 12:58:36 +00:00
return code ;
}
2022-11-14 07:48:01 +00:00
len + = sprintf ( buf2 + VARSTR_HEADER_SIZE + len , " ) " ) ;
2022-08-02 12:20:44 +00:00
appendTableOptions ( buf2 , & len , pDbCfg , pCfg ) ;
2022-06-20 12:58:36 +00:00
} else {
2022-11-14 07:48:01 +00:00
len + = sprintf ( buf2 + VARSTR_HEADER_SIZE , " CREATE TABLE `%s` ( " , tbName ) ;
2022-06-20 12:58:36 +00:00
appendColumnFields ( buf2 , & len , pCfg ) ;
2022-11-14 07:48:01 +00:00
len + = sprintf ( buf2 + VARSTR_HEADER_SIZE + len , " ) " ) ;
2022-08-30 03:30:43 +00:00
appendTableOptions ( buf2 , & len , pDbCfg , pCfg ) ;
2022-06-20 12:58:36 +00:00
}
2022-11-14 07:48:01 +00:00
varDataLen ( buf2 ) = ( len > 65535 ) ? 65535 : len ;
2022-06-28 05:59:49 +00:00
2023-02-20 02:04:08 +00:00
colDataSetVal ( pCol2 , 0 , buf2 , false ) ;
2022-06-20 12:58:36 +00:00
2022-10-21 09:24:06 +00:00
taosMemoryFree ( buf2 ) ;
2022-11-28 03:22:11 +00:00
2022-06-20 12:58:36 +00:00
return TSDB_CODE_SUCCESS ;
}
2023-10-11 02:38:22 +00:00
static int32_t setCreateViewResultIntoDataBlock ( SSDataBlock * pBlock , SShowCreateViewStmt * pStmt ) {
int32_t code = 0 ;
blockDataEnsureCapacity ( pBlock , 1 ) ;
pBlock - > info . rows = 1 ;
SColumnInfoData * pCol1 = taosArrayGet ( pBlock - > pDataBlock , 0 ) ;
char buf1 [ SHOW_CREATE_VIEW_RESULT_FIELD1_LEN + 1 ] = { 0 } ;
snprintf ( varDataVal ( buf1 ) , TSDB_VIEW_FNAME_LEN + 4 , " `%s`.`%s` " , pStmt - > dbName , pStmt - > viewName ) ;
varDataSetLen ( buf1 , strlen ( varDataVal ( buf1 ) ) ) ;
colDataSetVal ( pCol1 , 0 , buf1 , false ) ;
SColumnInfoData * pCol2 = taosArrayGet ( pBlock - > pDataBlock , 1 ) ;
char * buf2 = taosMemoryMalloc ( SHOW_CREATE_VIEW_RESULT_FIELD2_LEN ) ;
if ( NULL = = buf2 ) {
terrno = TSDB_CODE_OUT_OF_MEMORY ;
return terrno ;
}
SViewMeta * pMeta = pStmt - > pViewMeta ;
snprintf ( varDataVal ( buf2 ) , SHOW_CREATE_VIEW_RESULT_FIELD2_LEN - VARSTR_HEADER_SIZE , " CREATE VIEW `%s`.`%s` AS %s " , pStmt - > dbName , pStmt - > viewName , pMeta - > querySql ) ;
int32_t len = strlen ( varDataVal ( buf2 ) ) ;
varDataLen ( buf2 ) = ( len > 65535 ) ? 65535 : len ;
colDataSetVal ( pCol2 , 0 , buf2 , false ) ;
taosMemoryFree ( buf2 ) ;
return TSDB_CODE_SUCCESS ;
}
2022-06-20 12:58:36 +00:00
static int32_t execShowCreateTable ( SShowCreateTableStmt * pStmt , SRetrieveTableRsp * * pRsp ) {
2022-10-17 07:43:42 +00:00
SSDataBlock * pBlock = NULL ;
int32_t code = buildCreateTbResultDataBlock ( & pBlock ) ;
if ( TSDB_CODE_SUCCESS = = code ) {
code = setCreateTBResultIntoDataBlock ( pBlock , pStmt - > pDbCfg , pStmt - > tableName , pStmt - > pTableCfg ) ;
2022-06-20 12:58:36 +00:00
}
2022-10-17 07:43:42 +00:00
if ( TSDB_CODE_SUCCESS = = code ) {
code = buildRetrieveTableRsp ( pBlock , SHOW_CREATE_TB_RESULT_COLS , pRsp ) ;
}
blockDataDestroy ( pBlock ) ;
return code ;
2022-06-20 12:58:36 +00:00
}
static int32_t execShowCreateSTable ( SShowCreateTableStmt * pStmt , SRetrieveTableRsp * * pRsp ) {
2022-08-02 12:20:44 +00:00
STableCfg * pCfg = ( STableCfg * ) pStmt - > pTableCfg ;
2022-06-20 12:58:36 +00:00
if ( TSDB_SUPER_TABLE ! = pCfg - > tableType ) {
terrno = TSDB_CODE_TSC_NOT_STABLE_ERROR ;
return terrno ;
}
2022-06-28 05:59:49 +00:00
2022-06-20 12:58:36 +00:00
return execShowCreateTable ( pStmt , pRsp ) ;
}
2022-06-17 13:16:13 +00:00
2022-07-14 06:03:27 +00:00
static int32_t execAlterCmd ( char * cmd , char * value , bool * processed ) {
int32_t code = 0 ;
2022-07-16 06:22:30 +00:00
2022-07-14 06:03:27 +00:00
if ( 0 = = strcasecmp ( cmd , COMMAND_RESET_LOG ) ) {
taosResetLog ( ) ;
cfgDumpCfg ( tsCfg , 0 , false ) ;
} else if ( 0 = = strcasecmp ( cmd , COMMAND_SCHEDULE_POLICY ) ) {
code = schedulerUpdatePolicy ( atoi ( value ) ) ;
} else if ( 0 = = strcasecmp ( cmd , COMMAND_ENABLE_RESCHEDULE ) ) {
code = schedulerEnableReSchedule ( atoi ( value ) ) ;
2022-11-02 07:18:32 +00:00
} else if ( 0 = = strcasecmp ( cmd , COMMAND_CATALOG_DEBUG ) ) {
code = ctgdHandleDbgCommand ( value ) ;
2023-02-17 09:40:14 +00:00
} else if ( 0 = = strcasecmp ( cmd , COMMAND_ENABLE_MEM_DEBUG ) ) {
code = taosMemoryDbgInit ( ) ;
if ( code ) {
qError ( " failed to init memory dbg, error:%s " , tstrerror ( code ) ) ;
return code ;
}
2023-02-17 09:45:44 +00:00
tsAsyncLog = false ;
2023-02-17 09:40:14 +00:00
qInfo ( " memory dbg enabled " ) ;
} else if ( 0 = = strcasecmp ( cmd , COMMAND_DISABLE_MEM_DEBUG ) ) {
code = taosMemoryDbgInitRestore ( ) ;
if ( code ) {
qError ( " failed to restore from memory dbg, error:%s " , tstrerror ( code ) ) ;
return code ;
}
qInfo ( " memory dbg disabled " ) ;
2022-07-14 06:03:27 +00:00
} else {
goto _return ;
}
* processed = true ;
_return :
if ( code ) {
terrno = code ;
}
2022-07-16 06:22:30 +00:00
return code ;
2022-07-14 06:03:27 +00:00
}
2022-06-28 05:59:49 +00:00
static int32_t execAlterLocal ( SAlterLocalStmt * pStmt ) {
2022-07-14 06:03:27 +00:00
bool processed = false ;
2022-07-16 06:22:30 +00:00
2022-07-14 06:03:27 +00:00
if ( execAlterCmd ( pStmt - > config , pStmt - > value , & processed ) ) {
return terrno ;
}
if ( processed ) {
goto _return ;
}
2022-07-16 06:22:30 +00:00
2023-10-23 02:46:48 +00:00
if ( cfgCheckRangeForDynUpdate ( tsCfg , pStmt - > config , pStmt - > value , false ) ) {
2022-07-30 01:50:19 +00:00
return terrno ;
}
2022-06-22 11:45:41 +00:00
if ( cfgSetItem ( tsCfg , pStmt - > config , pStmt - > value , CFG_STYPE_ALTER_CMD ) ) {
2022-06-28 05:59:49 +00:00
return terrno ;
2022-06-22 11:45:41 +00:00
}
2023-11-13 06:49:50 +00:00
if ( taosCfgDynamicOptions ( tsCfg , pStmt - > config , false ) ) {
2022-06-28 05:59:49 +00:00
return terrno ;
2022-06-24 00:20:54 +00:00
}
2022-07-14 06:03:27 +00:00
_return :
2022-06-22 11:45:41 +00:00
return TSDB_CODE_SUCCESS ;
}
2022-03-31 06:19:11 +00:00
2022-10-17 07:43:42 +00:00
static int32_t buildLocalVariablesResultDataBlock ( SSDataBlock * * pOutput ) {
2022-06-22 09:17:18 +00:00
SSDataBlock * pBlock = taosMemoryCalloc ( 1 , sizeof ( SSDataBlock ) ) ;
2022-10-17 07:43:42 +00:00
if ( NULL = = pBlock ) {
return TSDB_CODE_OUT_OF_MEMORY ;
}
2022-06-22 09:17:18 +00:00
pBlock - > info . hasVarCol = true ;
2022-06-23 05:59:31 +00:00
pBlock - > pDataBlock = taosArrayInit ( SHOW_LOCAL_VARIABLES_RESULT_COLS , sizeof ( SColumnInfoData ) ) ;
2022-06-22 09:17:18 +00:00
SColumnInfoData infoData = { 0 } ;
2023-07-14 06:38:35 +00:00
2022-06-22 09:17:18 +00:00
infoData . info . type = TSDB_DATA_TYPE_VARCHAR ;
infoData . info . bytes = SHOW_LOCAL_VARIABLES_RESULT_FIELD1_LEN ;
taosArrayPush ( pBlock - > pDataBlock , & infoData ) ;
infoData . info . type = TSDB_DATA_TYPE_VARCHAR ;
infoData . info . bytes = SHOW_LOCAL_VARIABLES_RESULT_FIELD2_LEN ;
taosArrayPush ( pBlock - > pDataBlock , & infoData ) ;
2023-07-14 06:38:35 +00:00
infoData . info . type = TSDB_DATA_TYPE_VARCHAR ;
infoData . info . bytes = SHOW_LOCAL_VARIABLES_RESULT_FIELD3_LEN ;
taosArrayPush ( pBlock - > pDataBlock , & infoData ) ;
2022-10-17 07:43:42 +00:00
* pOutput = pBlock ;
return TSDB_CODE_SUCCESS ;
2022-06-22 09:17:18 +00:00
}
int32_t setLocalVariablesResultIntoDataBlock ( SSDataBlock * pBlock ) {
int32_t numOfCfg = taosArrayGetSize ( tsCfg - > array ) ;
int32_t numOfRows = 0 ;
blockDataEnsureCapacity ( pBlock , numOfCfg ) ;
for ( int32_t i = 0 , c = 0 ; i < numOfCfg ; + + i , c = 0 ) {
2022-06-28 05:59:49 +00:00
SConfigItem * pItem = taosArrayGet ( tsCfg - > array , i ) ;
2022-08-01 11:54:13 +00:00
GRANT_CFG_SKIP ;
2023-07-14 06:38:35 +00:00
2022-06-22 09:17:18 +00:00
char name [ TSDB_CONFIG_OPTION_LEN + VARSTR_HEADER_SIZE ] = { 0 } ;
STR_WITH_MAXSIZE_TO_VARSTR ( name , pItem - > name , TSDB_CONFIG_OPTION_LEN + VARSTR_HEADER_SIZE ) ;
2022-06-28 05:59:49 +00:00
SColumnInfoData * pColInfo = taosArrayGet ( pBlock - > pDataBlock , c + + ) ;
2023-02-20 02:04:08 +00:00
colDataSetVal ( pColInfo , i , name , false ) ;
2022-06-28 05:59:49 +00:00
char value [ TSDB_CONFIG_VALUE_LEN + VARSTR_HEADER_SIZE ] = { 0 } ;
2022-06-22 09:17:18 +00:00
int32_t valueLen = 0 ;
cfgDumpItemValue ( pItem , & value [ VARSTR_HEADER_SIZE ] , TSDB_CONFIG_VALUE_LEN , & valueLen ) ;
varDataSetLen ( value , valueLen ) ;
pColInfo = taosArrayGet ( pBlock - > pDataBlock , c + + ) ;
2023-02-20 02:04:08 +00:00
colDataSetVal ( pColInfo , i , value , false ) ;
2022-06-22 09:17:18 +00:00
2023-07-14 06:38:35 +00:00
char scope [ TSDB_CONFIG_SCOPE_LEN + VARSTR_HEADER_SIZE ] = { 0 } ;
cfgDumpItemScope ( pItem , & scope [ VARSTR_HEADER_SIZE ] , TSDB_CONFIG_SCOPE_LEN , & valueLen ) ;
varDataSetLen ( scope , valueLen ) ;
pColInfo = taosArrayGet ( pBlock - > pDataBlock , c + + ) ;
colDataSetVal ( pColInfo , i , scope , false ) ;
2022-06-22 09:17:18 +00:00
numOfRows + + ;
}
pBlock - > info . rows = numOfRows ;
2022-06-28 05:59:49 +00:00
2022-06-22 09:17:18 +00:00
return TSDB_CODE_SUCCESS ;
}
static int32_t execShowLocalVariables ( SRetrieveTableRsp * * pRsp ) {
2022-10-17 07:43:42 +00:00
SSDataBlock * pBlock = NULL ;
int32_t code = buildLocalVariablesResultDataBlock ( & pBlock ) ;
if ( TSDB_CODE_SUCCESS = = code ) {
code = setLocalVariablesResultIntoDataBlock ( pBlock ) ;
2022-06-22 09:17:18 +00:00
}
2022-10-17 07:43:42 +00:00
if ( TSDB_CODE_SUCCESS = = code ) {
code = buildRetrieveTableRsp ( pBlock , SHOW_LOCAL_VARIABLES_RESULT_COLS , pRsp ) ;
}
blockDataDestroy ( pBlock ) ;
return code ;
2022-06-29 03:41:32 +00:00
}
2022-06-22 09:17:18 +00:00
2022-06-29 03:41:32 +00:00
static int32_t createSelectResultDataBlock ( SNodeList * pProjects , SSDataBlock * * pOutput ) {
2022-07-05 11:09:00 +00:00
SSDataBlock * pBlock = createDataBlock ( ) ;
2022-06-29 03:41:32 +00:00
if ( NULL = = pBlock ) {
2022-06-22 09:17:18 +00:00
return TSDB_CODE_OUT_OF_MEMORY ;
}
2022-06-29 03:41:32 +00:00
SNode * pProj = NULL ;
FOREACH ( pProj , pProjects ) {
2022-11-28 03:22:11 +00:00
SExprNode * pExpr = ( SExprNode * ) pProj ;
2022-06-29 03:41:32 +00:00
SColumnInfoData infoData = { 0 } ;
2022-11-28 03:22:11 +00:00
if ( TSDB_DATA_TYPE_NULL = = pExpr - > resType . type ) {
infoData . info . type = TSDB_DATA_TYPE_VARCHAR ;
infoData . info . bytes = 0 ;
} else {
infoData . info . type = pExpr - > resType . type ;
infoData . info . bytes = pExpr - > resType . bytes ;
}
2022-07-05 11:09:00 +00:00
blockDataAppendColInfo ( pBlock , & infoData ) ;
2022-06-29 03:41:32 +00:00
}
* pOutput = pBlock ;
return TSDB_CODE_SUCCESS ;
}
int32_t buildSelectResultDataBlock ( SNodeList * pProjects , SSDataBlock * pBlock ) {
blockDataEnsureCapacity ( pBlock , 1 ) ;
int32_t index = 0 ;
SNode * pProj = NULL ;
FOREACH ( pProj , pProjects ) {
2022-07-13 09:14:04 +00:00
if ( QUERY_NODE_VALUE ! = nodeType ( pProj ) ) {
return TSDB_CODE_PAR_INVALID_SELECTED_EXPR ;
2022-06-29 03:41:32 +00:00
} else {
2022-07-13 09:14:04 +00:00
if ( ( ( SValueNode * ) pProj ) - > isNull ) {
2023-02-20 02:04:08 +00:00
colDataSetVal ( taosArrayGet ( pBlock - > pDataBlock , index + + ) , 0 , NULL , true ) ;
2022-07-13 09:14:04 +00:00
} else {
2023-02-20 02:04:08 +00:00
colDataSetVal ( taosArrayGet ( pBlock - > pDataBlock , index + + ) , 0 , nodesGetValueFromNode ( ( SValueNode * ) pProj ) , false ) ;
2022-07-13 09:14:04 +00:00
}
2022-06-29 03:41:32 +00:00
}
}
pBlock - > info . rows = 1 ;
2022-06-22 09:17:18 +00:00
return TSDB_CODE_SUCCESS ;
}
2022-06-20 12:36:15 +00:00
2022-06-29 03:41:32 +00:00
static int32_t execSelectWithoutFrom ( SSelectStmt * pSelect , SRetrieveTableRsp * * pRsp ) {
SSDataBlock * pBlock = NULL ;
int32_t code = createSelectResultDataBlock ( pSelect - > pProjectionList , & pBlock ) ;
if ( TSDB_CODE_SUCCESS = = code ) {
code = buildSelectResultDataBlock ( pSelect - > pProjectionList , pBlock ) ;
}
if ( TSDB_CODE_SUCCESS = = code ) {
code = buildRetrieveTableRsp ( pBlock , LIST_LENGTH ( pSelect - > pProjectionList ) , pRsp ) ;
}
2022-10-17 07:43:42 +00:00
blockDataDestroy ( pBlock ) ;
2022-06-29 03:41:32 +00:00
return code ;
}
2023-10-11 02:38:22 +00:00
static int32_t execShowCreateView ( SShowCreateViewStmt * pStmt , SRetrieveTableRsp * * pRsp ) {
SSDataBlock * pBlock = NULL ;
int32_t code = buildCreateViewResultDataBlock ( & pBlock ) ;
if ( TSDB_CODE_SUCCESS = = code ) {
code = setCreateViewResultIntoDataBlock ( pBlock , pStmt ) ;
}
if ( TSDB_CODE_SUCCESS = = code ) {
code = buildRetrieveTableRsp ( pBlock , SHOW_CREATE_VIEW_RESULT_COLS , pRsp ) ;
}
blockDataDestroy ( pBlock ) ;
return code ;
}
2023-09-18 08:59:07 +00:00
int32_t qExecCommand ( int64_t * pConnId , bool sysInfoUser , SNode * pStmt , SRetrieveTableRsp * * pRsp , int8_t biMode ) {
2022-03-31 06:19:11 +00:00
switch ( nodeType ( pStmt ) ) {
case QUERY_NODE_DESCRIBE_STMT :
2023-09-18 08:59:07 +00:00
return execDescribe ( sysInfoUser , pStmt , pRsp , biMode ) ;
2022-03-31 06:19:11 +00:00
case QUERY_NODE_RESET_QUERY_CACHE_STMT :
return execResetQueryCache ( ) ;
2022-06-17 13:16:13 +00:00
case QUERY_NODE_SHOW_CREATE_DATABASE_STMT :
2022-06-18 11:50:53 +00:00
return execShowCreateDatabase ( ( SShowCreateDatabaseStmt * ) pStmt , pRsp ) ;
2022-06-17 13:16:13 +00:00
case QUERY_NODE_SHOW_CREATE_TABLE_STMT :
2022-06-20 12:58:36 +00:00
return execShowCreateTable ( ( SShowCreateTableStmt * ) pStmt , pRsp ) ;
2022-06-17 13:16:13 +00:00
case QUERY_NODE_SHOW_CREATE_STABLE_STMT :
2022-06-20 12:58:36 +00:00
return execShowCreateSTable ( ( SShowCreateTableStmt * ) pStmt , pRsp ) ;
2023-10-11 02:38:22 +00:00
case QUERY_NODE_SHOW_CREATE_VIEW_STMT :
return execShowCreateView ( ( SShowCreateViewStmt * ) pStmt , pRsp ) ;
2022-06-17 13:16:13 +00:00
case QUERY_NODE_ALTER_LOCAL_STMT :
return execAlterLocal ( ( SAlterLocalStmt * ) pStmt ) ;
2022-06-20 12:36:15 +00:00
case QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT :
2022-06-22 09:17:18 +00:00
return execShowLocalVariables ( pRsp ) ;
2022-06-29 03:41:32 +00:00
case QUERY_NODE_SELECT_STMT :
return execSelectWithoutFrom ( ( SSelectStmt * ) pStmt , pRsp ) ;
2022-12-29 10:07:57 +00:00
case QUERY_NODE_SHOW_DB_ALIVE_STMT :
case QUERY_NODE_SHOW_CLUSTER_ALIVE_STMT :
2023-09-19 10:44:27 +00:00
return execShowAliveStatus ( pConnId , ( SShowAliveStmt * ) pStmt , pRsp ) ;
2022-03-31 06:19:11 +00:00
default :
break ;
}
return TSDB_CODE_FAILED ;
}