td-1245: update sql grammar to support offset
This commit is contained in:
parent
1487bc5870
commit
4456951e66
|
@ -228,10 +228,11 @@ typedef struct SQueryInfo {
|
||||||
// TODO refactor
|
// TODO refactor
|
||||||
char intervalTimeUnit;
|
char intervalTimeUnit;
|
||||||
char slidingTimeUnit;
|
char slidingTimeUnit;
|
||||||
|
char offsetTimeUnit;
|
||||||
STimeWindow window; // query time window
|
STimeWindow window; // query time window
|
||||||
int64_t intervalTime; // aggregation time window range
|
int64_t intervalTime; // aggregation time window range
|
||||||
int64_t slidingTime; // sliding window in mseconds
|
int64_t slidingTime; // sliding window in mseconds
|
||||||
int64_t intervalOffset;// start offset of each time window
|
int64_t offsetTime; // start offset of each time window
|
||||||
int32_t tz; // query client timezone
|
int32_t tz; // query client timezone
|
||||||
|
|
||||||
SSqlGroupbyExpr groupbyExpr; // group by tags info
|
SSqlGroupbyExpr groupbyExpr; // group by tags info
|
||||||
|
|
|
@ -81,6 +81,7 @@ static void setColumnOffsetValueInResultset(SQueryInfo* pQueryInfo);
|
||||||
static int32_t parseGroupbyClause(SQueryInfo* pQueryInfo, tVariantList* pList, SSqlCmd* pCmd);
|
static int32_t parseGroupbyClause(SQueryInfo* pQueryInfo, tVariantList* pList, SSqlCmd* pCmd);
|
||||||
|
|
||||||
static int32_t parseIntervalClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQuerySql);
|
static int32_t parseIntervalClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQuerySql);
|
||||||
|
static int32_t parseOffsetClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQuerySql);
|
||||||
static int32_t parseSlidingClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQuerySql);
|
static int32_t parseSlidingClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQuerySql);
|
||||||
|
|
||||||
static int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSQLExprItem* pItem);
|
static int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSQLExprItem* pItem);
|
||||||
|
@ -613,6 +614,10 @@ int32_t parseIntervalClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQ
|
||||||
|
|
||||||
// for top/bottom + interval query, we do not add additional timestamp column in the front
|
// for top/bottom + interval query, we do not add additional timestamp column in the front
|
||||||
if (isTopBottomQuery(pQueryInfo)) {
|
if (isTopBottomQuery(pQueryInfo)) {
|
||||||
|
if (parseOffsetClause(pCmd, pQueryInfo, pQuerySql) != TSDB_CODE_SUCCESS) {
|
||||||
|
return TSDB_CODE_TSC_INVALID_SQL;
|
||||||
|
}
|
||||||
|
|
||||||
if (parseSlidingClause(pCmd, pQueryInfo, pQuerySql) != TSDB_CODE_SUCCESS) {
|
if (parseSlidingClause(pCmd, pQueryInfo, pQuerySql) != TSDB_CODE_SUCCESS) {
|
||||||
return TSDB_CODE_TSC_INVALID_SQL;
|
return TSDB_CODE_TSC_INVALID_SQL;
|
||||||
}
|
}
|
||||||
|
@ -662,6 +667,10 @@ int32_t parseIntervalClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQ
|
||||||
SColumnIndex index = {tableIndex, PRIMARYKEY_TIMESTAMP_COL_INDEX};
|
SColumnIndex index = {tableIndex, PRIMARYKEY_TIMESTAMP_COL_INDEX};
|
||||||
tscAddSpecialColumnForSelect(pQueryInfo, 0, TSDB_FUNC_TS, &index, &s, TSDB_COL_NORMAL);
|
tscAddSpecialColumnForSelect(pQueryInfo, 0, TSDB_FUNC_TS, &index, &s, TSDB_COL_NORMAL);
|
||||||
|
|
||||||
|
if (parseOffsetClause(pCmd, pQueryInfo, pQuerySql) != TSDB_CODE_SUCCESS) {
|
||||||
|
return TSDB_CODE_TSC_INVALID_SQL;
|
||||||
|
}
|
||||||
|
|
||||||
if (parseSlidingClause(pCmd, pQueryInfo, pQuerySql) != TSDB_CODE_SUCCESS) {
|
if (parseSlidingClause(pCmd, pQueryInfo, pQuerySql) != TSDB_CODE_SUCCESS) {
|
||||||
return TSDB_CODE_TSC_INVALID_SQL;
|
return TSDB_CODE_TSC_INVALID_SQL;
|
||||||
}
|
}
|
||||||
|
@ -669,6 +678,39 @@ int32_t parseIntervalClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQ
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t parseOffsetClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQuerySql) {
|
||||||
|
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, 0);
|
||||||
|
STableComInfo tinfo = tscGetTableInfo(pTableMetaInfo->pTableMeta);
|
||||||
|
|
||||||
|
SStrToken* pOffset = &pQuerySql->offset;
|
||||||
|
if (pOffset->n == 0) {
|
||||||
|
pQueryInfo->offsetTimeUnit = pQueryInfo->offsetTimeUnit;
|
||||||
|
pQueryInfo->offsetTime = 0;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
getTimestampInUsFromStr(pOffset->z, pOffset->n, &pQueryInfo->offsetTime);
|
||||||
|
if (tinfo.precision == TSDB_TIME_PRECISION_MILLI) {
|
||||||
|
pQueryInfo->offsetTime /= 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (pQueryInfo->offsetTime < 0) {
|
||||||
|
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pQueryInfo->slidingTime >= pQueryInfo->intervalTime) {
|
||||||
|
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((pQueryInfo->intervalTime != 0) && (pQueryInfo->intervalTime/pQueryInfo->slidingTime > INTERVAL_SLIDING_FACTOR)) {
|
||||||
|
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg2);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t parseSlidingClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQuerySql) {
|
int32_t parseSlidingClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQuerySql) {
|
||||||
const char* msg0 = "sliding value too small";
|
const char* msg0 = "sliding value too small";
|
||||||
const char* msg1 = "sliding value no larger than the interval value";
|
const char* msg1 = "sliding value no larger than the interval value";
|
||||||
|
|
|
@ -461,10 +461,11 @@ typedef struct {
|
||||||
int16_t orderColId;
|
int16_t orderColId;
|
||||||
int16_t numOfCols; // the number of columns will be load from vnode
|
int16_t numOfCols; // the number of columns will be load from vnode
|
||||||
int64_t intervalTime; // time interval for aggregation, in million second
|
int64_t intervalTime; // time interval for aggregation, in million second
|
||||||
int64_t intervalOffset; // start offset for interval query
|
|
||||||
int64_t slidingTime; // value for sliding window
|
int64_t slidingTime; // value for sliding window
|
||||||
|
int64_t offsetTime; // start offset for interval query
|
||||||
char intervalTimeUnit;
|
char intervalTimeUnit;
|
||||||
char slidingTimeUnit; // time interval type, for revisement of interval(1d)
|
char slidingTimeUnit; // time interval type, for revisement of interval(1d)
|
||||||
|
char offsetTimeUnit;
|
||||||
uint16_t tagCondLen; // tag length in current query
|
uint16_t tagCondLen; // tag length in current query
|
||||||
int16_t numOfGroupCols; // num of group by columns
|
int16_t numOfGroupCols; // num of group by columns
|
||||||
int16_t orderByIdx;
|
int16_t orderByIdx;
|
||||||
|
|
|
@ -65,6 +65,11 @@ typedef struct tVariantList {
|
||||||
tVariantListItem *a; /* One entry for each expression */
|
tVariantListItem *a; /* One entry for each expression */
|
||||||
} tVariantList;
|
} tVariantList;
|
||||||
|
|
||||||
|
typedef struct SIntervalVal {
|
||||||
|
SStrToken interval;
|
||||||
|
SStrToken offset;
|
||||||
|
} SIntervalVal;
|
||||||
|
|
||||||
typedef struct SQuerySQL {
|
typedef struct SQuerySQL {
|
||||||
struct tSQLExprList *pSelection; // select clause
|
struct tSQLExprList *pSelection; // select clause
|
||||||
tVariantList * from; // from clause
|
tVariantList * from; // from clause
|
||||||
|
@ -72,6 +77,7 @@ typedef struct SQuerySQL {
|
||||||
tVariantList * pGroupby; // groupby clause, only for tags[optional]
|
tVariantList * pGroupby; // groupby clause, only for tags[optional]
|
||||||
tVariantList * pSortOrder; // orderby [optional]
|
tVariantList * pSortOrder; // orderby [optional]
|
||||||
SStrToken interval; // interval [optional]
|
SStrToken interval; // interval [optional]
|
||||||
|
SStrToken offset; // offset window [optional]
|
||||||
SStrToken sliding; // sliding window [optional]
|
SStrToken sliding; // sliding window [optional]
|
||||||
SLimitVal limit; // limit offset [optional]
|
SLimitVal limit; // limit offset [optional]
|
||||||
SLimitVal slimit; // group limit offset [optional]
|
SLimitVal slimit; // group limit offset [optional]
|
||||||
|
@ -259,7 +265,7 @@ tSQLExprList *tSQLExprListAppend(tSQLExprList *pList, tSQLExpr *pNode, SStrToken
|
||||||
void tSQLExprListDestroy(tSQLExprList *pList);
|
void tSQLExprListDestroy(tSQLExprList *pList);
|
||||||
|
|
||||||
SQuerySQL *tSetQuerySQLElems(SStrToken *pSelectToken, tSQLExprList *pSelection, tVariantList *pFrom, tSQLExpr *pWhere,
|
SQuerySQL *tSetQuerySQLElems(SStrToken *pSelectToken, tSQLExprList *pSelection, tVariantList *pFrom, tSQLExpr *pWhere,
|
||||||
tVariantList *pGroupby, tVariantList *pSortOrder, SStrToken *pInterval,
|
tVariantList *pGroupby, tVariantList *pSortOrder, SIntervalVal *pInterval,
|
||||||
SStrToken *pSliding, tVariantList *pFill, SLimitVal *pLimit, SLimitVal *pGLimit);
|
SStrToken *pSliding, tVariantList *pFill, SLimitVal *pLimit, SLimitVal *pGLimit);
|
||||||
|
|
||||||
SCreateTableSQL *tSetCreateSQLElems(tFieldList *pCols, tFieldList *pTags, SStrToken *pMetricName,
|
SCreateTableSQL *tSetCreateSQLElems(tFieldList *pCols, tFieldList *pTags, SStrToken *pMetricName,
|
||||||
|
|
|
@ -458,9 +458,10 @@ tablelist(A) ::= tablelist(Y) COMMA ids(X) cpxName(Z) ids(F). {
|
||||||
%type tmvar {SStrToken}
|
%type tmvar {SStrToken}
|
||||||
tmvar(A) ::= VARIABLE(X). {A = X;}
|
tmvar(A) ::= VARIABLE(X). {A = X;}
|
||||||
|
|
||||||
%type interval_opt {SStrToken}
|
%type interval_opt {SIntervalVal}
|
||||||
interval_opt(N) ::= INTERVAL LP tmvar(E) RP. {N = E; }
|
interval_opt(N) ::= INTERVAL LP tmvar(E) RP. {N.interval = E; N.offset.n = 0; N.offset.z = NULL; N.offset.type = 0;}
|
||||||
interval_opt(N) ::= . {N.n = 0; N.z = NULL; N.type = 0; }
|
interval_opt(N) ::= INTERVAL LP tmvar(E) COMMA tmvar(O) RP. {N.interval = E; N.offset = O;}
|
||||||
|
interval_opt(N) ::= . {memset(&N, 0, sizeof(N));}
|
||||||
|
|
||||||
%type fill_opt {tVariantList*}
|
%type fill_opt {tVariantList*}
|
||||||
%destructor fill_opt {tVariantListDestroy($$);}
|
%destructor fill_opt {tVariantListDestroy($$);}
|
||||||
|
|
|
@ -535,7 +535,7 @@ void tSQLSetColumnType(TAOS_FIELD *pField, SStrToken *type) {
|
||||||
* extract the select info out of sql string
|
* extract the select info out of sql string
|
||||||
*/
|
*/
|
||||||
SQuerySQL *tSetQuerySQLElems(SStrToken *pSelectToken, tSQLExprList *pSelection, tVariantList *pFrom, tSQLExpr *pWhere,
|
SQuerySQL *tSetQuerySQLElems(SStrToken *pSelectToken, tSQLExprList *pSelection, tVariantList *pFrom, tSQLExpr *pWhere,
|
||||||
tVariantList *pGroupby, tVariantList *pSortOrder, SStrToken *pInterval,
|
tVariantList *pGroupby, tVariantList *pSortOrder, SIntervalVal *pInterval,
|
||||||
SStrToken *pSliding, tVariantList *pFill, SLimitVal *pLimit, SLimitVal *pGLimit) {
|
SStrToken *pSliding, tVariantList *pFill, SLimitVal *pLimit, SLimitVal *pGLimit) {
|
||||||
assert(pSelection != NULL);
|
assert(pSelection != NULL);
|
||||||
|
|
||||||
|
@ -558,7 +558,8 @@ SQuerySQL *tSetQuerySQLElems(SStrToken *pSelectToken, tSQLExprList *pSelection,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pInterval != NULL) {
|
if (pInterval != NULL) {
|
||||||
pQuery->interval = *pInterval;
|
pQuery->interval = pInterval->interval;
|
||||||
|
pQuery->offset = pInterval->offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pSliding != NULL) {
|
if (pSliding != NULL) {
|
||||||
|
|
2261
src/query/src/sql.c
2261
src/query/src/sql.c
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue