TD-13881 implement create/alter/drop/show user, create/drop/show dnode, drop database, show stables and drop table
This commit is contained in:
parent
111a06da9e
commit
f88de49f55
|
@ -913,6 +913,8 @@ int32_t tDeserializeSCreateDnodeReq(void* buf, int32_t bufLen, SCreateDnodeReq*
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t dnodeId;
|
int32_t dnodeId;
|
||||||
|
char fqdn[TSDB_FQDN_LEN];
|
||||||
|
int32_t port;
|
||||||
} SDropDnodeReq;
|
} SDropDnodeReq;
|
||||||
|
|
||||||
int32_t tSerializeSDropDnodeReq(void* buf, int32_t bufLen, SDropDnodeReq* pReq);
|
int32_t tSerializeSDropDnodeReq(void* buf, int32_t bufLen, SDropDnodeReq* pReq);
|
||||||
|
|
|
@ -34,110 +34,121 @@
|
||||||
#define TK_NK_REM 16
|
#define TK_NK_REM 16
|
||||||
#define TK_NK_CONCAT 17
|
#define TK_NK_CONCAT 17
|
||||||
#define TK_CREATE 18
|
#define TK_CREATE 18
|
||||||
#define TK_DATABASE 19
|
#define TK_USER 19
|
||||||
#define TK_IF 20
|
#define TK_PASS 20
|
||||||
#define TK_NOT 21
|
#define TK_NK_STRING 21
|
||||||
#define TK_EXISTS 22
|
#define TK_ALTER 22
|
||||||
#define TK_BLOCKS 23
|
#define TK_PRIVILEGE 23
|
||||||
#define TK_NK_INTEGER 24
|
#define TK_DROP 24
|
||||||
#define TK_CACHE 25
|
#define TK_SHOW 25
|
||||||
#define TK_CACHELAST 26
|
#define TK_USERS 26
|
||||||
#define TK_COMP 27
|
#define TK_DNODE 27
|
||||||
#define TK_DAYS 28
|
#define TK_PORT 28
|
||||||
#define TK_FSYNC 29
|
#define TK_NK_INTEGER 29
|
||||||
#define TK_MAXROWS 30
|
#define TK_DNODES 30
|
||||||
#define TK_MINROWS 31
|
#define TK_NK_ID 31
|
||||||
#define TK_KEEP 32
|
#define TK_NK_IPTOKEN 32
|
||||||
#define TK_PRECISION 33
|
#define TK_DATABASE 33
|
||||||
#define TK_NK_STRING 34
|
#define TK_DATABASES 34
|
||||||
#define TK_QUORUM 35
|
#define TK_USE 35
|
||||||
#define TK_REPLICA 36
|
#define TK_IF 36
|
||||||
#define TK_TTL 37
|
#define TK_NOT 37
|
||||||
#define TK_WAL 38
|
#define TK_EXISTS 38
|
||||||
#define TK_VGROUPS 39
|
#define TK_BLOCKS 39
|
||||||
#define TK_SINGLE_STABLE 40
|
#define TK_CACHE 40
|
||||||
#define TK_STREAM_MODE 41
|
#define TK_CACHELAST 41
|
||||||
#define TK_USE 42
|
#define TK_COMP 42
|
||||||
#define TK_TABLE 43
|
#define TK_DAYS 43
|
||||||
#define TK_NK_LP 44
|
#define TK_FSYNC 44
|
||||||
#define TK_NK_RP 45
|
#define TK_MAXROWS 45
|
||||||
#define TK_STABLE 46
|
#define TK_MINROWS 46
|
||||||
#define TK_USING 47
|
#define TK_KEEP 47
|
||||||
#define TK_TAGS 48
|
#define TK_PRECISION 48
|
||||||
#define TK_NK_ID 49
|
#define TK_QUORUM 49
|
||||||
#define TK_NK_DOT 50
|
#define TK_REPLICA 50
|
||||||
#define TK_NK_COMMA 51
|
#define TK_TTL 51
|
||||||
#define TK_COMMENT 52
|
#define TK_WAL 52
|
||||||
#define TK_BOOL 53
|
#define TK_VGROUPS 53
|
||||||
#define TK_TINYINT 54
|
#define TK_SINGLE_STABLE 54
|
||||||
#define TK_SMALLINT 55
|
#define TK_STREAM_MODE 55
|
||||||
#define TK_INT 56
|
#define TK_TABLE 56
|
||||||
#define TK_INTEGER 57
|
#define TK_NK_LP 57
|
||||||
#define TK_BIGINT 58
|
#define TK_NK_RP 58
|
||||||
#define TK_FLOAT 59
|
#define TK_STABLE 59
|
||||||
#define TK_DOUBLE 60
|
#define TK_TABLES 60
|
||||||
#define TK_BINARY 61
|
#define TK_STABLES 61
|
||||||
#define TK_TIMESTAMP 62
|
#define TK_USING 62
|
||||||
#define TK_NCHAR 63
|
#define TK_TAGS 63
|
||||||
#define TK_UNSIGNED 64
|
#define TK_NK_DOT 64
|
||||||
#define TK_JSON 65
|
#define TK_NK_COMMA 65
|
||||||
#define TK_VARCHAR 66
|
#define TK_COMMENT 66
|
||||||
#define TK_MEDIUMBLOB 67
|
#define TK_BOOL 67
|
||||||
#define TK_BLOB 68
|
#define TK_TINYINT 68
|
||||||
#define TK_VARBINARY 69
|
#define TK_SMALLINT 69
|
||||||
#define TK_DECIMAL 70
|
#define TK_INT 70
|
||||||
#define TK_SMA 71
|
#define TK_INTEGER 71
|
||||||
#define TK_SHOW 72
|
#define TK_BIGINT 72
|
||||||
#define TK_DATABASES 73
|
#define TK_FLOAT 73
|
||||||
#define TK_TABLES 74
|
#define TK_DOUBLE 74
|
||||||
#define TK_NK_FLOAT 75
|
#define TK_BINARY 75
|
||||||
#define TK_NK_BOOL 76
|
#define TK_TIMESTAMP 76
|
||||||
#define TK_NK_VARIABLE 77
|
#define TK_NCHAR 77
|
||||||
#define TK_BETWEEN 78
|
#define TK_UNSIGNED 78
|
||||||
#define TK_IS 79
|
#define TK_JSON 79
|
||||||
#define TK_NULL 80
|
#define TK_VARCHAR 80
|
||||||
#define TK_NK_LT 81
|
#define TK_MEDIUMBLOB 81
|
||||||
#define TK_NK_GT 82
|
#define TK_BLOB 82
|
||||||
#define TK_NK_LE 83
|
#define TK_VARBINARY 83
|
||||||
#define TK_NK_GE 84
|
#define TK_DECIMAL 84
|
||||||
#define TK_NK_NE 85
|
#define TK_SMA 85
|
||||||
#define TK_NK_EQ 86
|
#define TK_NK_FLOAT 86
|
||||||
#define TK_LIKE 87
|
#define TK_NK_BOOL 87
|
||||||
#define TK_MATCH 88
|
#define TK_NK_VARIABLE 88
|
||||||
#define TK_NMATCH 89
|
#define TK_BETWEEN 89
|
||||||
#define TK_IN 90
|
#define TK_IS 90
|
||||||
#define TK_FROM 91
|
#define TK_NULL 91
|
||||||
#define TK_AS 92
|
#define TK_NK_LT 92
|
||||||
#define TK_JOIN 93
|
#define TK_NK_GT 93
|
||||||
#define TK_ON 94
|
#define TK_NK_LE 94
|
||||||
#define TK_INNER 95
|
#define TK_NK_GE 95
|
||||||
#define TK_SELECT 96
|
#define TK_NK_NE 96
|
||||||
#define TK_DISTINCT 97
|
#define TK_NK_EQ 97
|
||||||
#define TK_WHERE 98
|
#define TK_LIKE 98
|
||||||
#define TK_PARTITION 99
|
#define TK_MATCH 99
|
||||||
#define TK_BY 100
|
#define TK_NMATCH 100
|
||||||
#define TK_SESSION 101
|
#define TK_IN 101
|
||||||
#define TK_STATE_WINDOW 102
|
#define TK_FROM 102
|
||||||
#define TK_INTERVAL 103
|
#define TK_AS 103
|
||||||
#define TK_SLIDING 104
|
#define TK_JOIN 104
|
||||||
#define TK_FILL 105
|
#define TK_ON 105
|
||||||
#define TK_VALUE 106
|
#define TK_INNER 106
|
||||||
#define TK_NONE 107
|
#define TK_SELECT 107
|
||||||
#define TK_PREV 108
|
#define TK_DISTINCT 108
|
||||||
#define TK_LINEAR 109
|
#define TK_WHERE 109
|
||||||
#define TK_NEXT 110
|
#define TK_PARTITION 110
|
||||||
#define TK_GROUP 111
|
#define TK_BY 111
|
||||||
#define TK_HAVING 112
|
#define TK_SESSION 112
|
||||||
#define TK_ORDER 113
|
#define TK_STATE_WINDOW 113
|
||||||
#define TK_SLIMIT 114
|
#define TK_INTERVAL 114
|
||||||
#define TK_SOFFSET 115
|
#define TK_SLIDING 115
|
||||||
#define TK_LIMIT 116
|
#define TK_FILL 116
|
||||||
#define TK_OFFSET 117
|
#define TK_VALUE 117
|
||||||
#define TK_ASC 118
|
#define TK_NONE 118
|
||||||
#define TK_DESC 119
|
#define TK_PREV 119
|
||||||
#define TK_NULLS 120
|
#define TK_LINEAR 120
|
||||||
#define TK_FIRST 121
|
#define TK_NEXT 121
|
||||||
#define TK_LAST 122
|
#define TK_GROUP 122
|
||||||
|
#define TK_HAVING 123
|
||||||
|
#define TK_ORDER 124
|
||||||
|
#define TK_SLIMIT 125
|
||||||
|
#define TK_SOFFSET 126
|
||||||
|
#define TK_LIMIT 127
|
||||||
|
#define TK_OFFSET 128
|
||||||
|
#define TK_ASC 129
|
||||||
|
#define TK_DESC 130
|
||||||
|
#define TK_NULLS 131
|
||||||
|
#define TK_FIRST 132
|
||||||
|
#define TK_LAST 133
|
||||||
|
|
||||||
#define TK_NK_SPACE 300
|
#define TK_NK_SPACE 300
|
||||||
#define TK_NK_COMMENT 301
|
#define TK_NK_COMMENT 301
|
||||||
|
@ -155,9 +166,8 @@
|
||||||
#define TK_NOW 504
|
#define TK_NOW 504
|
||||||
#define TK_VALUES 507
|
#define TK_VALUES 507
|
||||||
#define TK_IMPORT 507
|
#define TK_IMPORT 507
|
||||||
#define TK_SEMI 508
|
#define TK_NK_SEMI 508
|
||||||
#define TK_IPTOKEN 509
|
|
||||||
|
|
||||||
#define TK_NIL 65535
|
#define TK_NK_NIL 65535
|
||||||
|
|
||||||
#endif /*_TD_COMMON_TOKEN_H_*/
|
#endif /*_TD_COMMON_TOKEN_H_*/
|
||||||
|
|
|
@ -54,6 +54,12 @@ typedef struct SUseDatabaseStmt {
|
||||||
char dbName[TSDB_DB_NAME_LEN];
|
char dbName[TSDB_DB_NAME_LEN];
|
||||||
} SUseDatabaseStmt;
|
} SUseDatabaseStmt;
|
||||||
|
|
||||||
|
typedef struct SDropDatabaseStmt {
|
||||||
|
ENodeType type;
|
||||||
|
char dbName[TSDB_DB_NAME_LEN];
|
||||||
|
bool ignoreNotExists;
|
||||||
|
} SDropDatabaseStmt;
|
||||||
|
|
||||||
typedef struct STableOptions {
|
typedef struct STableOptions {
|
||||||
int32_t keep;
|
int32_t keep;
|
||||||
int32_t ttl;
|
int32_t ttl;
|
||||||
|
@ -94,6 +100,49 @@ typedef struct SCreateMultiTableStmt {
|
||||||
SNodeList* pSubTables;
|
SNodeList* pSubTables;
|
||||||
} SCreateMultiTableStmt;
|
} SCreateMultiTableStmt;
|
||||||
|
|
||||||
|
typedef struct SDropTableClause {
|
||||||
|
ENodeType type;
|
||||||
|
char dbName[TSDB_DB_NAME_LEN];
|
||||||
|
char tableName[TSDB_TABLE_NAME_LEN];
|
||||||
|
bool ignoreNotExists;
|
||||||
|
} SDropTableClause;
|
||||||
|
|
||||||
|
typedef struct SDropTableStmt {
|
||||||
|
ENodeType type;
|
||||||
|
SNodeList* pTables;
|
||||||
|
} SDropTableStmt;
|
||||||
|
|
||||||
|
typedef struct SCreateUserStmt {
|
||||||
|
ENodeType type;
|
||||||
|
char useName[TSDB_USER_LEN];
|
||||||
|
char password[TSDB_USET_PASSWORD_LEN];
|
||||||
|
} SCreateUserStmt;
|
||||||
|
|
||||||
|
typedef struct SAlterUserStmt {
|
||||||
|
ENodeType type;
|
||||||
|
char useName[TSDB_USER_LEN];
|
||||||
|
char password[TSDB_USET_PASSWORD_LEN];
|
||||||
|
int8_t alterType;
|
||||||
|
} SAlterUserStmt;
|
||||||
|
|
||||||
|
typedef struct SDropUserStmt {
|
||||||
|
ENodeType type;
|
||||||
|
char useName[TSDB_USER_LEN];
|
||||||
|
} SDropUserStmt;
|
||||||
|
|
||||||
|
typedef struct SCreateDnodeStmt {
|
||||||
|
ENodeType type;
|
||||||
|
char fqdn[TSDB_FQDN_LEN];
|
||||||
|
int32_t port;
|
||||||
|
} SCreateDnodeStmt;
|
||||||
|
|
||||||
|
typedef struct SDropDnodeStmt {
|
||||||
|
ENodeType type;
|
||||||
|
int32_t dnodeId;
|
||||||
|
char fqdn[TSDB_FQDN_LEN];
|
||||||
|
int32_t port;
|
||||||
|
} SDropDnodeStmt;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -72,12 +72,24 @@ typedef enum ENodeType {
|
||||||
QUERY_NODE_SELECT_STMT,
|
QUERY_NODE_SELECT_STMT,
|
||||||
QUERY_NODE_VNODE_MODIF_STMT,
|
QUERY_NODE_VNODE_MODIF_STMT,
|
||||||
QUERY_NODE_CREATE_DATABASE_STMT,
|
QUERY_NODE_CREATE_DATABASE_STMT,
|
||||||
|
QUERY_NODE_DROP_DATABASE_STMT,
|
||||||
|
QUERY_NODE_SHOW_DATABASES_STMT, // temp
|
||||||
QUERY_NODE_CREATE_TABLE_STMT,
|
QUERY_NODE_CREATE_TABLE_STMT,
|
||||||
QUERY_NODE_CREATE_SUBTABLE_CLAUSE,
|
QUERY_NODE_CREATE_SUBTABLE_CLAUSE,
|
||||||
QUERY_NODE_CREATE_MULTI_TABLE_STMT,
|
QUERY_NODE_CREATE_MULTI_TABLE_STMT,
|
||||||
QUERY_NODE_USE_DATABASE_STMT,
|
QUERY_NODE_DROP_TABLE_CLAUSE,
|
||||||
QUERY_NODE_SHOW_DATABASES_STMT, // temp
|
QUERY_NODE_DROP_TABLE_STMT,
|
||||||
QUERY_NODE_SHOW_TABLES_STMT, // temp
|
QUERY_NODE_SHOW_TABLES_STMT, // temp
|
||||||
|
QUERY_NODE_SHOW_STABLES_STMT,
|
||||||
|
QUERY_NODE_CREATE_USER_STMT,
|
||||||
|
QUERY_NODE_ALTER_USER_STMT,
|
||||||
|
QUERY_NODE_DROP_USER_STMT,
|
||||||
|
QUERY_NODE_SHOW_USERS_STMT,
|
||||||
|
QUERY_NODE_USE_DATABASE_STMT,
|
||||||
|
QUERY_NODE_CREATE_DNODE_STMT,
|
||||||
|
QUERY_NODE_DROP_DNODE_STMT,
|
||||||
|
QUERY_NODE_SHOW_DNODES_STMT,
|
||||||
|
QUERY_NODE_SHOW_VGROUPS_STMT,
|
||||||
|
|
||||||
// logic plan node
|
// logic plan node
|
||||||
QUERY_NODE_LOGIC_PLAN_SCAN,
|
QUERY_NODE_LOGIC_PLAN_SCAN,
|
||||||
|
|
|
@ -457,6 +457,7 @@ int32_t* taosGetErrno();
|
||||||
#define TSDB_CODE_SCH_INTERNAL_ERROR TAOS_DEF_ERROR_CODE(0, 0x2502)
|
#define TSDB_CODE_SCH_INTERNAL_ERROR TAOS_DEF_ERROR_CODE(0, 0x2502)
|
||||||
|
|
||||||
//parser
|
//parser
|
||||||
|
#define TSDB_CODE_PAR_SYNTAX_ERROR TAOS_DEF_ERROR_CODE(0, 0x2600)
|
||||||
#define TSDB_CODE_PAR_INVALID_COLUMN TAOS_DEF_ERROR_CODE(0, 0x2601)
|
#define TSDB_CODE_PAR_INVALID_COLUMN TAOS_DEF_ERROR_CODE(0, 0x2601)
|
||||||
#define TSDB_CODE_PAR_TABLE_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x2602)
|
#define TSDB_CODE_PAR_TABLE_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x2602)
|
||||||
#define TSDB_CODE_PAR_AMBIGUOUS_COLUMN TAOS_DEF_ERROR_CODE(0, 0x2603)
|
#define TSDB_CODE_PAR_AMBIGUOUS_COLUMN TAOS_DEF_ERROR_CODE(0, 0x2603)
|
||||||
|
@ -471,6 +472,11 @@ int32_t* taosGetErrno();
|
||||||
#define TSDB_CODE_PAR_NOT_SINGLE_GROUP TAOS_DEF_ERROR_CODE(0, 0x260C)
|
#define TSDB_CODE_PAR_NOT_SINGLE_GROUP TAOS_DEF_ERROR_CODE(0, 0x260C)
|
||||||
#define TSDB_CODE_PAR_TAGS_NOT_MATCHED TAOS_DEF_ERROR_CODE(0, 0x260D)
|
#define TSDB_CODE_PAR_TAGS_NOT_MATCHED TAOS_DEF_ERROR_CODE(0, 0x260D)
|
||||||
#define TSDB_CODE_PAR_INVALID_TAG_NAME TAOS_DEF_ERROR_CODE(0, 0x260E)
|
#define TSDB_CODE_PAR_INVALID_TAG_NAME TAOS_DEF_ERROR_CODE(0, 0x260E)
|
||||||
|
#define TSDB_CODE_PAR_INCOMPLETE_SQL TAOS_DEF_ERROR_CODE(0, 0x260F)
|
||||||
|
#define TSDB_CODE_PAR_NAME_OR_PASSWD_TOO_LONG TAOS_DEF_ERROR_CODE(0, 0x2610)
|
||||||
|
#define TSDB_CODE_PAR_PASSWD_EMPTY TAOS_DEF_ERROR_CODE(0, 0x2611)
|
||||||
|
#define TSDB_CODE_PAR_INVALID_PORT TAOS_DEF_ERROR_CODE(0, 0x2612)
|
||||||
|
#define TSDB_CODE_PAR_INVALID_ENDPOINT TAOS_DEF_ERROR_CODE(0, 0x2613)
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -1007,11 +1007,32 @@ int32_t tDeserializeSMCreateDropQSBNodeReq(void *buf, int32_t bufLen, SMCreateQn
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tSerializeSDropDnodeReq(void *buf, int32_t bufLen, SDropDnodeReq *pReq) {
|
int32_t tSerializeSDropDnodeReq(void *buf, int32_t bufLen, SDropDnodeReq *pReq) {
|
||||||
return tSerializeSMCreateDropQSBNodeReq(buf, bufLen, (SMCreateQnodeReq *)pReq);
|
SCoder encoder = {0};
|
||||||
|
tCoderInit(&encoder, TD_LITTLE_ENDIAN, buf, bufLen, TD_ENCODER);
|
||||||
|
|
||||||
|
if (tStartEncode(&encoder) < 0) return -1;
|
||||||
|
if (tEncodeI32(&encoder, pReq->dnodeId) < 0) return -1;
|
||||||
|
if (tEncodeCStr(&encoder, pReq->fqdn) < 0) return -1;
|
||||||
|
if (tEncodeI32(&encoder, pReq->port) < 0) return -1;
|
||||||
|
tEndEncode(&encoder);
|
||||||
|
|
||||||
|
int32_t tlen = encoder.pos;
|
||||||
|
tCoderClear(&encoder);
|
||||||
|
return tlen;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tDeserializeSDropDnodeReq(void *buf, int32_t bufLen, SDropDnodeReq *pReq) {
|
int32_t tDeserializeSDropDnodeReq(void *buf, int32_t bufLen, SDropDnodeReq *pReq) {
|
||||||
return tDeserializeSMCreateDropQSBNodeReq(buf, bufLen, (SMCreateQnodeReq *)pReq);
|
SCoder decoder = {0};
|
||||||
|
tCoderInit(&decoder, TD_LITTLE_ENDIAN, buf, bufLen, TD_DECODER);
|
||||||
|
|
||||||
|
if (tStartDecode(&decoder) < 0) return -1;
|
||||||
|
if (tDecodeI32(&decoder, &pReq->dnodeId) < 0) return -1;
|
||||||
|
if (tDecodeCStrTo(&decoder, pReq->fqdn) < 0) return -1;
|
||||||
|
if (tDecodeI32(&decoder, &pReq->port) < 0) return -1;
|
||||||
|
tEndDecode(&decoder);
|
||||||
|
|
||||||
|
tCoderClear(&decoder);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tSerializeSMCreateDropMnodeReq(void *buf, int32_t bufLen, SMCreateMnodeReq *pReq) {
|
int32_t tSerializeSMCreateDropMnodeReq(void *buf, int32_t bufLen, SMCreateMnodeReq *pReq) {
|
||||||
|
|
|
@ -82,17 +82,41 @@ SNodeptr nodesMakeNode(ENodeType type) {
|
||||||
return makeNode(type, sizeof(SVnodeModifOpStmt));
|
return makeNode(type, sizeof(SVnodeModifOpStmt));
|
||||||
case QUERY_NODE_CREATE_DATABASE_STMT:
|
case QUERY_NODE_CREATE_DATABASE_STMT:
|
||||||
return makeNode(type, sizeof(SCreateDatabaseStmt));
|
return makeNode(type, sizeof(SCreateDatabaseStmt));
|
||||||
|
case QUERY_NODE_DROP_DATABASE_STMT:
|
||||||
|
return makeNode(type, sizeof(SDropDatabaseStmt));
|
||||||
|
case QUERY_NODE_SHOW_DATABASES_STMT:
|
||||||
|
return makeNode(type, sizeof(SNode));
|
||||||
case QUERY_NODE_CREATE_TABLE_STMT:
|
case QUERY_NODE_CREATE_TABLE_STMT:
|
||||||
return makeNode(type, sizeof(SCreateTableStmt));
|
return makeNode(type, sizeof(SCreateTableStmt));
|
||||||
case QUERY_NODE_CREATE_SUBTABLE_CLAUSE:
|
case QUERY_NODE_CREATE_SUBTABLE_CLAUSE:
|
||||||
return makeNode(type, sizeof(SCreateSubTableClause));
|
return makeNode(type, sizeof(SCreateSubTableClause));
|
||||||
case QUERY_NODE_CREATE_MULTI_TABLE_STMT:
|
case QUERY_NODE_CREATE_MULTI_TABLE_STMT:
|
||||||
return makeNode(type, sizeof(SCreateMultiTableStmt));
|
return makeNode(type, sizeof(SCreateMultiTableStmt));
|
||||||
|
case QUERY_NODE_DROP_TABLE_CLAUSE:
|
||||||
|
return makeNode(type, sizeof(SDropTableClause));
|
||||||
|
case QUERY_NODE_DROP_TABLE_STMT:
|
||||||
|
return makeNode(type, sizeof(SDropTableStmt));
|
||||||
|
case QUERY_NODE_SHOW_TABLES_STMT:
|
||||||
|
case QUERY_NODE_SHOW_STABLES_STMT:
|
||||||
|
return makeNode(type, sizeof(SNode));
|
||||||
|
case QUERY_NODE_CREATE_USER_STMT:
|
||||||
|
return makeNode(type, sizeof(SCreateUserStmt));
|
||||||
|
case QUERY_NODE_ALTER_USER_STMT:
|
||||||
|
return makeNode(type, sizeof(SAlterUserStmt));
|
||||||
|
case QUERY_NODE_DROP_USER_STMT:
|
||||||
|
return makeNode(type, sizeof(SDropUserStmt));
|
||||||
|
case QUERY_NODE_SHOW_USERS_STMT:
|
||||||
|
return makeNode(type, sizeof(SNode));
|
||||||
case QUERY_NODE_USE_DATABASE_STMT:
|
case QUERY_NODE_USE_DATABASE_STMT:
|
||||||
return makeNode(type, sizeof(SUseDatabaseStmt));
|
return makeNode(type, sizeof(SUseDatabaseStmt));
|
||||||
case QUERY_NODE_SHOW_DATABASES_STMT:
|
case QUERY_NODE_CREATE_DNODE_STMT:
|
||||||
case QUERY_NODE_SHOW_TABLES_STMT:
|
return makeNode(type, sizeof(SCreateDnodeStmt));
|
||||||
return makeNode(type, sizeof(SNode));;
|
case QUERY_NODE_DROP_DNODE_STMT:
|
||||||
|
return makeNode(type, sizeof(SDropDnodeStmt));
|
||||||
|
case QUERY_NODE_SHOW_DNODES_STMT:
|
||||||
|
return makeNode(type, sizeof(SNode));
|
||||||
|
case QUERY_NODE_SHOW_VGROUPS_STMT:
|
||||||
|
return makeNode(type, sizeof(SNode));
|
||||||
case QUERY_NODE_LOGIC_PLAN_SCAN:
|
case QUERY_NODE_LOGIC_PLAN_SCAN:
|
||||||
return makeNode(type, sizeof(SScanLogicNode));
|
return makeNode(type, sizeof(SScanLogicNode));
|
||||||
case QUERY_NODE_LOGIC_PLAN_JOIN:
|
case QUERY_NODE_LOGIC_PLAN_JOIN:
|
||||||
|
|
|
@ -22,20 +22,48 @@ extern "C" {
|
||||||
|
|
||||||
#include "cmdnodes.h"
|
#include "cmdnodes.h"
|
||||||
#include "parser.h"
|
#include "parser.h"
|
||||||
|
#include "parserUtil.h"
|
||||||
#include "querynodes.h"
|
#include "querynodes.h"
|
||||||
#include "ttoken.h"
|
#include "ttoken.h"
|
||||||
|
|
||||||
typedef struct SAstCreateContext {
|
typedef struct SAstCreateContext {
|
||||||
SParseContext* pQueryCxt;
|
SParseContext* pQueryCxt;
|
||||||
|
SMsgBuf msgBuf;
|
||||||
bool notSupport;
|
bool notSupport;
|
||||||
bool valid;
|
bool valid;
|
||||||
SNode* pRootNode;
|
SNode* pRootNode;
|
||||||
} SAstCreateContext;
|
} SAstCreateContext;
|
||||||
|
|
||||||
typedef struct STokenPair {
|
typedef enum EDatabaseOptionType {
|
||||||
SToken first;
|
DB_OPTION_BLOCKS = 0,
|
||||||
SToken second;
|
DB_OPTION_CACHE,
|
||||||
} STokenPair;
|
DB_OPTION_CACHELAST,
|
||||||
|
DB_OPTION_COMP,
|
||||||
|
DB_OPTION_DAYS,
|
||||||
|
DB_OPTION_FSYNC,
|
||||||
|
DB_OPTION_MAXROWS,
|
||||||
|
DB_OPTION_MINROWS,
|
||||||
|
DB_OPTION_KEEP,
|
||||||
|
DB_OPTION_PRECISION,
|
||||||
|
DB_OPTION_QUORUM,
|
||||||
|
DB_OPTION_REPLICA,
|
||||||
|
DB_OPTION_TTL,
|
||||||
|
DB_OPTION_WAL,
|
||||||
|
DB_OPTION_VGROUPS,
|
||||||
|
DB_OPTION_SINGLESTABLE,
|
||||||
|
DB_OPTION_STREAMMODE,
|
||||||
|
|
||||||
|
DB_OPTION_MAX
|
||||||
|
} EDatabaseOptionType;
|
||||||
|
|
||||||
|
typedef enum ETableOptionType {
|
||||||
|
TABLE_OPTION_KEEP = 0,
|
||||||
|
TABLE_OPTION_TTL,
|
||||||
|
TABLE_OPTION_COMMENT,
|
||||||
|
TABLE_OPTION_SMA,
|
||||||
|
|
||||||
|
TABLE_OPTION_MAX
|
||||||
|
} ETableOptionType;
|
||||||
|
|
||||||
extern SToken nil_token;
|
extern SToken nil_token;
|
||||||
|
|
||||||
|
@ -81,53 +109,28 @@ SNode* addLimitClause(SAstCreateContext* pCxt, SNode* pStmt, SNode* pLimit);
|
||||||
SNode* createSelectStmt(SAstCreateContext* pCxt, bool isDistinct, SNodeList* pProjectionList, SNode* pTable);
|
SNode* createSelectStmt(SAstCreateContext* pCxt, bool isDistinct, SNodeList* pProjectionList, SNode* pTable);
|
||||||
SNode* createSetOperator(SAstCreateContext* pCxt, ESetOperatorType type, SNode* pLeft, SNode* pRight);
|
SNode* createSetOperator(SAstCreateContext* pCxt, ESetOperatorType type, SNode* pLeft, SNode* pRight);
|
||||||
|
|
||||||
typedef enum EDatabaseOptionType {
|
|
||||||
DB_OPTION_BLOCKS = 0,
|
|
||||||
DB_OPTION_CACHE,
|
|
||||||
DB_OPTION_CACHELAST,
|
|
||||||
DB_OPTION_COMP,
|
|
||||||
DB_OPTION_DAYS,
|
|
||||||
DB_OPTION_FSYNC,
|
|
||||||
DB_OPTION_MAXROWS,
|
|
||||||
DB_OPTION_MINROWS,
|
|
||||||
DB_OPTION_KEEP,
|
|
||||||
DB_OPTION_PRECISION,
|
|
||||||
DB_OPTION_QUORUM,
|
|
||||||
DB_OPTION_REPLICA,
|
|
||||||
DB_OPTION_TTL,
|
|
||||||
DB_OPTION_WAL,
|
|
||||||
DB_OPTION_VGROUPS,
|
|
||||||
DB_OPTION_SINGLESTABLE,
|
|
||||||
DB_OPTION_STREAMMODE,
|
|
||||||
|
|
||||||
DB_OPTION_MAX
|
|
||||||
} EDatabaseOptionType;
|
|
||||||
SDatabaseOptions* createDefaultDatabaseOptions(SAstCreateContext* pCxt);
|
SDatabaseOptions* createDefaultDatabaseOptions(SAstCreateContext* pCxt);
|
||||||
SDatabaseOptions* setDatabaseOption(SAstCreateContext* pCxt, SDatabaseOptions* pOptions, EDatabaseOptionType type, const SToken* pVal);
|
SDatabaseOptions* setDatabaseOption(SAstCreateContext* pCxt, SDatabaseOptions* pOptions, EDatabaseOptionType type, const SToken* pVal);
|
||||||
SNode* createCreateDatabaseStmt(SAstCreateContext* pCxt, bool ignoreExists, const SToken* pDbName, SDatabaseOptions* pOptions);
|
SNode* createCreateDatabaseStmt(SAstCreateContext* pCxt, bool ignoreExists, const SToken* pDbName, SDatabaseOptions* pOptions);
|
||||||
|
SNode* createDropDatabaseStmt(SAstCreateContext* pCxt, bool ignoreNotExists, const SToken* pDbName);
|
||||||
typedef enum ETableOptionType {
|
|
||||||
TABLE_OPTION_KEEP = 0,
|
|
||||||
TABLE_OPTION_TTL,
|
|
||||||
TABLE_OPTION_COMMENT,
|
|
||||||
TABLE_OPTION_SMA,
|
|
||||||
|
|
||||||
TABLE_OPTION_MAX
|
|
||||||
} ETableOptionType;
|
|
||||||
STableOptions* createDefaultTableOptions(SAstCreateContext* pCxt);
|
STableOptions* createDefaultTableOptions(SAstCreateContext* pCxt);
|
||||||
STableOptions* setTableOption(SAstCreateContext* pCxt, STableOptions* pOptions, ETableOptionType type, const SToken* pVal);
|
STableOptions* setTableOption(SAstCreateContext* pCxt, STableOptions* pOptions, ETableOptionType type, const SToken* pVal);
|
||||||
STableOptions* setTableSmaOption(SAstCreateContext* pCxt, STableOptions* pOptions, SNodeList* pSma);
|
STableOptions* setTableSmaOption(SAstCreateContext* pCxt, STableOptions* pOptions, SNodeList* pSma);
|
||||||
SNode* createColumnDefNode(SAstCreateContext* pCxt, const SToken* pColName, SDataType dataType, const SToken* pComment);
|
SNode* createColumnDefNode(SAstCreateContext* pCxt, const SToken* pColName, SDataType dataType, const SToken* pComment);
|
||||||
SDataType createDataType(uint8_t type);
|
SDataType createDataType(uint8_t type);
|
||||||
SDataType createVarLenDataType(uint8_t type, const SToken* pLen);
|
SDataType createVarLenDataType(uint8_t type, const SToken* pLen);
|
||||||
SNode* createCreateTableStmt(SAstCreateContext* pCxt, bool ignoreExists, const STokenPair* pFullTableName, SNodeList* pCols, SNodeList* pTags, STableOptions* pOptions);
|
SNode* createCreateTableStmt(SAstCreateContext* pCxt, bool ignoreExists, SNode* pRealTable, SNodeList* pCols, SNodeList* pTags, STableOptions* pOptions);
|
||||||
SNode* createCreateSubTableClause(SAstCreateContext* pCxt, bool ignoreExists,
|
SNode* createCreateSubTableClause(SAstCreateContext* pCxt, bool ignoreExists, SNode* pRealTable, SNode* pUseRealTable, SNodeList* pSpecificTags, SNodeList* pValsOfTags);
|
||||||
const STokenPair* pFullTableName, const STokenPair* pUseFullTableName, SNodeList* pSpecificTags, SNodeList* pValsOfTags);
|
|
||||||
SNode* createCreateMultiTableStmt(SAstCreateContext* pCxt, SNodeList* pSubTables);
|
SNode* createCreateMultiTableStmt(SAstCreateContext* pCxt, SNodeList* pSubTables);
|
||||||
|
SNode* createDropTableClause(SAstCreateContext* pCxt, bool ignoreNotExists, SNode* pRealTable);
|
||||||
|
SNode* createDropTableStmt(SAstCreateContext* pCxt, SNodeList* pTables);
|
||||||
SNode* createUseDatabaseStmt(SAstCreateContext* pCxt, const SToken* pDbName);
|
SNode* createUseDatabaseStmt(SAstCreateContext* pCxt, const SToken* pDbName);
|
||||||
|
|
||||||
SNode* createShowStmt(SAstCreateContext* pCxt, ENodeType type);
|
SNode* createShowStmt(SAstCreateContext* pCxt, ENodeType type);
|
||||||
|
SNode* createCreateUserStmt(SAstCreateContext* pCxt, const SToken* pUserName, const SToken* pPassword);
|
||||||
|
SNode* createAlterUserStmt(SAstCreateContext* pCxt, const SToken* pUserName, int8_t alterType, const SToken* pVal);
|
||||||
|
SNode* createDropUserStmt(SAstCreateContext* pCxt, const SToken* pUserName);
|
||||||
|
SNode* createCreateDnodeStmt(SAstCreateContext* pCxt, const SToken* pFqdn, const SToken* pPort);
|
||||||
|
SNode* createDropDnodeStmt(SAstCreateContext* pCxt, const SToken* pDnode);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,18 +25,9 @@
|
||||||
|
|
||||||
%syntax_error {
|
%syntax_error {
|
||||||
if(TOKEN.z) {
|
if(TOKEN.z) {
|
||||||
char msg[] = "syntax error near \"%s\"";
|
generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_SYNTAX_ERROR, TOKEN.z);
|
||||||
int32_t sqlLen = strlen(&TOKEN.z[0]);
|
|
||||||
|
|
||||||
if (sqlLen + sizeof(msg)/sizeof(msg[0]) + 1 > pCxt->pQueryCxt->msgLen) {
|
|
||||||
char tmpstr[128] = {0};
|
|
||||||
memcpy(tmpstr, &TOKEN.z[0], sizeof(tmpstr)/sizeof(tmpstr[0]) - 1);
|
|
||||||
sprintf(pCxt->pQueryCxt->pMsg, msg, tmpstr);
|
|
||||||
} else {
|
|
||||||
sprintf(pCxt->pQueryCxt->pMsg, msg, &TOKEN.z[0]);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
sprintf(pCxt->pQueryCxt->pMsg, "Incomplete SQL statement");
|
generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INCOMPLETE_SQL);
|
||||||
}
|
}
|
||||||
pCxt->valid = false;
|
pCxt->valid = false;
|
||||||
}
|
}
|
||||||
|
@ -52,12 +43,43 @@
|
||||||
%left NK_CONCAT.
|
%left NK_CONCAT.
|
||||||
//%right NK_BITNOT.
|
//%right NK_BITNOT.
|
||||||
|
|
||||||
/************************************************ create database *****************************************************/
|
/************************************************ create/alter/drop/show user *****************************************/
|
||||||
cmd ::= CREATE DATABASE exists_opt(A) db_name(B) db_options(C). { pCxt->pRootNode = createCreateDatabaseStmt(pCxt, A, &B, C);}
|
cmd ::= CREATE USER user_name(A) PASS NK_STRING(B). { pCxt->pRootNode = createCreateUserStmt(pCxt, &A, &B);}
|
||||||
|
cmd ::= ALTER USER user_name(A) PASS NK_STRING(B). { pCxt->pRootNode = createAlterUserStmt(pCxt, &A, TSDB_ALTER_USER_PASSWD, &B);}
|
||||||
|
cmd ::= ALTER USER user_name(A) PRIVILEGE NK_STRING(B). { pCxt->pRootNode = createAlterUserStmt(pCxt, &A, TSDB_ALTER_USER_PRIVILEGES, &B);}
|
||||||
|
cmd ::= DROP USER user_name(A). { pCxt->pRootNode = createDropUserStmt(pCxt, &A); }
|
||||||
|
cmd ::= SHOW USERS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_USERS_STMT); }
|
||||||
|
|
||||||
|
/************************************************ create/drop/show dnode **********************************************/
|
||||||
|
cmd ::= CREATE DNODE dnode_endpoint(A). { pCxt->pRootNode = createCreateDnodeStmt(pCxt, &A, NULL);}
|
||||||
|
cmd ::= CREATE DNODE dnode_host_name(A) PORT NK_INTEGER(B). { pCxt->pRootNode = createCreateDnodeStmt(pCxt, &A, &B);}
|
||||||
|
cmd ::= DROP DNODE NK_INTEGER(A). { pCxt->pRootNode = createDropDnodeStmt(pCxt, &A);}
|
||||||
|
cmd ::= DROP DNODE dnode_endpoint(A). { pCxt->pRootNode = createDropDnodeStmt(pCxt, &A);}
|
||||||
|
cmd ::= SHOW DNODES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DNODES_STMT); }
|
||||||
|
|
||||||
|
%type dnode_endpoint { SToken }
|
||||||
|
%destructor dnode_endpoint { }
|
||||||
|
dnode_endpoint(A) ::= NK_STRING(B). { A = B; }
|
||||||
|
|
||||||
|
%type dnode_host_name { SToken }
|
||||||
|
%destructor dnode_host_name { }
|
||||||
|
dnode_host_name(A) ::= NK_ID(B). { A = B; }
|
||||||
|
dnode_host_name(A) ::= NK_IPTOKEN(B). { A = B; }
|
||||||
|
|
||||||
|
/************************************************ create/drop/show/use database ***************************************/
|
||||||
|
cmd ::= CREATE DATABASE not_exists_opt(A) db_name(B) db_options(C). { pCxt->pRootNode = createCreateDatabaseStmt(pCxt, A, &B, C);}
|
||||||
|
cmd ::= DROP DATABASE exists_opt(A) db_name(B). { pCxt->pRootNode = createDropDatabaseStmt(pCxt, A, &B); }
|
||||||
|
cmd ::= SHOW DATABASES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DATABASES_STMT); }
|
||||||
|
cmd ::= USE db_name(A). { pCxt->pRootNode = createUseDatabaseStmt(pCxt, &A);}
|
||||||
|
|
||||||
|
%type not_exists_opt { bool }
|
||||||
|
%destructor not_exists_opt { }
|
||||||
|
not_exists_opt(A) ::= IF NOT EXISTS. { A = true; }
|
||||||
|
not_exists_opt(A) ::= . { A = false; }
|
||||||
|
|
||||||
%type exists_opt { bool }
|
%type exists_opt { bool }
|
||||||
%destructor exists_opt { }
|
%destructor exists_opt { }
|
||||||
exists_opt(A) ::= IF NOT EXISTS. { A = true; }
|
exists_opt(A) ::= IF EXISTS. { A = true; }
|
||||||
exists_opt(A) ::= . { A = false; }
|
exists_opt(A) ::= . { A = false; }
|
||||||
|
|
||||||
%type db_options { SDatabaseOptions* }
|
%type db_options { SDatabaseOptions* }
|
||||||
|
@ -81,17 +103,15 @@ db_options(A) ::= db_options(B) VGROUPS NK_INTEGER(C).
|
||||||
db_options(A) ::= db_options(B) SINGLE_STABLE NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_SINGLESTABLE, &C); }
|
db_options(A) ::= db_options(B) SINGLE_STABLE NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_SINGLESTABLE, &C); }
|
||||||
db_options(A) ::= db_options(B) STREAM_MODE NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_STREAMMODE, &C); }
|
db_options(A) ::= db_options(B) STREAM_MODE NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_STREAMMODE, &C); }
|
||||||
|
|
||||||
/************************************************ create database *****************************************************/
|
/************************************************ create/drop/show table/stable ***************************************/
|
||||||
cmd ::= USE db_name(A). { pCxt->pRootNode = createUseDatabaseStmt(pCxt, &A);}
|
cmd ::= CREATE TABLE not_exists_opt(A) full_table_name(B)
|
||||||
|
NK_LP column_def_list(C) NK_RP tags_def_opt(D) table_options(E). { pCxt->pRootNode = createCreateTableStmt(pCxt, A, B, C, D, E);}
|
||||||
/************************************************ create table/stable *************************************************/
|
|
||||||
cmd ::= CREATE TABLE exists_opt(A) full_table_name(B)
|
|
||||||
NK_LP column_def_list(C) NK_RP tags_def_opt(D) table_options(E). { pCxt->pRootNode = createCreateTableStmt(pCxt, A, &B, C, D, E);}
|
|
||||||
|
|
||||||
cmd ::= CREATE TABLE multi_create_clause(A). { pCxt->pRootNode = createCreateMultiTableStmt(pCxt, A);}
|
cmd ::= CREATE TABLE multi_create_clause(A). { pCxt->pRootNode = createCreateMultiTableStmt(pCxt, A);}
|
||||||
|
cmd ::= CREATE STABLE not_exists_opt(A) full_table_name(B)
|
||||||
cmd ::= CREATE STABLE exists_opt(A) full_table_name(B)
|
NK_LP column_def_list(C) NK_RP tags_def(D) table_options(E). { pCxt->pRootNode = createCreateTableStmt(pCxt, A, B, C, D, E);}
|
||||||
NK_LP column_def_list(C) NK_RP tags_def(D) table_options(E). { pCxt->pRootNode = createCreateTableStmt(pCxt, A, &B, C, D, E);}
|
cmd ::= DROP TABLE multi_drop_clause(A). { pCxt->pRootNode = createDropTableStmt(pCxt, A); }
|
||||||
|
cmd ::= SHOW TABLES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_TABLES_STMT); }
|
||||||
|
cmd ::= SHOW STABLES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_STABLES_STMT); }
|
||||||
|
|
||||||
%type multi_create_clause { SNodeList* }
|
%type multi_create_clause { SNodeList* }
|
||||||
%destructor multi_create_clause { nodesDestroyList($$); }
|
%destructor multi_create_clause { nodesDestroyList($$); }
|
||||||
|
@ -99,18 +119,23 @@ multi_create_clause(A) ::= create_subtable_clause(B).
|
||||||
multi_create_clause(A) ::= multi_create_clause(B) create_subtable_clause(C). { A = addNodeToList(pCxt, B, C); }
|
multi_create_clause(A) ::= multi_create_clause(B) create_subtable_clause(C). { A = addNodeToList(pCxt, B, C); }
|
||||||
|
|
||||||
create_subtable_clause(A) ::=
|
create_subtable_clause(A) ::=
|
||||||
exists_opt(B) full_table_name(C) USING full_table_name(D)
|
not_exists_opt(B) full_table_name(C) USING full_table_name(D)
|
||||||
specific_tags_opt(E) TAGS NK_LP literal_list(F) NK_RP. { A = createCreateSubTableClause(pCxt, B, &C, &D, E, F); }
|
specific_tags_opt(E) TAGS NK_LP literal_list(F) NK_RP. { A = createCreateSubTableClause(pCxt, B, C, D, E, F); }
|
||||||
|
|
||||||
|
%type multi_drop_clause { SNodeList* }
|
||||||
|
%destructor multi_drop_clause { nodesDestroyList($$); }
|
||||||
|
multi_drop_clause(A) ::= drop_table_clause(B). { A = createNodeList(pCxt, B); }
|
||||||
|
multi_drop_clause(A) ::= multi_drop_clause(B) drop_table_clause(C). { A = addNodeToList(pCxt, B, C); }
|
||||||
|
|
||||||
|
drop_table_clause(A) ::= exists_opt(B) full_table_name(C). { A = createDropTableClause(pCxt, B, C); }
|
||||||
|
|
||||||
%type specific_tags_opt { SNodeList* }
|
%type specific_tags_opt { SNodeList* }
|
||||||
%destructor specific_tags_opt { nodesDestroyList($$); }
|
%destructor specific_tags_opt { nodesDestroyList($$); }
|
||||||
specific_tags_opt(A) ::= . { A = NULL; }
|
specific_tags_opt(A) ::= . { A = NULL; }
|
||||||
specific_tags_opt(A) ::= NK_LP col_name_list(B) NK_RP. { A = B; }
|
specific_tags_opt(A) ::= NK_LP col_name_list(B) NK_RP. { A = B; }
|
||||||
|
|
||||||
%type full_table_name { STokenPair }
|
full_table_name(A) ::= table_name(B). { A = createRealTableNode(pCxt, NULL, &B, NULL); }
|
||||||
%destructor full_table_name { }
|
full_table_name(A) ::= db_name(B) NK_DOT table_name(C). { A = createRealTableNode(pCxt, &B, &C, NULL); }
|
||||||
full_table_name(A) ::= NK_ID(B). { STokenPair t = { .first = nil_token, .second = B }; A = t; }
|
|
||||||
full_table_name(A) ::= NK_ID(B) NK_DOT NK_ID(C). { STokenPair t = { .first = B, .second = C }; A = t; }
|
|
||||||
|
|
||||||
%type column_def_list { SNodeList* }
|
%type column_def_list { SNodeList* }
|
||||||
%destructor column_def_list { nodesDestroyList($$); }
|
%destructor column_def_list { nodesDestroyList($$); }
|
||||||
|
@ -171,8 +196,7 @@ col_name_list(A) ::= col_name_list(B) NK_COMMA col_name(C).
|
||||||
col_name(A) ::= column_name(B). { A = createColumnNode(pCxt, NULL, &B); }
|
col_name(A) ::= column_name(B). { A = createColumnNode(pCxt, NULL, &B); }
|
||||||
|
|
||||||
/************************************************ show ***************************************************************/
|
/************************************************ show ***************************************************************/
|
||||||
cmd ::= SHOW DATABASES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DATABASES_STMT); }
|
cmd ::= SHOW VGROUPS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_VGROUPS_STMT); }
|
||||||
cmd ::= SHOW TABLES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_TABLES_STMT); }
|
|
||||||
|
|
||||||
/************************************************ select *************************************************************/
|
/************************************************ select *************************************************************/
|
||||||
cmd ::= query_expression(A). { pCxt->pRootNode = A; }
|
cmd ::= query_expression(A). { pCxt->pRootNode = A; }
|
||||||
|
@ -217,6 +241,10 @@ table_alias(A) ::= NK_ID(B).
|
||||||
%destructor column_alias { }
|
%destructor column_alias { }
|
||||||
column_alias(A) ::= NK_ID(B). { A = B; }
|
column_alias(A) ::= NK_ID(B). { A = B; }
|
||||||
|
|
||||||
|
%type user_name { SToken }
|
||||||
|
%destructor user_name { }
|
||||||
|
user_name(A) ::= NK_ID(B). { A = B; }
|
||||||
|
|
||||||
/************************************************ expression **********************************************************/
|
/************************************************ expression **********************************************************/
|
||||||
expression(A) ::= literal(B). { A = B; }
|
expression(A) ::= literal(B). { A = B; }
|
||||||
//expression(A) ::= NK_QUESTION(B). { A = B; }
|
//expression(A) ::= NK_QUESTION(B). { A = B; }
|
||||||
|
|
|
@ -29,6 +29,7 @@ typedef struct SMsgBuf {
|
||||||
char *buf;
|
char *buf;
|
||||||
} SMsgBuf;
|
} SMsgBuf;
|
||||||
|
|
||||||
|
int32_t generateSyntaxErrMsg(SMsgBuf* pBuf, int32_t errCode, ...);
|
||||||
int32_t buildInvalidOperationMsg(SMsgBuf* pMsgBuf, const char* msg);
|
int32_t buildInvalidOperationMsg(SMsgBuf* pMsgBuf, const char* msg);
|
||||||
int32_t buildSyntaxErrMsg(SMsgBuf* pBuf, const char* additionalInfo, const char* sourceStr);
|
int32_t buildSyntaxErrMsg(SMsgBuf* pBuf, const char* additionalInfo, const char* sourceStr);
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
SToken nil_token = { .type = TK_NIL, .n = 0, .z = NULL };
|
SToken nil_token = { .type = TK_NK_NIL, .n = 0, .z = NULL };
|
||||||
|
|
||||||
typedef SDatabaseOptions* (*FSetDatabaseOption)(SAstCreateContext* pCxt, SDatabaseOptions* pOptions, const SToken* pVal);
|
typedef SDatabaseOptions* (*FSetDatabaseOption)(SAstCreateContext* pCxt, SDatabaseOptions* pOptions, const SToken* pVal);
|
||||||
static FSetDatabaseOption setDbOptionFuncs[DB_OPTION_MAX];
|
static FSetDatabaseOption setDbOptionFuncs[DB_OPTION_MAX];
|
||||||
|
@ -309,6 +309,8 @@ static void initSetTableOptionFp() {
|
||||||
|
|
||||||
void initAstCreateContext(SParseContext* pParseCxt, SAstCreateContext* pCxt) {
|
void initAstCreateContext(SParseContext* pParseCxt, SAstCreateContext* pCxt) {
|
||||||
pCxt->pQueryCxt = pParseCxt;
|
pCxt->pQueryCxt = pParseCxt;
|
||||||
|
pCxt->msgBuf.buf = pParseCxt->pMsg;
|
||||||
|
pCxt->msgBuf.len = pParseCxt->msgLen;
|
||||||
pCxt->notSupport = false;
|
pCxt->notSupport = false;
|
||||||
pCxt->valid = true;
|
pCxt->valid = true;
|
||||||
pCxt->pRootNode = NULL;
|
pCxt->pRootNode = NULL;
|
||||||
|
@ -316,6 +318,84 @@ void initAstCreateContext(SParseContext* pParseCxt, SAstCreateContext* pCxt) {
|
||||||
initSetTableOptionFp();
|
initSetTableOptionFp();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool checkUserName(SAstCreateContext* pCxt, const SToken* pUserName) {
|
||||||
|
if (NULL == pUserName) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (pUserName->n >= TSDB_USER_LEN) {
|
||||||
|
generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_NAME_OR_PASSWD_TOO_LONG);
|
||||||
|
pCxt->valid = false;
|
||||||
|
}
|
||||||
|
return pCxt->valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool checkPassword(SAstCreateContext* pCxt, const SToken* pPasswordToken, char* pPassword) {
|
||||||
|
if (NULL == pPasswordToken) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (pPasswordToken->n >= (TSDB_USET_PASSWORD_LEN - 2)) {
|
||||||
|
generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_NAME_OR_PASSWD_TOO_LONG);
|
||||||
|
pCxt->valid = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
strncpy(pPassword, pPasswordToken->z, pPasswordToken->n);
|
||||||
|
strdequote(pPassword);
|
||||||
|
if (strtrim(pPassword) <= 0) {
|
||||||
|
generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_PASSWD_EMPTY);
|
||||||
|
pCxt->valid = false;
|
||||||
|
}
|
||||||
|
return pCxt->valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool checkAndSplitEndpoint(SAstCreateContext* pCxt, const SToken* pEp, char* pFqdn, int32_t* pPort) {
|
||||||
|
if (NULL == pEp) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (pEp->n >= TSDB_FQDN_LEN + 2 + 6) { // format 'fqdn:port'
|
||||||
|
generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_NAME_OR_PASSWD_TOO_LONG);
|
||||||
|
pCxt->valid = false;
|
||||||
|
}
|
||||||
|
char ep[TSDB_FQDN_LEN + 2 + 6];
|
||||||
|
strncpy(ep, pEp->z, pEp->n);
|
||||||
|
strdequote(ep);
|
||||||
|
strtrim(ep);
|
||||||
|
char* pColon = strchr(ep, ':');
|
||||||
|
if (NULL == pColon) {
|
||||||
|
generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_ENDPOINT);
|
||||||
|
pCxt->valid = false;
|
||||||
|
}
|
||||||
|
strncpy(pFqdn, ep, pColon - ep);
|
||||||
|
*pPort = strtol(pColon + 1, NULL, 10);
|
||||||
|
if (*pPort >= UINT16_MAX || *pPort <= 0) {
|
||||||
|
generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_PORT);
|
||||||
|
pCxt->valid = false;
|
||||||
|
}
|
||||||
|
return pCxt->valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool checkFqdn(SAstCreateContext* pCxt, const SToken* pFqdn) {
|
||||||
|
if (NULL == pFqdn) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (pFqdn->n >= TSDB_FQDN_LEN) {
|
||||||
|
generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_NAME_OR_PASSWD_TOO_LONG);
|
||||||
|
pCxt->valid = false;
|
||||||
|
}
|
||||||
|
return pCxt->valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool checkPort(SAstCreateContext* pCxt, const SToken* pPortToken, int32_t* pPort) {
|
||||||
|
if (NULL == pPortToken) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
*pPort = strtol(pPortToken->z, NULL, 10);
|
||||||
|
if (*pPort >= UINT16_MAX || *pPort <= 0) {
|
||||||
|
generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_PORT);
|
||||||
|
pCxt->valid = false;
|
||||||
|
}
|
||||||
|
return pCxt->valid;
|
||||||
|
}
|
||||||
|
|
||||||
static bool checkDbName(SAstCreateContext* pCxt, const SToken* pDbName) {
|
static bool checkDbName(SAstCreateContext* pCxt, const SToken* pDbName) {
|
||||||
if (NULL == pDbName) {
|
if (NULL == pDbName) {
|
||||||
return true;
|
return true;
|
||||||
|
@ -487,7 +567,7 @@ SNode* createRealTableNode(SAstCreateContext* pCxt, const SToken* pDbName, const
|
||||||
} else {
|
} else {
|
||||||
strcpy(realTable->table.dbName, pCxt->pQueryCxt->db);
|
strcpy(realTable->table.dbName, pCxt->pQueryCxt->db);
|
||||||
}
|
}
|
||||||
if (NULL != pTableAlias && TK_NIL != pTableAlias->type) {
|
if (NULL != pTableAlias && TK_NK_NIL != pTableAlias->type) {
|
||||||
strncpy(realTable->table.tableAlias, pTableAlias->z, pTableAlias->n);
|
strncpy(realTable->table.tableAlias, pTableAlias->z, pTableAlias->n);
|
||||||
} else {
|
} else {
|
||||||
strncpy(realTable->table.tableAlias, pTableName->z, pTableName->n);
|
strncpy(realTable->table.tableAlias, pTableName->z, pTableName->n);
|
||||||
|
@ -500,7 +580,7 @@ SNode* createTempTableNode(SAstCreateContext* pCxt, SNode* pSubquery, const STok
|
||||||
STempTableNode* tempTable = (STempTableNode*)nodesMakeNode(QUERY_NODE_TEMP_TABLE);
|
STempTableNode* tempTable = (STempTableNode*)nodesMakeNode(QUERY_NODE_TEMP_TABLE);
|
||||||
CHECK_OUT_OF_MEM(tempTable);
|
CHECK_OUT_OF_MEM(tempTable);
|
||||||
tempTable->pSubquery = pSubquery;
|
tempTable->pSubquery = pSubquery;
|
||||||
if (NULL != pTableAlias && TK_NIL != pTableAlias->type) {
|
if (NULL != pTableAlias && TK_NK_NIL != pTableAlias->type) {
|
||||||
strncpy(tempTable->table.tableAlias, pTableAlias->z, pTableAlias->n);
|
strncpy(tempTable->table.tableAlias, pTableAlias->z, pTableAlias->n);
|
||||||
}
|
}
|
||||||
return (SNode*)tempTable;
|
return (SNode*)tempTable;
|
||||||
|
@ -700,6 +780,17 @@ SNode* createCreateDatabaseStmt(SAstCreateContext* pCxt, bool ignoreExists, cons
|
||||||
return (SNode*)pStmt;
|
return (SNode*)pStmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SNode* createDropDatabaseStmt(SAstCreateContext* pCxt, bool ignoreNotExists, const SToken* pDbName) {
|
||||||
|
if (!checkDbName(pCxt, pDbName)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
SDropDatabaseStmt* pStmt = (SDropDatabaseStmt*)nodesMakeNode(QUERY_NODE_DROP_DATABASE_STMT);
|
||||||
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
|
strncpy(pStmt->dbName, pDbName->z, pDbName->n);
|
||||||
|
pStmt->ignoreNotExists = ignoreNotExists;
|
||||||
|
return (SNode*)pStmt;
|
||||||
|
}
|
||||||
|
|
||||||
STableOptions* createDefaultTableOptions(SAstCreateContext* pCxt) {
|
STableOptions* createDefaultTableOptions(SAstCreateContext* pCxt) {
|
||||||
STableOptions* pOptions = calloc(1, sizeof(STableOptions));
|
STableOptions* pOptions = calloc(1, sizeof(STableOptions));
|
||||||
CHECK_OUT_OF_MEM(pOptions);
|
CHECK_OUT_OF_MEM(pOptions);
|
||||||
|
@ -739,41 +830,32 @@ SDataType createVarLenDataType(uint8_t type, const SToken* pLen) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createCreateTableStmt(SAstCreateContext* pCxt,
|
SNode* createCreateTableStmt(SAstCreateContext* pCxt,
|
||||||
bool ignoreExists, const STokenPair* pFullTableName, SNodeList* pCols, SNodeList* pTags, STableOptions* pOptions) {
|
bool ignoreExists, SNode* pRealTable, SNodeList* pCols, SNodeList* pTags, STableOptions* pOptions) {
|
||||||
SCreateTableStmt* pStmt = (SCreateTableStmt*)nodesMakeNode(QUERY_NODE_CREATE_TABLE_STMT);
|
SCreateTableStmt* pStmt = (SCreateTableStmt*)nodesMakeNode(QUERY_NODE_CREATE_TABLE_STMT);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
if (TK_NIL != pFullTableName->first.type) {
|
strcpy(pStmt->dbName, ((SRealTableNode*)pRealTable)->table.dbName);
|
||||||
strncpy(pStmt->dbName, pFullTableName->first.z, pFullTableName->first.n);
|
strcpy(pStmt->tableName, ((SRealTableNode*)pRealTable)->table.tableName);
|
||||||
} else {
|
|
||||||
strcpy(pStmt->dbName, pCxt->pQueryCxt->db);
|
|
||||||
}
|
|
||||||
strncpy(pStmt->tableName, pFullTableName->second.z, pFullTableName->second.n);
|
|
||||||
pStmt->ignoreExists = ignoreExists;
|
pStmt->ignoreExists = ignoreExists;
|
||||||
pStmt->pCols = pCols;
|
pStmt->pCols = pCols;
|
||||||
pStmt->pTags = pTags;
|
pStmt->pTags = pTags;
|
||||||
pStmt->options = *pOptions;
|
pStmt->options = *pOptions;
|
||||||
|
nodesDestroyNode(pRealTable);
|
||||||
return (SNode*)pStmt;
|
return (SNode*)pStmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createCreateSubTableClause(SAstCreateContext* pCxt, bool ignoreExists,
|
SNode* createCreateSubTableClause(SAstCreateContext* pCxt,
|
||||||
const STokenPair* pFullTableName, const STokenPair* pUseFullTableName, SNodeList* pSpecificTags, SNodeList* pValsOfTags) {
|
bool ignoreExists, SNode* pRealTable, SNode* pUseRealTable, SNodeList* pSpecificTags, SNodeList* pValsOfTags) {
|
||||||
SCreateSubTableClause* pStmt = nodesMakeNode(QUERY_NODE_CREATE_SUBTABLE_CLAUSE);
|
SCreateSubTableClause* pStmt = nodesMakeNode(QUERY_NODE_CREATE_SUBTABLE_CLAUSE);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
if (TK_NIL != pFullTableName->first.type) {
|
strcpy(pStmt->dbName, ((SRealTableNode*)pRealTable)->table.dbName);
|
||||||
strncpy(pStmt->dbName, pFullTableName->first.z, pFullTableName->first.n);
|
strcpy(pStmt->tableName, ((SRealTableNode*)pRealTable)->table.tableName);
|
||||||
} else {
|
strcpy(pStmt->useDbName, ((SRealTableNode*)pUseRealTable)->table.dbName);
|
||||||
strcpy(pStmt->dbName, pCxt->pQueryCxt->db);
|
strcpy(pStmt->useTableName, ((SRealTableNode*)pUseRealTable)->table.tableName);
|
||||||
}
|
|
||||||
strncpy(pStmt->tableName, pFullTableName->second.z, pFullTableName->second.n);
|
|
||||||
if (TK_NIL != pUseFullTableName->first.type) {
|
|
||||||
strncpy(pStmt->useDbName, pUseFullTableName->first.z, pUseFullTableName->first.n);
|
|
||||||
} else {
|
|
||||||
strcpy(pStmt->useDbName, pCxt->pQueryCxt->db);
|
|
||||||
}
|
|
||||||
strncpy(pStmt->useTableName, pUseFullTableName->second.z, pUseFullTableName->second.n);
|
|
||||||
pStmt->ignoreExists = ignoreExists;
|
pStmt->ignoreExists = ignoreExists;
|
||||||
pStmt->pSpecificTags = pSpecificTags;
|
pStmt->pSpecificTags = pSpecificTags;
|
||||||
pStmt->pValsOfTags = pValsOfTags;
|
pStmt->pValsOfTags = pValsOfTags;
|
||||||
|
nodesDestroyNode(pRealTable);
|
||||||
|
nodesDestroyNode(pUseRealTable);
|
||||||
return (SNode*)pStmt;
|
return (SNode*)pStmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -784,6 +866,23 @@ SNode* createCreateMultiTableStmt(SAstCreateContext* pCxt, SNodeList* pSubTables
|
||||||
return (SNode*)pStmt;
|
return (SNode*)pStmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SNode* createDropTableClause(SAstCreateContext* pCxt, bool ignoreNotExists, SNode* pRealTable) {
|
||||||
|
SDropTableClause* pStmt = nodesMakeNode(QUERY_NODE_DROP_TABLE_CLAUSE);
|
||||||
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
|
strcpy(pStmt->dbName, ((SRealTableNode*)pRealTable)->table.dbName);
|
||||||
|
strcpy(pStmt->tableName, ((SRealTableNode*)pRealTable)->table.tableName);
|
||||||
|
pStmt->ignoreNotExists = ignoreNotExists;
|
||||||
|
nodesDestroyNode(pRealTable);
|
||||||
|
return (SNode*)pStmt;
|
||||||
|
}
|
||||||
|
|
||||||
|
SNode* createDropTableStmt(SAstCreateContext* pCxt, SNodeList* pTables) {
|
||||||
|
SDropTableStmt* pStmt = nodesMakeNode(QUERY_NODE_DROP_TABLE_STMT);
|
||||||
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
|
pStmt->pTables = pTables;
|
||||||
|
return (SNode*)pStmt;
|
||||||
|
}
|
||||||
|
|
||||||
SNode* createUseDatabaseStmt(SAstCreateContext* pCxt, const SToken* pDbName) {
|
SNode* createUseDatabaseStmt(SAstCreateContext* pCxt, const SToken* pDbName) {
|
||||||
SUseDatabaseStmt* pStmt = (SUseDatabaseStmt*)nodesMakeNode(QUERY_NODE_USE_DATABASE_STMT);
|
SUseDatabaseStmt* pStmt = (SUseDatabaseStmt*)nodesMakeNode(QUERY_NODE_USE_DATABASE_STMT);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
|
@ -796,3 +895,79 @@ SNode* createShowStmt(SAstCreateContext* pCxt, ENodeType type) {
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
return pStmt;
|
return pStmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SNode* createCreateUserStmt(SAstCreateContext* pCxt, const SToken* pUserName, const SToken* pPassword) {
|
||||||
|
char password[TSDB_USET_PASSWORD_LEN] = {0};
|
||||||
|
if (!checkUserName(pCxt, pUserName) || !checkPassword(pCxt, pPassword, password)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
SCreateUserStmt* pStmt = (SCreateUserStmt*)nodesMakeNode(QUERY_NODE_CREATE_USER_STMT);
|
||||||
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
|
strncpy(pStmt->useName, pUserName->z, pUserName->n);
|
||||||
|
strcpy(pStmt->password, password);
|
||||||
|
return (SNode*)pStmt;
|
||||||
|
}
|
||||||
|
|
||||||
|
SNode* createAlterUserStmt(SAstCreateContext* pCxt, const SToken* pUserName, int8_t alterType, const SToken* pVal) {
|
||||||
|
if (!checkUserName(pCxt, pUserName)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
SAlterUserStmt* pStmt = (SAlterUserStmt*)nodesMakeNode(QUERY_NODE_ALTER_USER_STMT);
|
||||||
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
|
strncpy(pStmt->useName, pUserName->z, pUserName->n);
|
||||||
|
if (TSDB_ALTER_USER_PASSWD == alterType) {
|
||||||
|
char password[TSDB_USET_PASSWORD_LEN] = {0};
|
||||||
|
if (!checkPassword(pCxt, pVal, password)) {
|
||||||
|
nodesDestroyNode(pStmt);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
strcpy(pStmt->password, password);
|
||||||
|
}
|
||||||
|
pStmt->alterType = alterType;
|
||||||
|
return (SNode*)pStmt;
|
||||||
|
}
|
||||||
|
|
||||||
|
SNode* createDropUserStmt(SAstCreateContext* pCxt, const SToken* pUserName) {
|
||||||
|
if (!checkUserName(pCxt, pUserName)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
SDropUserStmt* pStmt = (SDropUserStmt*)nodesMakeNode(QUERY_NODE_DROP_USER_STMT);
|
||||||
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
|
strncpy(pStmt->useName, pUserName->z, pUserName->n);
|
||||||
|
return (SNode*)pStmt;
|
||||||
|
}
|
||||||
|
|
||||||
|
SNode* createCreateDnodeStmt(SAstCreateContext* pCxt, const SToken* pFqdn, const SToken* pPort) {
|
||||||
|
int32_t port = 0;
|
||||||
|
char fqdn[TSDB_FQDN_LEN] = {0};
|
||||||
|
if (NULL == pPort) {
|
||||||
|
if (!checkAndSplitEndpoint(pCxt, pFqdn, fqdn, &port)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
} else if (!checkFqdn(pCxt, pFqdn) || !checkPort(pCxt, pPort, &port)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
SCreateDnodeStmt* pStmt = (SCreateDnodeStmt*)nodesMakeNode(QUERY_NODE_CREATE_DNODE_STMT);
|
||||||
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
|
if (NULL == pPort) {
|
||||||
|
strcpy(pStmt->fqdn, fqdn);
|
||||||
|
} else {
|
||||||
|
strncpy(pStmt->fqdn, pFqdn->z, pFqdn->n);
|
||||||
|
}
|
||||||
|
pStmt->port = port;
|
||||||
|
return (SNode*)pStmt;
|
||||||
|
}
|
||||||
|
|
||||||
|
SNode* createDropDnodeStmt(SAstCreateContext* pCxt, const SToken* pDnode) {
|
||||||
|
SDropDnodeStmt* pStmt = (SDropDnodeStmt*)nodesMakeNode(QUERY_NODE_DROP_DNODE_STMT);
|
||||||
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
|
if (TK_NK_INTEGER == pDnode->type) {
|
||||||
|
pStmt->dnodeId = strtol(pDnode->z, NULL, 10);
|
||||||
|
} else {
|
||||||
|
if (!checkAndSplitEndpoint(pCxt, pDnode, pStmt->fqdn, &pStmt->port)) {
|
||||||
|
nodesDestroyNode(pStmt);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (SNode*)pStmt;
|
||||||
|
}
|
||||||
|
|
|
@ -46,7 +46,7 @@ int32_t doParse(SParseContext* pParseCxt, SQuery** pQuery) {
|
||||||
case TK_NK_COMMENT: {
|
case TK_NK_COMMENT: {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TK_SEMI: {
|
case TK_NK_SEMI: {
|
||||||
NewParse(pParser, 0, t0, &cxt);
|
NewParse(pParser, 0, t0, &cxt);
|
||||||
goto abort_parse;
|
goto abort_parse;
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,50 +42,13 @@ typedef struct STranslateContext {
|
||||||
|
|
||||||
static int32_t translateSubquery(STranslateContext* pCxt, SNode* pNode);
|
static int32_t translateSubquery(STranslateContext* pCxt, SNode* pNode);
|
||||||
|
|
||||||
static char* getSyntaxErrFormat(int32_t errCode) {
|
static EDealRes generateDealNodeErrMsg(STranslateContext* pCxt, int32_t errCode, ...) {
|
||||||
switch (errCode) {
|
|
||||||
case TSDB_CODE_PAR_INVALID_COLUMN:
|
|
||||||
return "Invalid column name : %s";
|
|
||||||
case TSDB_CODE_PAR_TABLE_NOT_EXIST:
|
|
||||||
return "Table does not exist : %s";
|
|
||||||
case TSDB_CODE_PAR_AMBIGUOUS_COLUMN:
|
|
||||||
return "Column ambiguously defined : %s";
|
|
||||||
case TSDB_CODE_PAR_WRONG_VALUE_TYPE:
|
|
||||||
return "Invalid value type : %s";
|
|
||||||
case TSDB_CODE_PAR_INVALID_FUNTION:
|
|
||||||
return "Invalid function name : %s";
|
|
||||||
case TSDB_CODE_PAR_FUNTION_PARA_NUM:
|
|
||||||
return "Invalid number of arguments : %s";
|
|
||||||
case TSDB_CODE_PAR_FUNTION_PARA_TYPE:
|
|
||||||
return "Inconsistent datatypes : %s";
|
|
||||||
case TSDB_CODE_PAR_ILLEGAL_USE_AGG_FUNCTION:
|
|
||||||
return "There mustn't be aggregation";
|
|
||||||
case TSDB_CODE_PAR_WRONG_NUMBER_OF_SELECT:
|
|
||||||
return "ORDER BY item must be the number of a SELECT-list expression";
|
|
||||||
case TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION:
|
|
||||||
return "Not a GROUP BY expression";
|
|
||||||
case TSDB_CODE_PAR_NOT_SELECTED_EXPRESSION:
|
|
||||||
return "Not SELECTed expression";
|
|
||||||
case TSDB_CODE_PAR_NOT_SINGLE_GROUP:
|
|
||||||
return "Not a single-group group function";
|
|
||||||
case TSDB_CODE_PAR_TAGS_NOT_MATCHED:
|
|
||||||
return "tags number not matched";
|
|
||||||
case TSDB_CODE_PAR_INVALID_TAG_NAME:
|
|
||||||
return "invalid tag name : %s";
|
|
||||||
case TSDB_CODE_OUT_OF_MEMORY:
|
|
||||||
return "Out of memory";
|
|
||||||
default:
|
|
||||||
return "Unknown error";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t generateSyntaxErrMsg(STranslateContext* pCxt, int32_t errCode, ...) {
|
|
||||||
va_list vArgList;
|
va_list vArgList;
|
||||||
va_start(vArgList, errCode);
|
va_start(vArgList, errCode);
|
||||||
vsnprintf(pCxt->msgBuf.buf, pCxt->msgBuf.len, getSyntaxErrFormat(errCode), vArgList);
|
generateSyntaxErrMsg(&pCxt->msgBuf, errCode, vArgList);
|
||||||
va_end(vArgList);
|
va_end(vArgList);
|
||||||
pCxt->errCode = errCode;
|
pCxt->errCode = errCode;
|
||||||
return errCode;
|
return DEAL_RES_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t addNamespace(STranslateContext* pCxt, void* pTable) {
|
static int32_t addNamespace(STranslateContext* pCxt, void* pTable) {
|
||||||
|
@ -166,7 +129,7 @@ static int32_t createColumnNodeByTable(STranslateContext* pCxt, const STableNode
|
||||||
for (int32_t i = 0; i < nums; ++i) {
|
for (int32_t i = 0; i < nums; ++i) {
|
||||||
SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN);
|
SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN);
|
||||||
if (NULL == pCol) {
|
if (NULL == pCol) {
|
||||||
return generateSyntaxErrMsg(pCxt, TSDB_CODE_OUT_OF_MEMORY);
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
setColumnInfoBySchema((SRealTableNode*)pTable, pMeta->schema + i, (i < pMeta->tableInfo.numOfTags), pCol);
|
setColumnInfoBySchema((SRealTableNode*)pTable, pMeta->schema + i, (i < pMeta->tableInfo.numOfTags), pCol);
|
||||||
nodesListAppend(pList, (SNode*)pCol);
|
nodesListAppend(pList, (SNode*)pCol);
|
||||||
|
@ -177,7 +140,7 @@ static int32_t createColumnNodeByTable(STranslateContext* pCxt, const STableNode
|
||||||
FOREACH(pNode, pProjectList) {
|
FOREACH(pNode, pProjectList) {
|
||||||
SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN);
|
SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN);
|
||||||
if (NULL == pCol) {
|
if (NULL == pCol) {
|
||||||
return generateSyntaxErrMsg(pCxt, TSDB_CODE_OUT_OF_MEMORY);
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
setColumnInfoByExpr(pTable, (SExprNode*)pNode, pCol);
|
setColumnInfoByExpr(pTable, (SExprNode*)pNode, pCol);
|
||||||
nodesListAppend(pList, (SNode*)pCol);
|
nodesListAppend(pList, (SNode*)pCol);
|
||||||
|
@ -224,13 +187,11 @@ static EDealRes translateColumnWithPrefix(STranslateContext* pCxt, SColumnNode*
|
||||||
if (findAndSetColumn(pCol, pTable)) {
|
if (findAndSetColumn(pCol, pTable)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
generateSyntaxErrMsg(pCxt, TSDB_CODE_PAR_INVALID_COLUMN, pCol->colName);
|
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_INVALID_COLUMN, pCol->colName);
|
||||||
return DEAL_RES_ERROR;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!foundTable) {
|
if (!foundTable) {
|
||||||
generateSyntaxErrMsg(pCxt, TSDB_CODE_PAR_TABLE_NOT_EXIST, pCol->tableAlias);
|
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_TABLE_NOT_EXIST, pCol->tableAlias);
|
||||||
return DEAL_RES_ERROR;
|
|
||||||
}
|
}
|
||||||
return DEAL_RES_CONTINUE;
|
return DEAL_RES_CONTINUE;
|
||||||
}
|
}
|
||||||
|
@ -243,15 +204,13 @@ static EDealRes translateColumnWithoutPrefix(STranslateContext* pCxt, SColumnNod
|
||||||
STableNode* pTable = taosArrayGetP(pTables, i);
|
STableNode* pTable = taosArrayGetP(pTables, i);
|
||||||
if (findAndSetColumn(pCol, pTable)) {
|
if (findAndSetColumn(pCol, pTable)) {
|
||||||
if (found) {
|
if (found) {
|
||||||
generateSyntaxErrMsg(pCxt, TSDB_CODE_PAR_AMBIGUOUS_COLUMN, pCol->colName);
|
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_AMBIGUOUS_COLUMN, pCol->colName);
|
||||||
return DEAL_RES_ERROR;
|
|
||||||
}
|
}
|
||||||
found = true;
|
found = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!found) {
|
if (!found) {
|
||||||
generateSyntaxErrMsg(pCxt, TSDB_CODE_PAR_INVALID_COLUMN, pCol->colName);
|
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_INVALID_COLUMN, pCol->colName);
|
||||||
return DEAL_RES_ERROR;
|
|
||||||
}
|
}
|
||||||
return DEAL_RES_CONTINUE;
|
return DEAL_RES_CONTINUE;
|
||||||
}
|
}
|
||||||
|
@ -297,8 +256,7 @@ static EDealRes translateValue(STranslateContext* pCxt, SValueNode* pVal) {
|
||||||
if (pVal->isDuration) {
|
if (pVal->isDuration) {
|
||||||
char unit = 0;
|
char unit = 0;
|
||||||
if (parseAbsoluteDuration(pVal->literal, strlen(pVal->literal), &pVal->datum.i, &unit, pVal->node.resType.precision) != TSDB_CODE_SUCCESS) {
|
if (parseAbsoluteDuration(pVal->literal, strlen(pVal->literal), &pVal->datum.i, &unit, pVal->node.resType.precision) != TSDB_CODE_SUCCESS) {
|
||||||
generateSyntaxErrMsg(pCxt, TSDB_CODE_PAR_WRONG_VALUE_TYPE, pVal->literal);
|
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_WRONG_VALUE_TYPE, pVal->literal);
|
||||||
return DEAL_RES_ERROR;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
switch (pVal->node.resType.type) {
|
switch (pVal->node.resType.type) {
|
||||||
|
@ -336,8 +294,7 @@ static EDealRes translateValue(STranslateContext* pCxt, SValueNode* pVal) {
|
||||||
int32_t n = strlen(pVal->literal);
|
int32_t n = strlen(pVal->literal);
|
||||||
pVal->datum.p = calloc(1, n + VARSTR_HEADER_SIZE);
|
pVal->datum.p = calloc(1, n + VARSTR_HEADER_SIZE);
|
||||||
if (NULL == pVal->datum.p) {
|
if (NULL == pVal->datum.p) {
|
||||||
generateSyntaxErrMsg(pCxt, TSDB_CODE_OUT_OF_MEMORY);
|
return generateDealNodeErrMsg(pCxt, TSDB_CODE_OUT_OF_MEMORY);
|
||||||
return DEAL_RES_ERROR;
|
|
||||||
}
|
}
|
||||||
trimStringWithVarFormat(pVal->literal, n, true, pVal->datum.p);
|
trimStringWithVarFormat(pVal->literal, n, true, pVal->datum.p);
|
||||||
break;
|
break;
|
||||||
|
@ -346,14 +303,12 @@ static EDealRes translateValue(STranslateContext* pCxt, SValueNode* pVal) {
|
||||||
int32_t n = strlen(pVal->literal);
|
int32_t n = strlen(pVal->literal);
|
||||||
char* tmp = calloc(1, n);
|
char* tmp = calloc(1, n);
|
||||||
if (NULL == tmp) {
|
if (NULL == tmp) {
|
||||||
generateSyntaxErrMsg(pCxt, TSDB_CODE_OUT_OF_MEMORY);
|
return generateDealNodeErrMsg(pCxt, TSDB_CODE_OUT_OF_MEMORY);
|
||||||
return DEAL_RES_ERROR;
|
|
||||||
}
|
}
|
||||||
int32_t len = trimStringWithVarFormat(pVal->literal, n, false, tmp);
|
int32_t len = trimStringWithVarFormat(pVal->literal, n, false, tmp);
|
||||||
if (taosParseTime(tmp, &pVal->datum.i, len, pVal->node.resType.precision, tsDaylight) != TSDB_CODE_SUCCESS) {
|
if (taosParseTime(tmp, &pVal->datum.i, len, pVal->node.resType.precision, tsDaylight) != TSDB_CODE_SUCCESS) {
|
||||||
tfree(tmp);
|
tfree(tmp);
|
||||||
generateSyntaxErrMsg(pCxt, TSDB_CODE_PAR_WRONG_VALUE_TYPE, pVal->literal);
|
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_WRONG_VALUE_TYPE, pVal->literal);
|
||||||
return DEAL_RES_ERROR;
|
|
||||||
}
|
}
|
||||||
tfree(tmp);
|
tfree(tmp);
|
||||||
break;
|
break;
|
||||||
|
@ -376,16 +331,14 @@ static EDealRes translateOperator(STranslateContext* pCxt, SOperatorNode* pOp) {
|
||||||
if (nodesIsArithmeticOp(pOp)) {
|
if (nodesIsArithmeticOp(pOp)) {
|
||||||
if (TSDB_DATA_TYPE_JSON == ldt.type || TSDB_DATA_TYPE_BLOB == ldt.type ||
|
if (TSDB_DATA_TYPE_JSON == ldt.type || TSDB_DATA_TYPE_BLOB == ldt.type ||
|
||||||
TSDB_DATA_TYPE_JSON == rdt.type || TSDB_DATA_TYPE_BLOB == rdt.type) {
|
TSDB_DATA_TYPE_JSON == rdt.type || TSDB_DATA_TYPE_BLOB == rdt.type) {
|
||||||
generateSyntaxErrMsg(pCxt, TSDB_CODE_PAR_WRONG_VALUE_TYPE, ((SExprNode*)(pOp->pRight))->aliasName);
|
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_WRONG_VALUE_TYPE, ((SExprNode*)(pOp->pRight))->aliasName);
|
||||||
return DEAL_RES_ERROR;
|
|
||||||
}
|
}
|
||||||
pOp->node.resType.type = TSDB_DATA_TYPE_DOUBLE;
|
pOp->node.resType.type = TSDB_DATA_TYPE_DOUBLE;
|
||||||
pOp->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes;
|
pOp->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes;
|
||||||
} else if (nodesIsComparisonOp(pOp)) {
|
} else if (nodesIsComparisonOp(pOp)) {
|
||||||
if (TSDB_DATA_TYPE_JSON == ldt.type || TSDB_DATA_TYPE_BLOB == ldt.type ||
|
if (TSDB_DATA_TYPE_JSON == ldt.type || TSDB_DATA_TYPE_BLOB == ldt.type ||
|
||||||
TSDB_DATA_TYPE_JSON == rdt.type || TSDB_DATA_TYPE_BLOB == rdt.type) {
|
TSDB_DATA_TYPE_JSON == rdt.type || TSDB_DATA_TYPE_BLOB == rdt.type) {
|
||||||
generateSyntaxErrMsg(pCxt, TSDB_CODE_PAR_WRONG_VALUE_TYPE, ((SExprNode*)(pOp->pRight))->aliasName);
|
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_WRONG_VALUE_TYPE, ((SExprNode*)(pOp->pRight))->aliasName);
|
||||||
return DEAL_RES_ERROR;
|
|
||||||
}
|
}
|
||||||
pOp->node.resType.type = TSDB_DATA_TYPE_BOOL;
|
pOp->node.resType.type = TSDB_DATA_TYPE_BOOL;
|
||||||
pOp->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes;
|
pOp->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes;
|
||||||
|
@ -397,17 +350,14 @@ static EDealRes translateOperator(STranslateContext* pCxt, SOperatorNode* pOp) {
|
||||||
|
|
||||||
static EDealRes translateFunction(STranslateContext* pCxt, SFunctionNode* pFunc) {
|
static EDealRes translateFunction(STranslateContext* pCxt, SFunctionNode* pFunc) {
|
||||||
if (TSDB_CODE_SUCCESS != fmGetFuncInfo(pFunc->functionName, &pFunc->funcId, &pFunc->funcType)) {
|
if (TSDB_CODE_SUCCESS != fmGetFuncInfo(pFunc->functionName, &pFunc->funcId, &pFunc->funcType)) {
|
||||||
generateSyntaxErrMsg(pCxt, TSDB_CODE_PAR_INVALID_FUNTION, pFunc->functionName);
|
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_INVALID_FUNTION, pFunc->functionName);
|
||||||
return DEAL_RES_ERROR;
|
|
||||||
}
|
}
|
||||||
int32_t code = fmGetFuncResultType(pFunc);
|
int32_t code = fmGetFuncResultType(pFunc);
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
generateSyntaxErrMsg(pCxt, code, pFunc->functionName);
|
return generateDealNodeErrMsg(pCxt, code, pFunc->functionName);
|
||||||
return DEAL_RES_ERROR;
|
|
||||||
}
|
}
|
||||||
if (fmIsAggFunc(pFunc->funcId) && beforeHaving(pCxt->currClause)) {
|
if (fmIsAggFunc(pFunc->funcId) && beforeHaving(pCxt->currClause)) {
|
||||||
generateSyntaxErrMsg(pCxt, TSDB_CODE_PAR_ILLEGAL_USE_AGG_FUNCTION);
|
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_ILLEGAL_USE_AGG_FUNCTION);
|
||||||
return DEAL_RES_ERROR;
|
|
||||||
}
|
}
|
||||||
return DEAL_RES_CONTINUE;
|
return DEAL_RES_CONTINUE;
|
||||||
}
|
}
|
||||||
|
@ -498,8 +448,7 @@ static EDealRes doCheckExprForGroupBy(SNode* pNode, void* pContext) {
|
||||||
}
|
}
|
||||||
if (QUERY_NODE_COLUMN == nodeType(pNode) ||
|
if (QUERY_NODE_COLUMN == nodeType(pNode) ||
|
||||||
(QUERY_NODE_FUNCTION == nodeType(pNode) && fmIsAggFunc(((SFunctionNode*)pNode)->funcId) && isDistinctOrderBy(pCxt))) {
|
(QUERY_NODE_FUNCTION == nodeType(pNode) && fmIsAggFunc(((SFunctionNode*)pNode)->funcId) && isDistinctOrderBy(pCxt))) {
|
||||||
generateSyntaxErrMsg(pCxt, getGroupByErrorCode(pCxt));
|
return generateDealNodeErrMsg(pCxt, getGroupByErrorCode(pCxt));
|
||||||
return DEAL_RES_ERROR;
|
|
||||||
}
|
}
|
||||||
return DEAL_RES_CONTINUE;
|
return DEAL_RES_CONTINUE;
|
||||||
}
|
}
|
||||||
|
@ -545,7 +494,7 @@ static int32_t checkAggColCoexist(STranslateContext* pCxt, SSelectStmt* pSelect)
|
||||||
nodesWalkList(pSelect->pOrderByList, doCheckAggColCoexist, &cxt);
|
nodesWalkList(pSelect->pOrderByList, doCheckAggColCoexist, &cxt);
|
||||||
}
|
}
|
||||||
if (cxt.existAggFunc && cxt.existCol) {
|
if (cxt.existAggFunc && cxt.existCol) {
|
||||||
return generateSyntaxErrMsg(pCxt, TSDB_CODE_PAR_NOT_SINGLE_GROUP);
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_NOT_SINGLE_GROUP);
|
||||||
}
|
}
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -582,7 +531,7 @@ static int32_t translateTable(STranslateContext* pCxt, SNode* pTable) {
|
||||||
code = catalogGetTableMeta(pCxt->pParseCxt->pCatalog, pCxt->pParseCxt->pTransporter, &(pCxt->pParseCxt->mgmtEpSet),
|
code = catalogGetTableMeta(pCxt->pParseCxt->pCatalog, pCxt->pParseCxt->pTransporter, &(pCxt->pParseCxt->mgmtEpSet),
|
||||||
toName(pCxt->pParseCxt->acctId, pRealTable, &name), &(pRealTable->pMeta));
|
toName(pCxt->pParseCxt->acctId, pRealTable, &name), &(pRealTable->pMeta));
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
return generateSyntaxErrMsg(pCxt, TSDB_CODE_PAR_TABLE_NOT_EXIST, pRealTable->table.tableName);
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_TABLE_NOT_EXIST, pRealTable->table.tableName);
|
||||||
}
|
}
|
||||||
code = setTableVgroupList(pCxt, &name, &(pRealTable->pVgroupList));
|
code = setTableVgroupList(pCxt, &name, &(pRealTable->pVgroupList));
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
|
@ -622,7 +571,7 @@ static int32_t translateStar(STranslateContext* pCxt, SSelectStmt* pSelect, bool
|
||||||
size_t nums = taosArrayGetSize(pTables);
|
size_t nums = taosArrayGetSize(pTables);
|
||||||
pSelect->pProjectionList = nodesMakeList();
|
pSelect->pProjectionList = nodesMakeList();
|
||||||
if (NULL == pSelect->pProjectionList) {
|
if (NULL == pSelect->pProjectionList) {
|
||||||
return generateSyntaxErrMsg(pCxt, TSDB_CODE_OUT_OF_MEMORY);
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
for (size_t i = 0; i < nums; ++i) {
|
for (size_t i = 0; i < nums; ++i) {
|
||||||
STableNode* pTable = taosArrayGetP(pTables, i);
|
STableNode* pTable = taosArrayGetP(pTables, i);
|
||||||
|
@ -684,11 +633,11 @@ static int32_t translateOrderByPosition(STranslateContext* pCxt, SNodeList* pPro
|
||||||
ERASE_NODE(pOrderByList);
|
ERASE_NODE(pOrderByList);
|
||||||
continue;
|
continue;
|
||||||
} else if (0 == pos || pos > LIST_LENGTH(pProjectionList)) {
|
} else if (0 == pos || pos > LIST_LENGTH(pProjectionList)) {
|
||||||
return generateSyntaxErrMsg(pCxt, TSDB_CODE_PAR_WRONG_NUMBER_OF_SELECT);
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_WRONG_NUMBER_OF_SELECT);
|
||||||
} else {
|
} else {
|
||||||
SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN);
|
SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN);
|
||||||
if (NULL == pCol) {
|
if (NULL == pCol) {
|
||||||
return generateSyntaxErrMsg(pCxt, TSDB_CODE_OUT_OF_MEMORY);
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
setColumnInfoByExpr(NULL, (SExprNode*)nodesListGetNode(pProjectionList, pos - 1), pCol);
|
setColumnInfoByExpr(NULL, (SExprNode*)nodesListGetNode(pProjectionList, pos - 1), pCol);
|
||||||
((SOrderByExprNode*)pNode)->pExpr = (SNode*)pCol;
|
((SOrderByExprNode*)pNode)->pExpr = (SNode*)pCol;
|
||||||
|
@ -733,7 +682,7 @@ static int32_t translateSelectList(STranslateContext* pCxt, SSelectStmt* pSelect
|
||||||
|
|
||||||
static int32_t translateHaving(STranslateContext* pCxt, SSelectStmt* pSelect) {
|
static int32_t translateHaving(STranslateContext* pCxt, SSelectStmt* pSelect) {
|
||||||
if (NULL == pSelect->pGroupByList && NULL != pSelect->pHaving) {
|
if (NULL == pSelect->pGroupByList && NULL != pSelect->pHaving) {
|
||||||
return generateSyntaxErrMsg(pCxt, TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION);
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION);
|
||||||
}
|
}
|
||||||
pCxt->currClause = SQL_CLAUSE_HAVING;
|
pCxt->currClause = SQL_CLAUSE_HAVING;
|
||||||
int32_t code = translateExpr(pCxt, pSelect->pHaving);
|
int32_t code = translateExpr(pCxt, pSelect->pHaving);
|
||||||
|
@ -845,6 +794,29 @@ static int32_t translateCreateDatabase(STranslateContext* pCxt, SCreateDatabaseS
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t translateDropDatabase(STranslateContext* pCxt, SDropDatabaseStmt* pStmt) {
|
||||||
|
SDropDbReq dropReq = {0};
|
||||||
|
SName name = {0};
|
||||||
|
tNameSetDbName(&name, pCxt->pParseCxt->acctId, pStmt->dbName, strlen(pStmt->dbName));
|
||||||
|
tNameGetFullDbName(&name, dropReq.db);
|
||||||
|
dropReq.ignoreNotExists = pStmt->ignoreNotExists;
|
||||||
|
|
||||||
|
pCxt->pCmdMsg = malloc(sizeof(SCmdMsgInfo));
|
||||||
|
if (NULL== pCxt->pCmdMsg) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
pCxt->pCmdMsg->epSet = pCxt->pParseCxt->mgmtEpSet;
|
||||||
|
pCxt->pCmdMsg->msgType = TDMT_MND_DROP_DB;
|
||||||
|
pCxt->pCmdMsg->msgLen = tSerializeSDropDbReq(NULL, 0, &dropReq);
|
||||||
|
pCxt->pCmdMsg->pMsg = malloc(pCxt->pCmdMsg->msgLen);
|
||||||
|
if (NULL== pCxt->pCmdMsg->pMsg) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
tSerializeSDropDbReq(pCxt->pCmdMsg->pMsg, pCxt->pCmdMsg->msgLen, &dropReq);
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t columnNodeToField(SNodeList* pList, SArray** pArray) {
|
static int32_t columnNodeToField(SNodeList* pList, SArray** pArray) {
|
||||||
*pArray = taosArrayInit(LIST_LENGTH(pList), sizeof(SField));
|
*pArray = taosArrayInit(LIST_LENGTH(pList), sizeof(SField));
|
||||||
SNode* pNode;
|
SNode* pNode;
|
||||||
|
@ -911,8 +883,142 @@ static int32_t translateUseDatabase(STranslateContext* pCxt, SUseDatabaseStmt* p
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t translateShowDatabases(STranslateContext* pCxt) {
|
static int32_t translateCreateUser(STranslateContext* pCxt, SCreateUserStmt* pStmt) {
|
||||||
SShowReq showReq = { .type = TSDB_MGMT_TABLE_DB };
|
SCreateUserReq createReq = {0};
|
||||||
|
strcpy(createReq.user, pStmt->useName);
|
||||||
|
createReq.createType = 0;
|
||||||
|
createReq.superUser = 0;
|
||||||
|
strcpy(createReq.pass, pStmt->password);
|
||||||
|
|
||||||
|
pCxt->pCmdMsg = malloc(sizeof(SCmdMsgInfo));
|
||||||
|
if (NULL== pCxt->pCmdMsg) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
pCxt->pCmdMsg->epSet = pCxt->pParseCxt->mgmtEpSet;
|
||||||
|
pCxt->pCmdMsg->msgType = TDMT_MND_CREATE_USER;
|
||||||
|
pCxt->pCmdMsg->msgLen = tSerializeSCreateUserReq(NULL, 0, &createReq);
|
||||||
|
pCxt->pCmdMsg->pMsg = malloc(pCxt->pCmdMsg->msgLen);
|
||||||
|
if (NULL== pCxt->pCmdMsg->pMsg) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
tSerializeSCreateUserReq(pCxt->pCmdMsg->pMsg, pCxt->pCmdMsg->msgLen, &createReq);
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t translateAlterUser(STranslateContext* pCxt, SAlterUserStmt* pStmt) {
|
||||||
|
SAlterUserReq alterReq = {0};
|
||||||
|
strcpy(alterReq.user, pStmt->useName);
|
||||||
|
alterReq.alterType = pStmt->alterType;
|
||||||
|
alterReq.superUser = 0;
|
||||||
|
strcpy(alterReq.pass, pStmt->password);
|
||||||
|
if (NULL != pCxt->pParseCxt->db) {
|
||||||
|
strcpy(alterReq.dbname, pCxt->pParseCxt->db);
|
||||||
|
}
|
||||||
|
|
||||||
|
pCxt->pCmdMsg = malloc(sizeof(SCmdMsgInfo));
|
||||||
|
if (NULL== pCxt->pCmdMsg) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
pCxt->pCmdMsg->epSet = pCxt->pParseCxt->mgmtEpSet;
|
||||||
|
pCxt->pCmdMsg->msgType = TDMT_MND_ALTER_USER;
|
||||||
|
pCxt->pCmdMsg->msgLen = tSerializeSAlterUserReq(NULL, 0, &alterReq);
|
||||||
|
pCxt->pCmdMsg->pMsg = malloc(pCxt->pCmdMsg->msgLen);
|
||||||
|
if (NULL== pCxt->pCmdMsg->pMsg) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
tSerializeSAlterUserReq(pCxt->pCmdMsg->pMsg, pCxt->pCmdMsg->msgLen, &alterReq);
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t translateDropUser(STranslateContext* pCxt, SDropUserStmt* pStmt) {
|
||||||
|
SDropUserReq dropReq = {0};
|
||||||
|
strcpy(dropReq.user, pStmt->useName);
|
||||||
|
|
||||||
|
pCxt->pCmdMsg = malloc(sizeof(SCmdMsgInfo));
|
||||||
|
if (NULL== pCxt->pCmdMsg) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
pCxt->pCmdMsg->epSet = pCxt->pParseCxt->mgmtEpSet;
|
||||||
|
pCxt->pCmdMsg->msgType = TDMT_MND_DROP_USER;
|
||||||
|
pCxt->pCmdMsg->msgLen = tSerializeSDropUserReq(NULL, 0, &dropReq);
|
||||||
|
pCxt->pCmdMsg->pMsg = malloc(pCxt->pCmdMsg->msgLen);
|
||||||
|
if (NULL== pCxt->pCmdMsg->pMsg) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
tSerializeSDropUserReq(pCxt->pCmdMsg->pMsg, pCxt->pCmdMsg->msgLen, &dropReq);
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t translateCreateDnode(STranslateContext* pCxt, SCreateDnodeStmt* pStmt) {
|
||||||
|
SCreateDnodeReq createReq = {0};
|
||||||
|
strcpy(createReq.fqdn, pStmt->fqdn);
|
||||||
|
createReq.port = pStmt->port;
|
||||||
|
|
||||||
|
pCxt->pCmdMsg = malloc(sizeof(SCmdMsgInfo));
|
||||||
|
if (NULL== pCxt->pCmdMsg) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
pCxt->pCmdMsg->epSet = pCxt->pParseCxt->mgmtEpSet;
|
||||||
|
pCxt->pCmdMsg->msgType = TDMT_MND_CREATE_DNODE;
|
||||||
|
pCxt->pCmdMsg->msgLen = tSerializeSCreateDnodeReq(NULL, 0, &createReq);
|
||||||
|
pCxt->pCmdMsg->pMsg = malloc(pCxt->pCmdMsg->msgLen);
|
||||||
|
if (NULL== pCxt->pCmdMsg->pMsg) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
tSerializeSCreateDnodeReq(pCxt->pCmdMsg->pMsg, pCxt->pCmdMsg->msgLen, &createReq);
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t translateDropDnode(STranslateContext* pCxt, SDropDnodeStmt* pStmt) {
|
||||||
|
SDropDnodeReq dropReq = {0};
|
||||||
|
dropReq.dnodeId = pStmt->dnodeId;
|
||||||
|
strcpy(dropReq.fqdn, pStmt->fqdn);
|
||||||
|
dropReq.port = pStmt->port;
|
||||||
|
|
||||||
|
pCxt->pCmdMsg = malloc(sizeof(SCmdMsgInfo));
|
||||||
|
if (NULL== pCxt->pCmdMsg) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
pCxt->pCmdMsg->epSet = pCxt->pParseCxt->mgmtEpSet;
|
||||||
|
pCxt->pCmdMsg->msgType = TDMT_MND_DROP_DNODE;
|
||||||
|
pCxt->pCmdMsg->msgLen = tSerializeSDropDnodeReq(NULL, 0, &dropReq);
|
||||||
|
pCxt->pCmdMsg->pMsg = malloc(pCxt->pCmdMsg->msgLen);
|
||||||
|
if (NULL== pCxt->pCmdMsg->pMsg) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
tSerializeSDropDnodeReq(pCxt->pCmdMsg->pMsg, pCxt->pCmdMsg->msgLen, &dropReq);
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t nodeTypeToShowType(ENodeType nt) {
|
||||||
|
switch (nt) {
|
||||||
|
case QUERY_NODE_SHOW_DATABASES_STMT:
|
||||||
|
return TSDB_MGMT_TABLE_DB;
|
||||||
|
case QUERY_NODE_SHOW_STABLES_STMT:
|
||||||
|
return TSDB_MGMT_TABLE_STB;
|
||||||
|
case QUERY_NODE_SHOW_USERS_STMT:
|
||||||
|
return TSDB_MGMT_TABLE_USER;
|
||||||
|
case QUERY_NODE_SHOW_DNODES_STMT:
|
||||||
|
return TSDB_MGMT_TABLE_DNODE;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t translateShow(STranslateContext* pCxt, ENodeType type) {
|
||||||
|
SShowReq showReq = { .type = nodeTypeToShowType(type) };
|
||||||
|
if (NULL != pCxt->pParseCxt->db) {
|
||||||
|
SName name = {0};
|
||||||
|
tNameSetDbName(&name, pCxt->pParseCxt->acctId, pCxt->pParseCxt->db, strlen(pCxt->pParseCxt->db));
|
||||||
|
char dbFname[TSDB_DB_FNAME_LEN] = {0};
|
||||||
|
tNameGetFullDbName(&name, showReq.db);
|
||||||
|
}
|
||||||
|
|
||||||
pCxt->pCmdMsg = malloc(sizeof(SCmdMsgInfo));
|
pCxt->pCmdMsg = malloc(sizeof(SCmdMsgInfo));
|
||||||
if (NULL== pCxt->pCmdMsg) {
|
if (NULL== pCxt->pCmdMsg) {
|
||||||
|
@ -967,14 +1073,35 @@ static int32_t translateQuery(STranslateContext* pCxt, SNode* pNode) {
|
||||||
case QUERY_NODE_CREATE_DATABASE_STMT:
|
case QUERY_NODE_CREATE_DATABASE_STMT:
|
||||||
code = translateCreateDatabase(pCxt, (SCreateDatabaseStmt*)pNode);
|
code = translateCreateDatabase(pCxt, (SCreateDatabaseStmt*)pNode);
|
||||||
break;
|
break;
|
||||||
|
case QUERY_NODE_DROP_DATABASE_STMT:
|
||||||
|
code = translateDropDatabase(pCxt, (SDropDatabaseStmt*)pNode);
|
||||||
|
break;
|
||||||
case QUERY_NODE_CREATE_TABLE_STMT:
|
case QUERY_NODE_CREATE_TABLE_STMT:
|
||||||
code = translateCreateSuperTable(pCxt, (SCreateTableStmt*)pNode);
|
code = translateCreateSuperTable(pCxt, (SCreateTableStmt*)pNode);
|
||||||
break;
|
break;
|
||||||
|
case QUERY_NODE_CREATE_USER_STMT:
|
||||||
|
code = translateCreateUser(pCxt, (SCreateUserStmt*)pNode);
|
||||||
|
break;
|
||||||
|
case QUERY_NODE_ALTER_USER_STMT:
|
||||||
|
code = translateAlterUser(pCxt, (SAlterUserStmt*)pNode);
|
||||||
|
break;
|
||||||
|
case QUERY_NODE_DROP_USER_STMT:
|
||||||
|
code = translateDropUser(pCxt, (SDropUserStmt*)pNode);
|
||||||
|
break;
|
||||||
case QUERY_NODE_USE_DATABASE_STMT:
|
case QUERY_NODE_USE_DATABASE_STMT:
|
||||||
code = translateUseDatabase(pCxt, (SUseDatabaseStmt*)pNode);
|
code = translateUseDatabase(pCxt, (SUseDatabaseStmt*)pNode);
|
||||||
break;
|
break;
|
||||||
|
case QUERY_NODE_CREATE_DNODE_STMT:
|
||||||
|
code = translateCreateDnode(pCxt, (SCreateDnodeStmt*)pNode);
|
||||||
|
break;
|
||||||
|
case QUERY_NODE_DROP_DNODE_STMT:
|
||||||
|
code = translateDropDnode(pCxt, (SDropDnodeStmt*)pNode);
|
||||||
|
break;
|
||||||
case QUERY_NODE_SHOW_DATABASES_STMT:
|
case QUERY_NODE_SHOW_DATABASES_STMT:
|
||||||
code = translateShowDatabases(pCxt);
|
case QUERY_NODE_SHOW_STABLES_STMT:
|
||||||
|
case QUERY_NODE_SHOW_USERS_STMT:
|
||||||
|
case QUERY_NODE_SHOW_DNODES_STMT:
|
||||||
|
code = translateShow(pCxt, nodeType(pNode));
|
||||||
break;
|
break;
|
||||||
case QUERY_NODE_SHOW_TABLES_STMT:
|
case QUERY_NODE_SHOW_TABLES_STMT:
|
||||||
code = translateShowTables(pCxt);
|
code = translateShowTables(pCxt);
|
||||||
|
@ -1002,7 +1129,7 @@ static int32_t setReslutSchema(STranslateContext* pCxt, SQuery* pQuery) {
|
||||||
pQuery->numOfResCols = LIST_LENGTH(pSelect->pProjectionList);
|
pQuery->numOfResCols = LIST_LENGTH(pSelect->pProjectionList);
|
||||||
pQuery->pResSchema = calloc(pQuery->numOfResCols, sizeof(SSchema));
|
pQuery->pResSchema = calloc(pQuery->numOfResCols, sizeof(SSchema));
|
||||||
if (NULL == pQuery->pResSchema) {
|
if (NULL == pQuery->pResSchema) {
|
||||||
return generateSyntaxErrMsg(pCxt, TSDB_CODE_OUT_OF_MEMORY);
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
SNode* pNode;
|
SNode* pNode;
|
||||||
int32_t index = 0;
|
int32_t index = 0;
|
||||||
|
@ -1235,7 +1362,7 @@ static int32_t addValToKVRow(STranslateContext* pCxt, SValueNode* pVal, const SS
|
||||||
static int32_t buildKVRowForBindTags(STranslateContext* pCxt, SCreateSubTableClause* pStmt, STableMeta* pSuperTableMeta, SKVRowBuilder* pBuilder) {
|
static int32_t buildKVRowForBindTags(STranslateContext* pCxt, SCreateSubTableClause* pStmt, STableMeta* pSuperTableMeta, SKVRowBuilder* pBuilder) {
|
||||||
int32_t numOfTags = getNumOfTags(pSuperTableMeta);
|
int32_t numOfTags = getNumOfTags(pSuperTableMeta);
|
||||||
if (LIST_LENGTH(pStmt->pValsOfTags) != LIST_LENGTH(pStmt->pSpecificTags) || numOfTags < LIST_LENGTH(pStmt->pValsOfTags)) {
|
if (LIST_LENGTH(pStmt->pValsOfTags) != LIST_LENGTH(pStmt->pSpecificTags) || numOfTags < LIST_LENGTH(pStmt->pValsOfTags)) {
|
||||||
return generateSyntaxErrMsg(pCxt, TSDB_CODE_PAR_TAGS_NOT_MATCHED);
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_TAGS_NOT_MATCHED);
|
||||||
}
|
}
|
||||||
|
|
||||||
SSchema* pTagSchema = getTableTagSchema(pSuperTableMeta);
|
SSchema* pTagSchema = getTableTagSchema(pSuperTableMeta);
|
||||||
|
@ -1250,7 +1377,7 @@ static int32_t buildKVRowForBindTags(STranslateContext* pCxt, SCreateSubTableCla
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (NULL == pSchema) {
|
if (NULL == pSchema) {
|
||||||
return generateSyntaxErrMsg(pCxt, TSDB_CODE_PAR_INVALID_TAG_NAME, pCol->colName);
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_TAG_NAME, pCol->colName);
|
||||||
}
|
}
|
||||||
int32_t code = addValToKVRow(pCxt, (SValueNode*)pVal, pSchema, pBuilder);
|
int32_t code = addValToKVRow(pCxt, (SValueNode*)pVal, pSchema, pBuilder);
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
|
@ -1263,7 +1390,7 @@ static int32_t buildKVRowForBindTags(STranslateContext* pCxt, SCreateSubTableCla
|
||||||
|
|
||||||
static int32_t buildKVRowForAllTags(STranslateContext* pCxt, SCreateSubTableClause* pStmt, STableMeta* pSuperTableMeta, SKVRowBuilder* pBuilder) {
|
static int32_t buildKVRowForAllTags(STranslateContext* pCxt, SCreateSubTableClause* pStmt, STableMeta* pSuperTableMeta, SKVRowBuilder* pBuilder) {
|
||||||
if (getNumOfTags(pSuperTableMeta) != LIST_LENGTH(pStmt->pValsOfTags)) {
|
if (getNumOfTags(pSuperTableMeta) != LIST_LENGTH(pStmt->pValsOfTags)) {
|
||||||
return generateSyntaxErrMsg(pCxt, TSDB_CODE_PAR_TAGS_NOT_MATCHED);
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_TAGS_NOT_MATCHED);
|
||||||
}
|
}
|
||||||
|
|
||||||
SSchema* pTagSchema = getTableTagSchema(pSuperTableMeta);
|
SSchema* pTagSchema = getTableTagSchema(pSuperTableMeta);
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -15,6 +15,63 @@
|
||||||
|
|
||||||
#include "parserUtil.h"
|
#include "parserUtil.h"
|
||||||
|
|
||||||
|
static char* getSyntaxErrFormat(int32_t errCode) {
|
||||||
|
switch (errCode) {
|
||||||
|
case TSDB_CODE_PAR_SYNTAX_ERROR:
|
||||||
|
return "syntax error near \"%s\"";
|
||||||
|
case TSDB_CODE_PAR_INCOMPLETE_SQL:
|
||||||
|
return "Incomplete SQL statement";
|
||||||
|
case TSDB_CODE_PAR_INVALID_COLUMN:
|
||||||
|
return "Invalid column name : %s";
|
||||||
|
case TSDB_CODE_PAR_TABLE_NOT_EXIST:
|
||||||
|
return "Table does not exist : %s";
|
||||||
|
case TSDB_CODE_PAR_AMBIGUOUS_COLUMN:
|
||||||
|
return "Column ambiguously defined : %s";
|
||||||
|
case TSDB_CODE_PAR_WRONG_VALUE_TYPE:
|
||||||
|
return "Invalid value type : %s";
|
||||||
|
case TSDB_CODE_PAR_INVALID_FUNTION:
|
||||||
|
return "Invalid function name : %s";
|
||||||
|
case TSDB_CODE_PAR_FUNTION_PARA_NUM:
|
||||||
|
return "Invalid number of arguments : %s";
|
||||||
|
case TSDB_CODE_PAR_FUNTION_PARA_TYPE:
|
||||||
|
return "Inconsistent datatypes : %s";
|
||||||
|
case TSDB_CODE_PAR_ILLEGAL_USE_AGG_FUNCTION:
|
||||||
|
return "There mustn't be aggregation";
|
||||||
|
case TSDB_CODE_PAR_WRONG_NUMBER_OF_SELECT:
|
||||||
|
return "ORDER BY item must be the number of a SELECT-list expression";
|
||||||
|
case TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION:
|
||||||
|
return "Not a GROUP BY expression";
|
||||||
|
case TSDB_CODE_PAR_NOT_SELECTED_EXPRESSION:
|
||||||
|
return "Not SELECTed expression";
|
||||||
|
case TSDB_CODE_PAR_NOT_SINGLE_GROUP:
|
||||||
|
return "Not a single-group group function";
|
||||||
|
case TSDB_CODE_PAR_TAGS_NOT_MATCHED:
|
||||||
|
return "tags number not matched";
|
||||||
|
case TSDB_CODE_PAR_INVALID_TAG_NAME:
|
||||||
|
return "invalid tag name : %s";
|
||||||
|
case TSDB_CODE_PAR_NAME_OR_PASSWD_TOO_LONG:
|
||||||
|
return "name or password too long";
|
||||||
|
case TSDB_CODE_PAR_PASSWD_EMPTY:
|
||||||
|
return "password can not be empty";
|
||||||
|
case TSDB_CODE_PAR_INVALID_PORT:
|
||||||
|
return "port should be an integer that is less than 65535 and greater than 0";
|
||||||
|
case TSDB_CODE_PAR_INVALID_ENDPOINT:
|
||||||
|
return "endpoint should be in the format of 'fqdn:port'";
|
||||||
|
case TSDB_CODE_OUT_OF_MEMORY:
|
||||||
|
return "Out of memory";
|
||||||
|
default:
|
||||||
|
return "Unknown error";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t generateSyntaxErrMsg(SMsgBuf* pBuf, int32_t errCode, ...) {
|
||||||
|
va_list vArgList;
|
||||||
|
va_start(vArgList, errCode);
|
||||||
|
vsnprintf(pBuf->buf, pBuf->len, getSyntaxErrFormat(errCode), vArgList);
|
||||||
|
va_end(vArgList);
|
||||||
|
return errCode;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t buildInvalidOperationMsg(SMsgBuf* pBuf, const char* msg) {
|
int32_t buildInvalidOperationMsg(SMsgBuf* pBuf, const char* msg) {
|
||||||
strncpy(pBuf->buf, msg, pBuf->len);
|
strncpy(pBuf->buf, msg, pBuf->len);
|
||||||
return TSDB_CODE_TSC_INVALID_OPERATION;
|
return TSDB_CODE_TSC_INVALID_OPERATION;
|
||||||
|
|
|
@ -30,6 +30,7 @@ typedef struct SKeyword {
|
||||||
// keywords in sql string
|
// keywords in sql string
|
||||||
static SKeyword keywordTable[] = {
|
static SKeyword keywordTable[] = {
|
||||||
{"ALL", TK_ALL},
|
{"ALL", TK_ALL},
|
||||||
|
{"ALTER", TK_ALTER},
|
||||||
{"AND", TK_AND},
|
{"AND", TK_AND},
|
||||||
{"AS", TK_AS},
|
{"AS", TK_AS},
|
||||||
{"ASC", TK_ASC},
|
{"ASC", TK_ASC},
|
||||||
|
@ -49,7 +50,10 @@ static SKeyword keywordTable[] = {
|
||||||
{"DAYS", TK_DAYS},
|
{"DAYS", TK_DAYS},
|
||||||
{"DESC", TK_DESC},
|
{"DESC", TK_DESC},
|
||||||
{"DISTINCT", TK_DISTINCT},
|
{"DISTINCT", TK_DISTINCT},
|
||||||
|
{"DNODE", TK_DNODE},
|
||||||
|
{"DNODES", TK_DNODES},
|
||||||
{"DOUBLE", TK_DOUBLE},
|
{"DOUBLE", TK_DOUBLE},
|
||||||
|
{"DROP", TK_DROP},
|
||||||
{"EXISTS", TK_EXISTS},
|
{"EXISTS", TK_EXISTS},
|
||||||
// {"FILE", TK_FILE},
|
// {"FILE", TK_FILE},
|
||||||
{"FILL", TK_FILL},
|
{"FILL", TK_FILL},
|
||||||
|
@ -85,11 +89,14 @@ static SKeyword keywordTable[] = {
|
||||||
{"NOW", TK_NOW},
|
{"NOW", TK_NOW},
|
||||||
{"NULL", TK_NULL},
|
{"NULL", TK_NULL},
|
||||||
{"OFFSET", TK_OFFSET},
|
{"OFFSET", TK_OFFSET},
|
||||||
{"PRECISION", TK_PRECISION},
|
|
||||||
{"PREV", TK_PREV},
|
|
||||||
{"ON", TK_ON},
|
{"ON", TK_ON},
|
||||||
{"OR", TK_OR},
|
{"OR", TK_OR},
|
||||||
{"ORDER", TK_ORDER},
|
{"ORDER", TK_ORDER},
|
||||||
|
{"PASS", TK_PASS},
|
||||||
|
{"PORT", TK_PORT},
|
||||||
|
{"PRECISION", TK_PRECISION},
|
||||||
|
{"PRIVILEGE", TK_PRIVILEGE},
|
||||||
|
{"PREV", TK_PREV},
|
||||||
{"QUORUM", TK_QUORUM},
|
{"QUORUM", TK_QUORUM},
|
||||||
{"REPLICA", TK_REPLICA},
|
{"REPLICA", TK_REPLICA},
|
||||||
{"SELECT", TK_SELECT},
|
{"SELECT", TK_SELECT},
|
||||||
|
@ -102,6 +109,7 @@ static SKeyword keywordTable[] = {
|
||||||
{"SMALLINT", TK_SMALLINT},
|
{"SMALLINT", TK_SMALLINT},
|
||||||
{"SOFFSET", TK_SOFFSET},
|
{"SOFFSET", TK_SOFFSET},
|
||||||
{"STABLE", TK_STABLE},
|
{"STABLE", TK_STABLE},
|
||||||
|
{"STABLES", TK_STABLES},
|
||||||
{"STATE_WINDOW", TK_STATE_WINDOW},
|
{"STATE_WINDOW", TK_STATE_WINDOW},
|
||||||
{"STREAM_MODE", TK_STREAM_MODE},
|
{"STREAM_MODE", TK_STREAM_MODE},
|
||||||
{"TABLE", TK_TABLE},
|
{"TABLE", TK_TABLE},
|
||||||
|
@ -113,6 +121,8 @@ static SKeyword keywordTable[] = {
|
||||||
{"UNION", TK_UNION},
|
{"UNION", TK_UNION},
|
||||||
{"UNSIGNED", TK_UNSIGNED},
|
{"UNSIGNED", TK_UNSIGNED},
|
||||||
{"USE", TK_USE},
|
{"USE", TK_USE},
|
||||||
|
{"USER", TK_USER},
|
||||||
|
{"USERS", TK_USERS},
|
||||||
{"USING", TK_USING},
|
{"USING", TK_USING},
|
||||||
{"VALUES", TK_VALUES},
|
{"VALUES", TK_VALUES},
|
||||||
{"VARCHAR", TK_VARCHAR},
|
{"VARCHAR", TK_VARCHAR},
|
||||||
|
@ -145,9 +155,7 @@ static SKeyword keywordTable[] = {
|
||||||
// {"UPLUS", TK_UPLUS},
|
// {"UPLUS", TK_UPLUS},
|
||||||
// {"BITNOT", TK_BITNOT},
|
// {"BITNOT", TK_BITNOT},
|
||||||
// {"MNODES", TK_MNODES},
|
// {"MNODES", TK_MNODES},
|
||||||
// {"DNODES", TK_DNODES},
|
|
||||||
// {"ACCOUNTS", TK_ACCOUNTS},
|
// {"ACCOUNTS", TK_ACCOUNTS},
|
||||||
// {"USERS", TK_USERS},
|
|
||||||
// {"MODULES", TK_MODULES},
|
// {"MODULES", TK_MODULES},
|
||||||
// {"QUERIES", TK_QUERIES},
|
// {"QUERIES", TK_QUERIES},
|
||||||
// {"CONNECTIONS", TK_CONNECTIONS},
|
// {"CONNECTIONS", TK_CONNECTIONS},
|
||||||
|
@ -156,16 +164,9 @@ static SKeyword keywordTable[] = {
|
||||||
// {"SCORES", TK_SCORES},
|
// {"SCORES", TK_SCORES},
|
||||||
// {"GRANTS", TK_GRANTS},
|
// {"GRANTS", TK_GRANTS},
|
||||||
// {"DOT", TK_DOT},
|
// {"DOT", TK_DOT},
|
||||||
// {"STABLES", TK_STABLES},
|
|
||||||
// {"DROP", TK_DROP},
|
|
||||||
// {"DNODE", TK_DNODE},
|
|
||||||
// {"USER", TK_USER},
|
|
||||||
// {"ACCOUNT", TK_ACCOUNT},
|
// {"ACCOUNT", TK_ACCOUNT},
|
||||||
// {"DESCRIBE", TK_DESCRIBE},
|
// {"DESCRIBE", TK_DESCRIBE},
|
||||||
// {"SYNCDB", TK_SYNCDB},
|
// {"SYNCDB", TK_SYNCDB},
|
||||||
// {"ALTER", TK_ALTER},
|
|
||||||
// {"PASS", TK_PASS},
|
|
||||||
// {"PRIVILEGE", TK_PRIVILEGE},
|
|
||||||
// {"LOCAL", TK_LOCAL},
|
// {"LOCAL", TK_LOCAL},
|
||||||
// {"PPS", TK_PPS},
|
// {"PPS", TK_PPS},
|
||||||
// {"TSERIES", TK_TSERIES},
|
// {"TSERIES", TK_TSERIES},
|
||||||
|
@ -235,7 +236,6 @@ static SKeyword keywordTable[] = {
|
||||||
// {"OUTPUTTYPE", TK_OUTPUTTYPE},
|
// {"OUTPUTTYPE", TK_OUTPUTTYPE},
|
||||||
// {"AGGREGATE", TK_AGGREGATE},
|
// {"AGGREGATE", TK_AGGREGATE},
|
||||||
// {"BUFSIZE", TK_BUFSIZE},
|
// {"BUFSIZE", TK_BUFSIZE},
|
||||||
// {"PORT", TK_PORT},
|
|
||||||
// {"MODE", TK_MODE},
|
// {"MODE", TK_MODE},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -330,7 +330,7 @@ uint32_t tGetToken(const char* z, uint32_t* tokenId) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
case ';': {
|
case ';': {
|
||||||
*tokenId = TK_SEMI;
|
*tokenId = TK_NK_SEMI;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
case '+': {
|
case '+': {
|
||||||
|
@ -537,7 +537,7 @@ uint32_t tGetToken(const char* z, uint32_t* tokenId) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (seg == 4) { // ip address
|
if (seg == 4) { // ip address
|
||||||
*tokenId = TK_IPTOKEN;
|
*tokenId = TK_NK_IPTOKEN;
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -648,7 +648,7 @@ SToken tStrGetToken(const char* str, int32_t* i, bool isPrevOptr) {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (t0.type == TK_SEMI) {
|
if (t0.type == TK_NK_SEMI) {
|
||||||
t0.n = 0;
|
t0.n = 0;
|
||||||
return t0;
|
return t0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,8 +37,8 @@ void generateTestT1(MockCatalogService* mcs) {
|
||||||
void generateTestST1(MockCatalogService* mcs) {
|
void generateTestST1(MockCatalogService* mcs) {
|
||||||
ITableBuilder& builder = mcs->createTableBuilder("test", "st1", TSDB_SUPER_TABLE, 3, 2)
|
ITableBuilder& builder = mcs->createTableBuilder("test", "st1", TSDB_SUPER_TABLE, 3, 2)
|
||||||
.setPrecision(TSDB_TIME_PRECISION_MILLI).addColumn("ts", TSDB_DATA_TYPE_TIMESTAMP)
|
.setPrecision(TSDB_TIME_PRECISION_MILLI).addColumn("ts", TSDB_DATA_TYPE_TIMESTAMP)
|
||||||
.addTag("tag1", TSDB_DATA_TYPE_INT).addTag("tag2", TSDB_DATA_TYPE_BINARY, 20)
|
.addColumn("c1", TSDB_DATA_TYPE_INT).addColumn("c2", TSDB_DATA_TYPE_BINARY, 20)
|
||||||
.addColumn("c1", TSDB_DATA_TYPE_INT).addColumn("c2", TSDB_DATA_TYPE_BINARY, 20);
|
.addTag("tag1", TSDB_DATA_TYPE_INT).addTag("tag2", TSDB_DATA_TYPE_BINARY, 20);
|
||||||
builder.done();
|
builder.done();
|
||||||
mcs->createSubTable("test", "st1", "st1s1", 1);
|
mcs->createSubTable("test", "st1", "st1s1", 1);
|
||||||
mcs->createSubTable("test", "st1", "st1s2", 2);
|
mcs->createSubTable("test", "st1", "st1s2", 2);
|
||||||
|
@ -62,6 +62,10 @@ int32_t __catalogGetTableDistVgInfo(SCatalog* pCtg, void *pRpc, const SEpSet* pM
|
||||||
return mockCatalogService->catalogGetTableDistVgInfo(pTableName, pVgList);
|
return mockCatalogService->catalogGetTableDistVgInfo(pTableName, pVgList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t __catalogGetDBVgVersion(SCatalog* pCtg, const char* dbFName, int32_t* version, int64_t* dbId, int32_t *tableNum) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void initMetaDataEnv() {
|
void initMetaDataEnv() {
|
||||||
mockCatalogService.reset(new MockCatalogService());
|
mockCatalogService.reset(new MockCatalogService());
|
||||||
|
|
||||||
|
@ -102,6 +106,14 @@ void initMetaDataEnv() {
|
||||||
stub.set(f.second, __catalogGetTableDistVgInfo);
|
stub.set(f.second, __catalogGetTableDistVgInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
AddrAny any("libcatalog.so");
|
||||||
|
std::map<std::string,void*> result;
|
||||||
|
any.get_global_func_addr_dynsym("^catalogGetDBVgVersion$", result);
|
||||||
|
for (const auto& f : result) {
|
||||||
|
stub.set(f.second, __catalogGetDBVgVersion);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void generateMetaData() {
|
void generateMetaData() {
|
||||||
|
|
|
@ -113,6 +113,7 @@ public:
|
||||||
const char* tname = tNameGetTableName(pTableName);
|
const char* tname = tNameGetTableName(pTableName);
|
||||||
int32_t code = copyTableSchemaMeta(db, tname, &table);
|
int32_t code = copyTableSchemaMeta(db, tname, &table);
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
|
std::cout << "db : " << db << ", table :" << tname << std::endl;
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
*pTableMeta = table.release();
|
*pTableMeta = table.release();
|
||||||
|
|
|
@ -281,7 +281,26 @@ TEST_F(ParserTest, selectSemanticError) {
|
||||||
ASSERT_TRUE(run(TSDB_CODE_SUCCESS, TSDB_CODE_PAR_NOT_SELECTED_EXPRESSION));
|
ASSERT_TRUE(run(TSDB_CODE_SUCCESS, TSDB_CODE_PAR_NOT_SELECTED_EXPRESSION));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(ParserTest, createUser) {
|
||||||
|
setDatabase("root", "test");
|
||||||
|
|
||||||
|
bind("create user wxy pass '123456'");
|
||||||
|
ASSERT_TRUE(run());
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(ParserTest, createDnode) {
|
||||||
|
setDatabase("root", "test");
|
||||||
|
|
||||||
|
bind("create dnode abc1 port 7000");
|
||||||
|
ASSERT_TRUE(run());
|
||||||
|
|
||||||
|
bind("create dnode 1.1.1.1 port 9000");
|
||||||
|
ASSERT_TRUE(run());
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(ParserTest, createDatabase) {
|
TEST_F(ParserTest, createDatabase) {
|
||||||
|
setDatabase("root", "test");
|
||||||
|
|
||||||
bind("create database wxy_db");
|
bind("create database wxy_db");
|
||||||
ASSERT_TRUE(run());
|
ASSERT_TRUE(run());
|
||||||
|
|
||||||
|
@ -308,16 +327,22 @@ TEST_F(ParserTest, createDatabase) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserTest, showDatabase) {
|
TEST_F(ParserTest, showDatabase) {
|
||||||
|
setDatabase("root", "test");
|
||||||
|
|
||||||
bind("show databases");
|
bind("show databases");
|
||||||
ASSERT_TRUE(run());
|
ASSERT_TRUE(run());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserTest, useDatabase) {
|
TEST_F(ParserTest, useDatabase) {
|
||||||
|
setDatabase("root", "test");
|
||||||
|
|
||||||
bind("use wxy_db");
|
bind("use wxy_db");
|
||||||
ASSERT_TRUE(run());
|
ASSERT_TRUE(run());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserTest, createTable) {
|
TEST_F(ParserTest, createTable) {
|
||||||
|
setDatabase("root", "test");
|
||||||
|
|
||||||
bind("create table t1(ts timestamp, c1 int)");
|
bind("create table t1(ts timestamp, c1 int)");
|
||||||
ASSERT_TRUE(run());
|
ASSERT_TRUE(run());
|
||||||
|
|
||||||
|
@ -337,13 +362,13 @@ TEST_F(ParserTest, createTable) {
|
||||||
);
|
);
|
||||||
ASSERT_TRUE(run());
|
ASSERT_TRUE(run());
|
||||||
|
|
||||||
bind("create table if not exists t1 using st1 tags(1)");
|
bind("create table if not exists t1 using st1 tags(1, 'wxy')");
|
||||||
ASSERT_TRUE(run());
|
ASSERT_TRUE(run());
|
||||||
|
|
||||||
bind("create table "
|
bind("create table "
|
||||||
"if not exists test.t1 using test.st1 (tc1, tc2, tc3) tags(1, 2.0, 'abc', TIMESTAMP '2022-3-6 11:20:23') "
|
"if not exists test.t1 using test.st1 (tag1, tag2) tags(1, 'abc') "
|
||||||
"if not exists test.t2 using test.st1 (tc1, tc2, tc3) tags(2, 2.0, 'abc', TIMESTAMP '2022-3-6 11:20:23') "
|
"if not exists test.t2 using test.st1 (tag1, tag2) tags(2, 'abc') "
|
||||||
"if not exists test.t3 using test.st1 (tc1, tc2, tc3) tags(3, 2.0, 'abc', TIMESTAMP '2022-3-6 11:20:23')"
|
"if not exists test.t3 using test.st1 (tag1, tag2) tags(3, 'abc')"
|
||||||
);
|
);
|
||||||
ASSERT_TRUE(run());
|
ASSERT_TRUE(run());
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue