[td-1151]
This commit is contained in:
parent
73fcf1e1ce
commit
18637381a4
|
@ -65,11 +65,11 @@ static int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int3
|
|||
static int32_t insertResultField(SQueryInfo* pQueryInfo, int32_t outputIndex, SColumnList* pIdList, int16_t bytes,
|
||||
int8_t type, char* fieldName, SSqlExpr* pSqlExpr);
|
||||
static int32_t changeFunctionID(int32_t optr, int16_t* functionId);
|
||||
static int32_t parseSelectClause(SSqlCmd* pCmd, int32_t clauseIndex, tSQLExprList* pSelection, bool isSTable);
|
||||
static int32_t parseSelectClause(SSqlCmd* pCmd, int32_t clauseIndex, tSQLExprList* pSelection, bool isSTable, bool joinQuery);
|
||||
|
||||
static bool validateIpAddress(const char* ip, size_t size);
|
||||
static bool hasUnsupportFunctionsForSTableQuery(SSqlCmd* pCmd, SQueryInfo* pQueryInfo);
|
||||
static bool functionCompatibleCheck(SQueryInfo* pQueryInfo);
|
||||
static bool functionCompatibleCheck(SQueryInfo* pQueryInfo, bool joinQuery);
|
||||
static void setColumnOffsetValueInResultset(SQueryInfo* pQueryInfo);
|
||||
|
||||
static int32_t parseGroupbyClause(SQueryInfo* pQueryInfo, tVariantList* pList, SSqlCmd* pCmd);
|
||||
|
@ -1176,11 +1176,15 @@ static int32_t handleArithmeticExpr(SSqlCmd* pCmd, int32_t clauseIndex, int32_t
|
|||
columnList.num = 0;
|
||||
columnList.ids[0] = (SColumnIndex) {0, 0};
|
||||
|
||||
char* name = (pItem->aliasName != NULL)? pItem->aliasName:pItem->pNode->token.z;
|
||||
size_t len = MIN(sizeof(pItem->aliasName), pItem->pNode->token.n + 1);
|
||||
tstrncpy(pItem->aliasName, name, len);
|
||||
char aliasName[TSDB_COL_NAME_LEN] = {0};
|
||||
if (pItem->aliasName != NULL) {
|
||||
tstrncpy(aliasName, pItem->aliasName, TSDB_COL_NAME_LEN);
|
||||
} else {
|
||||
int32_t nameLen = MIN(TSDB_COL_NAME_LEN, pItem->pNode->token.n + 1);
|
||||
tstrncpy(aliasName, pItem->pNode->token.z, nameLen);
|
||||
}
|
||||
|
||||
insertResultField(pQueryInfo, exprIndex, &columnList, sizeof(double), TSDB_DATA_TYPE_DOUBLE, pItem->aliasName, NULL);
|
||||
insertResultField(pQueryInfo, exprIndex, &columnList, sizeof(double), TSDB_DATA_TYPE_DOUBLE, aliasName, NULL);
|
||||
|
||||
int32_t slot = tscNumOfFields(pQueryInfo) - 1;
|
||||
SFieldSupInfo* pInfo = tscFieldInfoGetSupp(&pQueryInfo->fieldsInfo, slot);
|
||||
|
@ -1211,7 +1215,30 @@ static void tscInsertPrimaryTSSourceColumn(SQueryInfo* pQueryInfo, SColumnIndex*
|
|||
tscColumnListInsert(pQueryInfo->colList, &tsCol);
|
||||
}
|
||||
|
||||
int32_t parseSelectClause(SSqlCmd* pCmd, int32_t clauseIndex, tSQLExprList* pSelection, bool isSTable) {
|
||||
static void addProjectQueryCol(SQueryInfo* pQueryInfo, int32_t startPos, SColumnIndex* pIndex, tSQLExprItem* pItem) {
|
||||
SSqlExpr* pExpr = doAddProjectCol(pQueryInfo, startPos, pIndex->columnIndex, pIndex->tableIndex);
|
||||
|
||||
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, pIndex->tableIndex);
|
||||
STableMeta* pTableMeta = pTableMetaInfo->pTableMeta;
|
||||
|
||||
SSchema* pSchema = tscGetTableColumnSchema(pTableMeta, pIndex->columnIndex);
|
||||
|
||||
char* colName = (pItem->aliasName == NULL) ? pSchema->name : pItem->aliasName;
|
||||
tstrncpy(pExpr->aliasName, colName, sizeof(pExpr->aliasName));
|
||||
|
||||
SColumnList ids = {0};
|
||||
ids.num = 1;
|
||||
ids.ids[0] = *pIndex;
|
||||
|
||||
if (pIndex->columnIndex == TSDB_TBNAME_COLUMN_INDEX || pIndex->columnIndex == TSDB_UD_COLUMN_INDEX ||
|
||||
pIndex->columnIndex >= tscGetNumOfColumns(pTableMeta)) {
|
||||
ids.num = 0;
|
||||
}
|
||||
|
||||
insertResultField(pQueryInfo, startPos, &ids, pExpr->resBytes, (int8_t)pExpr->resType, pExpr->aliasName, pExpr);
|
||||
}
|
||||
|
||||
int32_t parseSelectClause(SSqlCmd* pCmd, int32_t clauseIndex, tSQLExprList* pSelection, bool isSTable, bool joinQuery) {
|
||||
assert(pSelection != NULL && pCmd != NULL);
|
||||
|
||||
const char* msg2 = "functions can not be mixed up";
|
||||
|
@ -1252,12 +1279,7 @@ int32_t parseSelectClause(SSqlCmd* pCmd, int32_t clauseIndex, tSQLExprList* pSel
|
|||
if (code != TSDB_CODE_SUCCESS) {
|
||||
return code;
|
||||
}
|
||||
|
||||
} else {
|
||||
/*
|
||||
* not support such expression
|
||||
* e.g., select 12+5 from table_name
|
||||
*/
|
||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg3);
|
||||
}
|
||||
|
||||
|
@ -1270,10 +1292,22 @@ int32_t parseSelectClause(SSqlCmd* pCmd, int32_t clauseIndex, tSQLExprList* pSel
|
|||
size_t numOfSrcCols = taosArrayGetSize(pQueryInfo->colList);
|
||||
if (numOfSrcCols <= 0 && !tscQueryTags(pQueryInfo)) {
|
||||
SColumnIndex index = {0};
|
||||
tscInsertPrimaryTSSourceColumn(pQueryInfo, &index);
|
||||
|
||||
// set the constant column value always attached to first table.
|
||||
STableMetaInfo* pTableMetaInfo = tscGetTableMetaInfoFromCmd(pCmd, clauseIndex, 0);
|
||||
SSchema* pSchema = tscGetTableColumnSchema(pTableMetaInfo->pTableMeta, PRIMARYKEY_TIMESTAMP_COL_INDEX);
|
||||
|
||||
// add the timestamp column into the output columns
|
||||
int32_t numOfCols = tscSqlExprNumOfExprs(pQueryInfo);
|
||||
tscAddSpecialColumnForSelect(pQueryInfo, numOfCols, TSDB_FUNC_PRJ, &index, pSchema, TSDB_COL_NORMAL);
|
||||
|
||||
SFieldSupInfo* pSupInfo = tscFieldInfoGetSupp(&pQueryInfo->fieldsInfo, numOfCols);
|
||||
pSupInfo->visible = false;
|
||||
|
||||
pQueryInfo->type |= TSDB_QUERY_TYPE_PROJECTION_QUERY;
|
||||
}
|
||||
|
||||
if (!functionCompatibleCheck(pQueryInfo)) {
|
||||
if (!functionCompatibleCheck(pQueryInfo, joinQuery)) {
|
||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg2);
|
||||
}
|
||||
|
||||
|
@ -1336,29 +1370,6 @@ SSqlExpr* doAddProjectCol(SQueryInfo* pQueryInfo, int32_t outputIndex, int32_t c
|
|||
pSchema->bytes, functionId == TSDB_FUNC_TAGPRJ);
|
||||
}
|
||||
|
||||
static void addProjectQueryCol(SQueryInfo* pQueryInfo, int32_t startPos, SColumnIndex* pIndex, tSQLExprItem* pItem) {
|
||||
SSqlExpr* pExpr = doAddProjectCol(pQueryInfo, startPos, pIndex->columnIndex, pIndex->tableIndex);
|
||||
|
||||
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, pIndex->tableIndex);
|
||||
STableMeta* pTableMeta = pTableMetaInfo->pTableMeta;
|
||||
|
||||
SSchema* pSchema = tscGetTableColumnSchema(pTableMeta, pIndex->columnIndex);
|
||||
|
||||
char* colName = (pItem->aliasName == NULL) ? pSchema->name : pItem->aliasName;
|
||||
tstrncpy(pExpr->aliasName, colName, sizeof(pExpr->aliasName));
|
||||
|
||||
SColumnList ids = {0};
|
||||
ids.num = 1;
|
||||
ids.ids[0] = *pIndex;
|
||||
|
||||
if (pIndex->columnIndex == TSDB_TBNAME_COLUMN_INDEX || pIndex->columnIndex == TSDB_UD_COLUMN_INDEX ||
|
||||
pIndex->columnIndex >= tscGetNumOfColumns(pTableMeta)) {
|
||||
ids.num = 0;
|
||||
}
|
||||
|
||||
insertResultField(pQueryInfo, startPos, &ids, pExpr->resBytes, (int8_t)pExpr->resType, pExpr->aliasName, pExpr);
|
||||
}
|
||||
|
||||
SSqlExpr* tscAddSpecialColumnForSelect(SQueryInfo* pQueryInfo, int32_t outputColIndex, int16_t functionId,
|
||||
SColumnIndex* pIndex, SSchema* pColSchema, int16_t flag) {
|
||||
SSqlExpr* pExpr = tscSqlExprInsert(pQueryInfo, outputColIndex, functionId, pIndex, pColSchema->type,
|
||||
|
@ -1837,10 +1848,11 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
|||
|
||||
for (int32_t i = 0; i < tscGetNumOfColumns(pTableMetaInfo->pTableMeta); ++i) {
|
||||
SColumnIndex index = {.tableIndex = j, .columnIndex = i};
|
||||
if (setExprInfoForFunctions(pCmd, pQueryInfo, pSchema, functionID, pItem->aliasName, colIndex + i + j, &index) !=
|
||||
0) {
|
||||
if (setExprInfoForFunctions(pCmd, pQueryInfo, pSchema, functionID, pItem->aliasName, colIndex, &index) != 0) {
|
||||
return TSDB_CODE_TSC_INVALID_SQL;
|
||||
}
|
||||
|
||||
colIndex++;
|
||||
}
|
||||
|
||||
numOfFields += tscGetNumOfColumns(pTableMetaInfo->pTableMeta);
|
||||
|
@ -2513,7 +2525,7 @@ bool hasUnsupportFunctionsForSTableQuery(SSqlCmd* pCmd, SQueryInfo* pQueryInfo)
|
|||
return false;
|
||||
}
|
||||
|
||||
static bool functionCompatibleCheck(SQueryInfo* pQueryInfo) {
|
||||
static bool functionCompatibleCheck(SQueryInfo* pQueryInfo, bool joinQuery) {
|
||||
int32_t startIdx = 0;
|
||||
|
||||
SSqlExpr* pExpr = tscSqlExprGet(pQueryInfo, startIdx);
|
||||
|
@ -2545,6 +2557,10 @@ static bool functionCompatibleCheck(SQueryInfo* pQueryInfo) {
|
|||
if (functionCompatList[functionId] != factor) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (functionId == TSDB_FUNC_LAST_ROW && joinQuery) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -5863,7 +5879,7 @@ int32_t doCheckForStream(SSqlObj* pSql, SSqlInfo* pInfo) {
|
|||
}
|
||||
|
||||
bool isSTable = UTIL_TABLE_IS_SUPER_TABLE(pTableMetaInfo);
|
||||
if (parseSelectClause(&pSql->cmd, 0, pQuerySql->pSelection, isSTable) != TSDB_CODE_SUCCESS) {
|
||||
if (parseSelectClause(&pSql->cmd, 0, pQuerySql->pSelection, isSTable, false) != TSDB_CODE_SUCCESS) {
|
||||
return TSDB_CODE_TSC_INVALID_SQL;
|
||||
}
|
||||
|
||||
|
@ -6046,7 +6062,8 @@ int32_t doCheckForQuery(SSqlObj* pSql, SQuerySQL* pQuerySql, int32_t index) {
|
|||
return TSDB_CODE_TSC_INVALID_SQL;
|
||||
}
|
||||
|
||||
if (parseSelectClause(pCmd, index, pQuerySql->pSelection, isSTable) != TSDB_CODE_SUCCESS) {
|
||||
int32_t joinQuery = (pQuerySql->from != NULL && pQuerySql->from->nExpr > 2);
|
||||
if (parseSelectClause(pCmd, index, pQuerySql->pSelection, isSTable, joinQuery) != TSDB_CODE_SUCCESS) {
|
||||
return TSDB_CODE_TSC_INVALID_SQL;
|
||||
}
|
||||
|
||||
|
@ -6080,6 +6097,9 @@ int32_t doCheckForQuery(SSqlObj* pSql, SQuerySQL* pQuerySql, int32_t index) {
|
|||
}
|
||||
} else { // set the time rang
|
||||
pQueryInfo->window = TSWINDOW_INITIALIZER;
|
||||
if (pQuerySql->from->nExpr > 2) { // it is a join query, no wher clause is not allowed.
|
||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), "condition missing for join query ");
|
||||
}
|
||||
}
|
||||
|
||||
// user does not specified the query time window, twa is not allowed in such case.
|
||||
|
|
|
@ -62,8 +62,10 @@ SSchema tGetUserSpecifiedColumnSchema(tVariant* pVal, SStrToken* exprStr, const
|
|||
if (name != NULL) {
|
||||
tstrncpy(s.name, name, sizeof(s.name));
|
||||
} else {
|
||||
size_t len = MIN(sizeof(s.name), exprStr->n + 1);
|
||||
tstrncpy(s.name, exprStr->z, len);
|
||||
size_t len = strdequote(exprStr->z);
|
||||
size_t tlen = MIN(sizeof(s.name), len + 1);
|
||||
|
||||
tstrncpy(s.name, exprStr->z, tlen);
|
||||
}
|
||||
|
||||
return s;
|
||||
|
|
|
@ -1770,13 +1770,20 @@ static bool needReverseScan(SQuery *pQuery) {
|
|||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* The following 4 kinds of query are treated as the tags query
|
||||
* tagprj, tid_tag query, count(tbname), 'abc' (user defined constant value column) query
|
||||
*/
|
||||
static bool onlyQueryTags(SQuery* pQuery) {
|
||||
for(int32_t i = 0; i < pQuery->numOfOutput; ++i) {
|
||||
SExprInfo* pExprInfo = &pQuery->pSelectExpr[i];
|
||||
|
||||
int32_t functionId = pExprInfo->base.functionId;
|
||||
if (functionId != TSDB_FUNC_TAGPRJ && functionId != TSDB_FUNC_TID_TAG &&
|
||||
(!(functionId == TSDB_FUNC_COUNT && pExprInfo->base.colInfo.colId == TSDB_TBNAME_COLUMN_INDEX))) {
|
||||
|
||||
if (functionId != TSDB_FUNC_TAGPRJ &&
|
||||
functionId != TSDB_FUNC_TID_TAG &&
|
||||
(!(functionId == TSDB_FUNC_COUNT && pExprInfo->base.colInfo.colId == TSDB_TBNAME_COLUMN_INDEX)) &&
|
||||
(!(functionId == TSDB_FUNC_PRJ && pExprInfo->base.colInfo.flag == TSDB_COL_UDC))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -6835,6 +6842,10 @@ static void buildTagQueryResult(SQInfo* pQInfo) {
|
|||
char *data = NULL, *dst = NULL;
|
||||
int16_t type = 0, bytes = 0;
|
||||
for(int32_t j = 0; j < pQuery->numOfOutput; ++j) {
|
||||
// not assign value in case of user defined constant output column
|
||||
if (pExprInfo[j].base.colInfo.flag == TSDB_COL_UDC) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (pExprInfo[j].base.colInfo.colId == TSDB_TBNAME_COLUMN_INDEX) {
|
||||
bytes = tbnameSchema.bytes;
|
||||
|
|
|
@ -167,6 +167,8 @@ tSQLExpr *tSQLExprCreateFunction(tSQLExprList *pList, SStrToken *pFuncToken, SSt
|
|||
|
||||
pExpr->operand.n = len; // raw field name
|
||||
pExpr->operand.type = pFuncToken->type;
|
||||
|
||||
pExpr->token = pExpr->operand;
|
||||
return pExpr;
|
||||
}
|
||||
|
||||
|
|
|
@ -34,6 +34,9 @@ sql create table t1 using st1 tags(1);
|
|||
sql create table t2 using st2 tags(1);
|
||||
|
||||
sql insert into t1 values(1575880055000, 1);
|
||||
sql insert into t1 values(1575880059000, 1);
|
||||
sql insert into t1 values(1575880069000, 1);
|
||||
|
||||
sql insert into t2 values(1575880055000, 2);
|
||||
|
||||
sql select st1.ts, st1.f1, st2.f2 from db.st1, db.st2 where st1.t1=st2.t2 and st1.ts=st2.ts
|
||||
|
@ -42,7 +45,7 @@ system_content curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl
|
|||
|
||||
print ==============select with user-defined columns
|
||||
sql select 'abc' as f, ts,f1 from t1
|
||||
if $rows != 1 then
|
||||
if $rows != 3 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
|
@ -59,7 +62,7 @@ if $data02 != 1 then
|
|||
endi
|
||||
|
||||
sql select 'abc', ts, f1 from t1
|
||||
if $rows != 1 then
|
||||
if $rows != 3 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
|
@ -71,8 +74,12 @@ if $data02 != 1 then
|
|||
return -1
|
||||
endi
|
||||
|
||||
if $data10 != @abc@ then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select 'abc' from t1
|
||||
if $rows != 1 then
|
||||
if $rows != 3 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
|
@ -81,7 +88,7 @@ if $data00 != @abc@ then
|
|||
endi
|
||||
|
||||
sql select 'abc' as f1 from t1
|
||||
if $rows != 1 then
|
||||
if $rows != 3 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
|
@ -90,7 +97,7 @@ if $data00 != @abc@ then
|
|||
endi
|
||||
|
||||
sql select 1 from t1
|
||||
if $rows != 1 then
|
||||
if $rows != 3 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
|
@ -98,8 +105,16 @@ if $data00 != 1 then
|
|||
return -1
|
||||
endi
|
||||
|
||||
if $data10 != 1 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
if $data20 != 1 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select 1 as f1 from t1
|
||||
if $rows != 1 then
|
||||
if $rows != 3 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
|
@ -108,7 +123,7 @@ if $data00 != 1 then
|
|||
endi
|
||||
|
||||
sql select 1 as f, f1 from t1
|
||||
if $rows != 1 then
|
||||
if $rows != 3 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
|
@ -121,7 +136,7 @@ if $data01 != 1 then
|
|||
endi
|
||||
|
||||
sql select 1.123 as f, f1 from t1
|
||||
if $rows != 1 then
|
||||
if $rows != 3 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
|
@ -130,8 +145,13 @@ if $data00 != 1.123000000 then
|
|||
return -1
|
||||
endi
|
||||
|
||||
if $data10 != 1.123000000 then
|
||||
print expect 1.123000000 , actual:$data10
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select 1, f1 from t1
|
||||
if $rows != 1 then
|
||||
if $rows != 3 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
|
@ -143,8 +163,12 @@ if $data01 != 1 then
|
|||
return -1
|
||||
endi
|
||||
|
||||
if $data10 != 1 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select 1.2391, f1 from t1
|
||||
if $rows != 1 then
|
||||
if $rows != 3 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
|
@ -153,6 +177,11 @@ if $data00 != 1.239100000 then
|
|||
return -1
|
||||
endi
|
||||
|
||||
if $data10 != 1.239100000 then
|
||||
print expect 1.239100000 actual: $data00
|
||||
return -1
|
||||
endi
|
||||
|
||||
if $data01 != 1 then
|
||||
return -1
|
||||
endi
|
||||
|
@ -167,7 +196,7 @@ if $data00 != 1 then
|
|||
return -1
|
||||
endi
|
||||
|
||||
if $data01 != 1 then
|
||||
if $data01 != 3 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
|
@ -180,7 +209,7 @@ if $data00 != 1 then
|
|||
return -1
|
||||
endi
|
||||
|
||||
if $data01 != 1 then
|
||||
if $data01 != 3 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
|
@ -201,8 +230,8 @@ if $data02 != 3 then
|
|||
return -1
|
||||
endi
|
||||
|
||||
if $data03 != 99.000000000 then
|
||||
print expect 99.000000000, actual:$data03
|
||||
if $data03 != 297.000000000 then
|
||||
print expect 297.000000000, actual:$data03
|
||||
return -1
|
||||
endi
|
||||
|
||||
|
@ -211,8 +240,8 @@ if $rows != 1 then
|
|||
return -1
|
||||
endi
|
||||
|
||||
if $data00 != 13.000000000 then
|
||||
print expect 13.000000000 actual:$data00
|
||||
if $data00 != 15.000000000 then
|
||||
print expect 15.000000000 actual:$data00
|
||||
return -1
|
||||
endi
|
||||
|
||||
|
@ -225,7 +254,7 @@ if $data02 != 2 then
|
|||
endi
|
||||
|
||||
sql select 1.2987, f1, 'k' from t1 where f1=1
|
||||
if $rows != 1 then
|
||||
if $rows != 3 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
|
@ -244,7 +273,7 @@ endi
|
|||
|
||||
print ====================user-defined columns with union
|
||||
sql select f1, 'f1' from t1 union all select f1, 'f1' from t1;
|
||||
if $rows != 2 then
|
||||
if $rows != 6 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
|
@ -294,7 +323,7 @@ endi
|
|||
|
||||
print ======================udc with interval
|
||||
sql select count(*), 'uuu' from t1 interval(1s) order by ts desc;
|
||||
if $rows != 1 then
|
||||
if $rows != 3 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
|
@ -304,9 +333,17 @@ if $rows != 1 then
|
|||
return -1
|
||||
endi
|
||||
|
||||
if $data01 != @abc@ then
|
||||
return -1
|
||||
endi
|
||||
|
||||
if $data02 != @t1@ then
|
||||
return -1
|
||||
endi
|
||||
|
||||
print ======================udc with arithmetic
|
||||
sql select 1+1 from t1
|
||||
if $rows != 1 then
|
||||
if $rows != 3 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
|
|
Loading…
Reference in New Issue