Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
慢慢CG
TDengine
提交
18637381
T
TDengine
项目概览
慢慢CG
/
TDengine
与 Fork 源项目一致
Fork自
taosdata / TDengine
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
18637381
编写于
8月 26, 2020
作者:
H
Haojun Liao
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[td-1151]
上级
73fcf1e1
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
138 addition
and
66 deletion
+138
-66
src/client/src/tscSQLParser.c
src/client/src/tscSQLParser.c
+62
-42
src/common/src/tname.c
src/common/src/tname.c
+4
-2
src/query/src/qExecutor.c
src/query/src/qExecutor.c
+13
-2
src/query/src/qParserImpl.c
src/query/src/qParserImpl.c
+2
-0
tests/script/general/parser/constCol.sim
tests/script/general/parser/constCol.sim
+57
-20
未找到文件。
src/client/src/tscSQLParser.c
浏览文件 @
18637381
...
...
@@ -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.
...
...
src/common/src/tname.c
浏览文件 @
18637381
...
...
@@ -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
;
...
...
src/query/src/qExecutor.c
浏览文件 @
18637381
...
...
@@ -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
;
...
...
src/query/src/qParserImpl.c
浏览文件 @
18637381
...
...
@@ -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
;
}
...
...
tests/script/general/parser/constCol.sim
浏览文件 @
18637381
...
...
@@ -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 != 1
3
.000000000 then
print expect 1
3
.000000000 actual:$data00
if $data00 != 1
5
.000000000 then
print expect 1
5
.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
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录