[td-3949]
This commit is contained in:
parent
f28e7b4e2e
commit
8880e515df
|
@ -6689,8 +6689,8 @@ int32_t doCheckForStream(SSqlObj* pSql, SSqlInfo* pInfo) {
|
|||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg6);
|
||||
}
|
||||
|
||||
STableNamePair* p1 = taosArrayGet(pFromInfo->list, 0);
|
||||
SStrToken srcToken = {.z = p1->name.z, .n = p1->name.n, .type = TK_STRING};
|
||||
SRelElementPair* p1 = taosArrayGet(pFromInfo->list, 0);
|
||||
SStrToken srcToken = {.z = p1->tableName.z, .n = p1->tableName.n, .type = TK_STRING};
|
||||
if (tscValidateName(&srcToken) != TSDB_CODE_SUCCESS) {
|
||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg1);
|
||||
}
|
||||
|
@ -7085,8 +7085,8 @@ static int32_t doLoadAllTableMeta(SSqlObj* pSql, SQueryInfo* pQueryInfo, SSqlNod
|
|||
tscAddEmptyMetaInfo(pQueryInfo);
|
||||
}
|
||||
|
||||
STableNamePair *item = taosArrayGet(pSqlNode->from->list, i);
|
||||
SStrToken *oriName = &item->name;
|
||||
SRelElementPair *item = taosArrayGet(pSqlNode->from->list, i);
|
||||
SStrToken *oriName = &item->tableName;
|
||||
|
||||
if (oriName->type == TK_INTEGER || oriName->type == TK_FLOAT) {
|
||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg1);
|
||||
|
@ -7284,10 +7284,9 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, SQueryInfo* pQueryInf
|
|||
pQueryInfo->window.skey = pQueryInfo->window.skey / 1000;
|
||||
pQueryInfo->window.ekey = pQueryInfo->window.ekey / 1000;
|
||||
}
|
||||
} else { // set the time rang
|
||||
if (taosArrayGetSize(pSqlNode->from->list) > 1) {
|
||||
// If it is a join query, no where clause is not allowed.
|
||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), "condition missing for join query ");
|
||||
} else {
|
||||
if (taosArrayGetSize(pSqlNode->from->list) > 1) { // Cross join not allowed yet
|
||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), "cross join not supported yet");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -107,14 +107,19 @@ typedef struct SSqlNode {
|
|||
struct tSqlExpr *pHaving; // having clause [optional]
|
||||
} SSqlNode;
|
||||
|
||||
typedef struct STableNamePair {
|
||||
SStrToken name;
|
||||
typedef struct SRelElementPair {
|
||||
union {
|
||||
SStrToken tableName;
|
||||
SArray *pSubquery;
|
||||
//SSqlNode *pSubquery;
|
||||
};
|
||||
|
||||
SStrToken aliasName;
|
||||
} STableNamePair;
|
||||
} SRelElementPair;
|
||||
|
||||
typedef struct SRelationInfo {
|
||||
int32_t type; // nested query|table name list
|
||||
SArray *list; // SArray<STableNamePair>|SArray<SSqlNode*>
|
||||
SArray *list; // SArray<SRelElementPair>|SArray<SSqlNode*>
|
||||
} SRelationInfo;
|
||||
|
||||
typedef struct SCreatedTableInfo {
|
||||
|
@ -254,8 +259,9 @@ SArray *tVariantListInsert(SArray *pList, tVariant *pVar, uint8_t sortOrder, int
|
|||
SArray *tVariantListAppendToken(SArray *pList, SStrToken *pAliasToken, uint8_t sortOrder);
|
||||
|
||||
SRelationInfo *setTableNameList(SRelationInfo* pFromInfo, SStrToken *pName, SStrToken* pAlias);
|
||||
SRelationInfo *setSubquery(SRelationInfo* pFromInfo, SArray* pSqlNode);
|
||||
//SRelationInfo *setSubquery(SRelationInfo* pFromInfo, SRelElementPair* p);
|
||||
void *destroyRelationInfo(SRelationInfo* pFromInfo);
|
||||
SRelationInfo *addSubqueryElem(SRelationInfo* pRelationInfo, SArray* pSub, SStrToken* pAlias);
|
||||
|
||||
// sql expr leaf node
|
||||
tSqlExpr *tSqlExprCreateIdValue(SStrToken *pToken, int32_t optrType);
|
||||
|
|
|
@ -508,7 +508,13 @@ distinct(X) ::= . { X.n = 0;}
|
|||
%type from {SRelationInfo*}
|
||||
%destructor from {destroyRelationInfo($$);}
|
||||
from(A) ::= FROM tablelist(X). {A = X;}
|
||||
from(A) ::= FROM LP union(Y) RP. {A = setSubquery(NULL, Y);}
|
||||
from(A) ::= FROM sub(X). {A = X;}
|
||||
|
||||
%type sub {SRelationInfo*}
|
||||
%destructor sub {destroyRelationInfo($$);}
|
||||
sub(A) ::= LP union(Y) RP. {A = addSubqueryElem(NULL, Y, NULL);}
|
||||
sub(A) ::= LP union(Y) RP ids(Z). {A = addSubqueryElem(NULL, Y, &Z);}
|
||||
sub(A) ::= sub(X) COMMA LP union(Y) RP ids(Z).{A = addSubqueryElem(X, Y, &Z);}
|
||||
|
||||
%type tablelist {SRelationInfo*}
|
||||
%destructor tablelist {destroyRelationInfo($$);}
|
||||
|
|
|
@ -535,11 +535,11 @@ SArray *tVariantListInsert(SArray *pList, tVariant *pVar, uint8_t sortOrder, int
|
|||
SRelationInfo *setTableNameList(SRelationInfo* pRelationInfo, SStrToken *pName, SStrToken* pAlias) {
|
||||
if (pRelationInfo == NULL) {
|
||||
pRelationInfo = calloc(1, sizeof(SRelationInfo));
|
||||
pRelationInfo->list = taosArrayInit(4, sizeof(STableNamePair));
|
||||
pRelationInfo->list = taosArrayInit(4, sizeof(SRelElementPair));
|
||||
}
|
||||
|
||||
pRelationInfo->type = SQL_NODE_FROM_TABLELIST;
|
||||
STableNamePair p = {.name = *pName};
|
||||
SRelElementPair p = {.tableName = *pName};
|
||||
if (pAlias != NULL) {
|
||||
p.aliasName = *pAlias;
|
||||
} else {
|
||||
|
@ -550,17 +550,41 @@ SRelationInfo *setTableNameList(SRelationInfo* pRelationInfo, SStrToken *pName,
|
|||
return pRelationInfo;
|
||||
}
|
||||
|
||||
SRelationInfo* setSubquery(SRelationInfo* pRelationInfo, SArray* pList) {
|
||||
if (pRelationInfo == NULL) {
|
||||
pRelationInfo = calloc(1, sizeof(SRelationInfo));
|
||||
pRelationInfo->list = taosArrayInit(4, POINTER_BYTES);
|
||||
}
|
||||
//SRelationInfo* setSubquery(SRelationInfo* pRelationInfo, SArray* pList, SStrToken* pAlias) {
|
||||
// if (pRelationInfo == NULL) {
|
||||
// pRelationInfo = calloc(1, sizeof(SRelationInfo));
|
||||
// pRelationInfo->list = taosArrayInit(4, POINTER_BYTES);
|
||||
// }
|
||||
//
|
||||
// pRelationInfo->type = SQL_NODE_FROM_SUBQUERY;
|
||||
// SRelElementPair p = {.pSubquery = pList};
|
||||
// if (pAlias != NULL) {
|
||||
// p.aliasName = *pAlias;
|
||||
// } else {
|
||||
// TPARSER_SET_NONE_TOKEN(p.aliasName);
|
||||
// }
|
||||
//
|
||||
// taosArrayPush(pRelationInfo->list, &p);
|
||||
// return pRelationInfo;
|
||||
//}
|
||||
|
||||
pRelationInfo->type = SQL_NODE_FROM_SUBQUERY;
|
||||
taosArrayPush(pRelationInfo->list, &pList);
|
||||
|
||||
return pRelationInfo;
|
||||
}
|
||||
//SRelationInfo* setSubquery(SRelationInfo* pRelationInfo, SRelElementPair* p) {
|
||||
// if (pRelationInfo == NULL) {
|
||||
// pRelationInfo = calloc(1, sizeof(SRelationInfo));
|
||||
// pRelationInfo->list = taosArrayInit(4, POINTER_BYTES);
|
||||
// }
|
||||
//
|
||||
// pRelationInfo->type = SQL_NODE_FROM_SUBQUERY;
|
||||
// SRelElementPair elem = *p;
|
||||
//// if (pAlias != NULL) {
|
||||
//// p.aliasName = *pAlias;
|
||||
//// } else {
|
||||
//// TPARSER_SET_NONE_TOKEN(p.aliasName);
|
||||
//// }
|
||||
//
|
||||
// taosArrayPush(pRelationInfo->list, &p);
|
||||
// return pRelationInfo;
|
||||
//}
|
||||
|
||||
void* destroyRelationInfo(SRelationInfo* pRelationInfo) {
|
||||
if (pRelationInfo == NULL) {
|
||||
|
@ -582,6 +606,25 @@ void* destroyRelationInfo(SRelationInfo* pRelationInfo) {
|
|||
return NULL;
|
||||
}
|
||||
|
||||
SRelationInfo* addSubqueryElem(SRelationInfo* pRelationInfo, SArray* pSub, SStrToken* pAlias) {
|
||||
if (pRelationInfo == NULL) {
|
||||
pRelationInfo = calloc(1, sizeof(SRelationInfo));
|
||||
pRelationInfo->list = taosArrayInit(4, sizeof(SRelElementPair));
|
||||
}
|
||||
|
||||
pRelationInfo->type = SQL_NODE_FROM_SUBQUERY;
|
||||
|
||||
SRelElementPair p = {.pSubquery = pSub};
|
||||
if (pAlias != NULL) {
|
||||
p.aliasName = *pAlias;
|
||||
} else {
|
||||
TPARSER_SET_NONE_TOKEN(p.aliasName);
|
||||
}
|
||||
|
||||
taosArrayPush(pRelationInfo->list, &p);
|
||||
return pRelationInfo;
|
||||
}
|
||||
|
||||
|
||||
void tSetDbName(SStrToken *pCpxName, SStrToken *pDb) {
|
||||
pCpxName->type = pDb->type;
|
||||
|
|
1649
src/query/src/sql.c
1649
src/query/src/sql.c
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue