未验证 提交 4351c4c8 编写于 作者: S shenglian-zhou 提交者: GitHub

Merge pull request #9813 from taosdata/fix/TD-12945

[TD-12945]<fix>(query): taos shell crash when constant comparison cause crash
...@@ -2431,7 +2431,7 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t ...@@ -2431,7 +2431,7 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t
if (pTableMeta->tableType != TSDB_TEMP_TABLE) { if (pTableMeta->tableType != TSDB_TEMP_TABLE) {
tscInsertPrimaryTsSourceColumn(pQueryInfo, pTableMeta->id.uid); tscInsertPrimaryTsSourceColumn(pQueryInfo, pTableMeta->id.uid);
} }
} else if (tokenId == TK_STRING || tokenId == TK_INTEGER || tokenId == TK_FLOAT) { // simple column projection query } else if (tokenId == TK_STRING || tokenId == TK_INTEGER || tokenId == TK_FLOAT || tokenId == TK_BOOL) { // simple column projection query
SColumnIndex index = COLUMN_INDEX_INITIALIZER; SColumnIndex index = COLUMN_INDEX_INITIALIZER;
// user-specified constant value as a new result column // user-specified constant value as a new result column
...@@ -4659,6 +4659,7 @@ static int32_t validateSQLExprItemArithmeticExpr(SSqlCmd* pCmd, tSqlExpr* pExpr, ...@@ -4659,6 +4659,7 @@ static int32_t validateSQLExprItemArithmeticExpr(SSqlCmd* pCmd, tSqlExpr* pExpr,
int32_t rightType = SQLEXPR_TYPE_UNASSIGNED; int32_t rightType = SQLEXPR_TYPE_UNASSIGNED;
const char* msg1 = "arithmetic expression composed with columns from different tables"; const char* msg1 = "arithmetic expression composed with columns from different tables";
const char* msg2 = "arithmetic expression composed with functions/columns of different types"; const char* msg2 = "arithmetic expression composed with functions/columns of different types";
const char* msg3 = "comparison/logical expression involving string operands is not supported";
int32_t leftHeight = 0; int32_t leftHeight = 0;
int32_t ret = validateSQLExprItem(pCmd, pExpr->pLeft, pQueryInfo, pList, &leftType, &uidLeft, &leftHeight); int32_t ret = validateSQLExprItem(pCmd, pExpr->pLeft, pQueryInfo, pList, &leftType, &uidLeft, &leftHeight);
if (ret != TSDB_CODE_SUCCESS) { if (ret != TSDB_CODE_SUCCESS) {
...@@ -4691,6 +4692,17 @@ static int32_t validateSQLExprItemArithmeticExpr(SSqlCmd* pCmd, tSqlExpr* pExpr, ...@@ -4691,6 +4692,17 @@ static int32_t validateSQLExprItemArithmeticExpr(SSqlCmd* pCmd, tSqlExpr* pExpr,
} else if (leftType == SQLEXPR_TYPE_SCALAR || rightType == SQLEXPR_TYPE_SCALAR){ } else if (leftType == SQLEXPR_TYPE_SCALAR || rightType == SQLEXPR_TYPE_SCALAR){
*type = SQLEXPR_TYPE_SCALAR; *type = SQLEXPR_TYPE_SCALAR;
} }
// comparison/logical operations
if (pExpr->tokenId == TK_EQ || pExpr->tokenId == TK_NE ||
pExpr->tokenId == TK_GT || pExpr->tokenId == TK_GE ||
pExpr->tokenId == TK_LT || pExpr->tokenId == TK_LE ||
pExpr->tokenId == TK_AND || pExpr->tokenId == TK_OR) {
if ((leftType == SQLEXPR_TYPE_VALUE && pExpr->pLeft->tokenId == TK_STRING) ||
(rightType == SQLEXPR_TYPE_VALUE && pExpr->pRight->tokenId == TK_STRING)) {
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg3);
}
}
} }
return TSDB_CODE_SUCCESS; return TSDB_CODE_SUCCESS;
} }
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
#include "tcompare.h" #include "tcompare.h"
#include "texpr.h" #include "texpr.h"
//GET_TYPED_DATA(v, double, _right_type, (char *)&((right)[i])); //GET_TYPED_DATA(v, double, _right_type, (char *)&((right)[i]));
void calc_i32_i32_add(void *left, void *right, int32_t numLeft, int32_t numRight, void *output, int32_t order) { void calc_i32_i32_add(void *left, void *right, int32_t numLeft, int32_t numRight, void *output, int32_t order) {
int32_t *pLeft = (int32_t *)left; int32_t *pLeft = (int32_t *)left;
...@@ -183,215 +183,219 @@ _arithmetic_getVectorValueAddr_fn_t getVectorValueAddrFn(int32_t srcType) { ...@@ -183,215 +183,219 @@ _arithmetic_getVectorValueAddr_fn_t getVectorValueAddrFn(int32_t srcType) {
} }
void vectorAdd(void *left, int32_t len1, int32_t _left_type, void *right, int32_t len2, int32_t _right_type, void *out, int32_t _ord) { void vectorAdd(void *left, int32_t len1, int32_t _left_type, void *right, int32_t len2, int32_t _right_type, void *out, int32_t _ord) {
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : MAX(len1, len2) - 1; int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : MAX(len1, len2) - 1;
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1; int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
double *output=(double*)out; double *output=(double*)out;
_arithmetic_getVectorValueAddr_fn_t getVectorValueAddrFnLeft = getVectorValueAddrFn(_left_type); _arithmetic_getVectorValueAddr_fn_t getVectorValueAddrFnLeft = getVectorValueAddrFn(_left_type);
_arithmetic_getVectorValueAddr_fn_t getVectorValueAddrFnRight = getVectorValueAddrFn(_right_type); _arithmetic_getVectorValueAddr_fn_t getVectorValueAddrFnRight = getVectorValueAddrFn(_right_type);
_arithmetic_getVectorDoubleValue_fn_t getVectorDoubleValueFnLeft = getVectorDoubleValueFn(_left_type); _arithmetic_getVectorDoubleValue_fn_t getVectorDoubleValueFnLeft = getVectorDoubleValueFn(_left_type);
_arithmetic_getVectorDoubleValue_fn_t getVectorDoubleValueFnRight = getVectorDoubleValueFn(_right_type); _arithmetic_getVectorDoubleValue_fn_t getVectorDoubleValueFnRight = getVectorDoubleValueFn(_right_type);
if ((len1) == (len2)) { if ((len1) == (len2)) {
for (; i < (len2) && i >= 0; i += step, output += 1) { for (; i < (len2) && i >= 0; i += step, output += 1) {
if (isNull(getVectorValueAddrFnLeft(left,i), _left_type) || isNull(getVectorValueAddrFnRight(right,i), _right_type)) { if (isNull(getVectorValueAddrFnLeft(left,i), _left_type) || isNull(getVectorValueAddrFnRight(right,i), _right_type)) {
SET_DOUBLE_NULL(output); SET_DOUBLE_NULL(output);
continue; continue;
} }
SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(left,i) + getVectorDoubleValueFnRight(right,i)); SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(left,i) + getVectorDoubleValueFnRight(right,i));
} }
} else if ((len1) == 1) { } else if ((len1) == 1) {
for (; i >= 0 && i < (len2); i += step, output += 1) { for (; i >= 0 && i < (len2); i += step, output += 1) {
if (isNull(getVectorValueAddrFnLeft(left,0), _left_type) || isNull(getVectorValueAddrFnRight(right,i), _right_type)) { if (isNull(getVectorValueAddrFnLeft(left,0), _left_type) || isNull(getVectorValueAddrFnRight(right,i), _right_type)) {
SET_DOUBLE_NULL(output); SET_DOUBLE_NULL(output);
continue; continue;
} }
SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(left,0) + getVectorDoubleValueFnRight(right,i)); SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(left,0) + getVectorDoubleValueFnRight(right,i));
} }
} else if ((len2) == 1) { } else if ((len2) == 1) {
for (; i >= 0 && i < (len1); i += step, output += 1) { for (; i >= 0 && i < (len1); i += step, output += 1) {
if (isNull(getVectorValueAddrFnLeft(left,i), _left_type) || isNull(getVectorValueAddrFnRight(right,0), _right_type)) { if (isNull(getVectorValueAddrFnLeft(left,i), _left_type) || isNull(getVectorValueAddrFnRight(right,0), _right_type)) {
SET_DOUBLE_NULL(output); SET_DOUBLE_NULL(output);
continue; continue;
} }
SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(left,i) + getVectorDoubleValueFnRight(right,0)); SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(left,i) + getVectorDoubleValueFnRight(right,0));
} }
} }
} }
void vectorSub(void *left, int32_t len1, int32_t _left_type, void *right, int32_t len2, int32_t _right_type, void *out, int32_t _ord) { void vectorSub(void *left, int32_t len1, int32_t _left_type, void *right, int32_t len2, int32_t _right_type, void *out, int32_t _ord) {
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : MAX(len1, len2) - 1; int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : MAX(len1, len2) - 1;
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1; int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
double *output=(double*)out; double *output=(double*)out;
_arithmetic_getVectorValueAddr_fn_t getVectorValueAddrFnLeft = getVectorValueAddrFn(_left_type); _arithmetic_getVectorValueAddr_fn_t getVectorValueAddrFnLeft = getVectorValueAddrFn(_left_type);
_arithmetic_getVectorValueAddr_fn_t getVectorValueAddrFnRight = getVectorValueAddrFn(_right_type); _arithmetic_getVectorValueAddr_fn_t getVectorValueAddrFnRight = getVectorValueAddrFn(_right_type);
_arithmetic_getVectorDoubleValue_fn_t getVectorDoubleValueFnLeft = getVectorDoubleValueFn(_left_type); _arithmetic_getVectorDoubleValue_fn_t getVectorDoubleValueFnLeft = getVectorDoubleValueFn(_left_type);
_arithmetic_getVectorDoubleValue_fn_t getVectorDoubleValueFnRight = getVectorDoubleValueFn(_right_type); _arithmetic_getVectorDoubleValue_fn_t getVectorDoubleValueFnRight = getVectorDoubleValueFn(_right_type);
if ((len1) == (len2)) { if ((len1) == (len2)) {
for (; i < (len2) && i >= 0; i += step, output += 1) { for (; i < (len2) && i >= 0; i += step, output += 1) {
if (isNull(getVectorValueAddrFnLeft(left,i), _left_type) || isNull(getVectorValueAddrFnRight(right,i), _right_type)) { if (isNull(getVectorValueAddrFnLeft(left,i), _left_type) || isNull(getVectorValueAddrFnRight(right,i), _right_type)) {
SET_DOUBLE_NULL(output); SET_DOUBLE_NULL(output);
continue; continue;
} }
SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(left,i) - getVectorDoubleValueFnRight(right,i)); SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(left,i) - getVectorDoubleValueFnRight(right,i));
} }
} else if ((len1) == 1) { } else if ((len1) == 1) {
for (; i >= 0 && i < (len2); i += step, output += 1) { for (; i >= 0 && i < (len2); i += step, output += 1) {
if (isNull(getVectorValueAddrFnLeft(left,0), _left_type) || isNull(getVectorValueAddrFnRight(right,i), _right_type)) { if (isNull(getVectorValueAddrFnLeft(left,0), _left_type) || isNull(getVectorValueAddrFnRight(right,i), _right_type)) {
SET_DOUBLE_NULL(output); SET_DOUBLE_NULL(output);
continue; continue;
} }
SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(left,0) - getVectorDoubleValueFnRight(right,i)); SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(left,0) - getVectorDoubleValueFnRight(right,i));
} }
} else if ((len2) == 1) { } else if ((len2) == 1) {
for (; i >= 0 && i < (len1); i += step, output += 1) { for (; i >= 0 && i < (len1); i += step, output += 1) {
if (isNull(getVectorValueAddrFnLeft(left,i), _left_type) || isNull(getVectorValueAddrFnRight(right,0), _right_type)) { if (isNull(getVectorValueAddrFnLeft(left,i), _left_type) || isNull(getVectorValueAddrFnRight(right,0), _right_type)) {
SET_DOUBLE_NULL(output); SET_DOUBLE_NULL(output);
continue; continue;
} }
SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(left,i) - getVectorDoubleValueFnRight(right,0)); SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(left,i) - getVectorDoubleValueFnRight(right,0));
} }
} }
} }
void vectorMultiply(void *left, int32_t len1, int32_t _left_type, void *right, int32_t len2, int32_t _right_type, void *out, int32_t _ord) { void vectorMultiply(void *left, int32_t len1, int32_t _left_type, void *right, int32_t len2, int32_t _right_type, void *out, int32_t _ord) {
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : MAX(len1, len2) - 1; int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : MAX(len1, len2) - 1;
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1; int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
double *output=(double*)out; double *output=(double*)out;
_arithmetic_getVectorValueAddr_fn_t getVectorValueAddrFnLeft = getVectorValueAddrFn(_left_type); _arithmetic_getVectorValueAddr_fn_t getVectorValueAddrFnLeft = getVectorValueAddrFn(_left_type);
_arithmetic_getVectorValueAddr_fn_t getVectorValueAddrFnRight = getVectorValueAddrFn(_right_type); _arithmetic_getVectorValueAddr_fn_t getVectorValueAddrFnRight = getVectorValueAddrFn(_right_type);
_arithmetic_getVectorDoubleValue_fn_t getVectorDoubleValueFnLeft = getVectorDoubleValueFn(_left_type); _arithmetic_getVectorDoubleValue_fn_t getVectorDoubleValueFnLeft = getVectorDoubleValueFn(_left_type);
_arithmetic_getVectorDoubleValue_fn_t getVectorDoubleValueFnRight = getVectorDoubleValueFn(_right_type); _arithmetic_getVectorDoubleValue_fn_t getVectorDoubleValueFnRight = getVectorDoubleValueFn(_right_type);
if ((len1) == (len2)) { if ((len1) == (len2)) {
for (; i < (len2) && i >= 0; i += step, output += 1) { for (; i < (len2) && i >= 0; i += step, output += 1) {
if (isNull(getVectorValueAddrFnLeft(left,i), _left_type) || isNull(getVectorValueAddrFnRight(right,i), _right_type)) { if (isNull(getVectorValueAddrFnLeft(left,i), _left_type) || isNull(getVectorValueAddrFnRight(right,i), _right_type)) {
SET_DOUBLE_NULL(output); SET_DOUBLE_NULL(output);
continue; continue;
} }
SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(left,i) * getVectorDoubleValueFnRight(right,i)); SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(left,i) * getVectorDoubleValueFnRight(right,i));
} }
} else if ((len1) == 1) { } else if ((len1) == 1) {
for (; i >= 0 && i < (len2); i += step, output += 1) { for (; i >= 0 && i < (len2); i += step, output += 1) {
if (isNull(getVectorValueAddrFnLeft(left,0), _left_type) || isNull(getVectorValueAddrFnRight(right,i), _right_type)) { if (isNull(getVectorValueAddrFnLeft(left,0), _left_type) || isNull(getVectorValueAddrFnRight(right,i), _right_type)) {
SET_DOUBLE_NULL(output); SET_DOUBLE_NULL(output);
continue; continue;
} }
SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(left,0) * getVectorDoubleValueFnRight(right,i)); SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(left,0) * getVectorDoubleValueFnRight(right,i));
} }
} else if ((len2) == 1) { } else if ((len2) == 1) {
for (; i >= 0 && i < (len1); i += step, output += 1) { for (; i >= 0 && i < (len1); i += step, output += 1) {
if (isNull(getVectorValueAddrFnLeft(left,i), _left_type) || isNull(getVectorValueAddrFnRight(right,0), _right_type)) { if (isNull(getVectorValueAddrFnLeft(left,i), _left_type) || isNull(getVectorValueAddrFnRight(right,0), _right_type)) {
SET_DOUBLE_NULL(output); SET_DOUBLE_NULL(output);
continue; continue;
} }
SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(left,i) * getVectorDoubleValueFnRight(right,0)); SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(left,i) * getVectorDoubleValueFnRight(right,0));
} }
} }
} }
void vectorDivide(void *left, int32_t len1, int32_t _left_type, void *right, int32_t len2, int32_t _right_type, void *out, int32_t _ord) {
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : MAX(len1, len2) - 1; void vectorDivide(void *left, int32_t len1, int32_t _left_type, void *right, int32_t len2, int32_t _right_type, void *out, int32_t _ord) {
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1; int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : MAX(len1, len2) - 1;
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
double *output=(double*)out; double *output=(double*)out;
_arithmetic_getVectorValueAddr_fn_t getVectorValueAddrFnLeft = getVectorValueAddrFn(_left_type); _arithmetic_getVectorValueAddr_fn_t getVectorValueAddrFnLeft = getVectorValueAddrFn(_left_type);
_arithmetic_getVectorValueAddr_fn_t getVectorValueAddrFnRight = getVectorValueAddrFn(_right_type); _arithmetic_getVectorValueAddr_fn_t getVectorValueAddrFnRight = getVectorValueAddrFn(_right_type);
_arithmetic_getVectorDoubleValue_fn_t getVectorDoubleValueFnLeft = getVectorDoubleValueFn(_left_type); _arithmetic_getVectorDoubleValue_fn_t getVectorDoubleValueFnLeft = getVectorDoubleValueFn(_left_type);
_arithmetic_getVectorDoubleValue_fn_t getVectorDoubleValueFnRight = getVectorDoubleValueFn(_right_type); _arithmetic_getVectorDoubleValue_fn_t getVectorDoubleValueFnRight = getVectorDoubleValueFn(_right_type);
if ((len1) == (len2)) { if ((len1) == (len2)) {
for (; i < (len2) && i >= 0; i += step, output += 1) { for (; i < (len2) && i >= 0; i += step, output += 1) {
if (isNull(getVectorValueAddrFnLeft(left,i), _left_type) || isNull(getVectorValueAddrFnRight(right,i), _right_type)) { if (isNull(getVectorValueAddrFnLeft(left,i), _left_type) || isNull(getVectorValueAddrFnRight(right,i), _right_type)) {
SET_DOUBLE_NULL(output); SET_DOUBLE_NULL(output);
continue; continue;
} }
double v, u = 0.0; double v, u = 0.0;
GET_TYPED_DATA(v, double, _right_type, getVectorValueAddrFnRight(right,i)); GET_TYPED_DATA(v, double, _right_type, getVectorValueAddrFnRight(right,i));
if (getComparFunc(TSDB_DATA_TYPE_DOUBLE, 0)(&v, &u) == 0) { if (getComparFunc(TSDB_DATA_TYPE_DOUBLE, 0)(&v, &u) == 0) {
SET_DOUBLE_NULL(output); SET_DOUBLE_NULL(output);
continue; continue;
} }
SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(left,i) /getVectorDoubleValueFnRight(right,i)); SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(left,i) /getVectorDoubleValueFnRight(right,i));
} }
} else if ((len1) == 1) { } else if ((len1) == 1) {
for (; i >= 0 && i < (len2); i += step, output += 1) { for (; i >= 0 && i < (len2); i += step, output += 1) {
if (isNull(getVectorValueAddrFnLeft(left,0), _left_type) || isNull(getVectorValueAddrFnRight(right,i), _right_type)) { if (isNull(getVectorValueAddrFnLeft(left,0), _left_type) || isNull(getVectorValueAddrFnRight(right,i), _right_type)) {
SET_DOUBLE_NULL(output); SET_DOUBLE_NULL(output);
continue; continue;
} }
double v, u = 0.0; double v, u = 0.0;
GET_TYPED_DATA(v, double, _right_type, getVectorValueAddrFnRight(right,i)); GET_TYPED_DATA(v, double, _right_type, getVectorValueAddrFnRight(right,i));
if (getComparFunc(TSDB_DATA_TYPE_DOUBLE, 0)(&v, &u) == 0) { if (getComparFunc(TSDB_DATA_TYPE_DOUBLE, 0)(&v, &u) == 0) {
SET_DOUBLE_NULL(output); SET_DOUBLE_NULL(output);
continue; continue;
} }
SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(left,0) /getVectorDoubleValueFnRight(right,i)); SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(left,0) /getVectorDoubleValueFnRight(right,i));
} }
} else if ((len2) == 1) { } else if ((len2) == 1) {
for (; i >= 0 && i < (len1); i += step, output += 1) { for (; i >= 0 && i < (len1); i += step, output += 1) {
if (isNull(getVectorValueAddrFnLeft(left,i), _left_type) || isNull(getVectorValueAddrFnRight(right,0), _right_type)) { if (isNull(getVectorValueAddrFnLeft(left,i), _left_type) || isNull(getVectorValueAddrFnRight(right,0), _right_type)) {
SET_DOUBLE_NULL(output); SET_DOUBLE_NULL(output);
continue; continue;
} }
double v, u = 0.0; double v, u = 0.0;
GET_TYPED_DATA(v, double, _right_type, getVectorValueAddrFnRight(right,0)); GET_TYPED_DATA(v, double, _right_type, getVectorValueAddrFnRight(right,0));
if (getComparFunc(TSDB_DATA_TYPE_DOUBLE, 0)(&v, &u) == 0) { if (getComparFunc(TSDB_DATA_TYPE_DOUBLE, 0)(&v, &u) == 0) {
SET_DOUBLE_NULL(output); SET_DOUBLE_NULL(output);
continue; continue;
} }
SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(left,i) /getVectorDoubleValueFnRight(right,0)); SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(left,i) /getVectorDoubleValueFnRight(right,0));
} }
} }
} }
void vectorRemainder(void *left, int32_t len1, int32_t _left_type, void *right, int32_t len2, int32_t _right_type, void *out, int32_t _ord) { void vectorRemainder(void *left, int32_t len1, int32_t _left_type, void *right, int32_t len2, int32_t _right_type, void *out, int32_t _ord) {
int32_t i = (_ord == TSDB_ORDER_ASC) ? 0 : MAX(len1, len2) - 1; int32_t i = (_ord == TSDB_ORDER_ASC) ? 0 : MAX(len1, len2) - 1;
int32_t step = (_ord == TSDB_ORDER_ASC) ? 1 : -1; int32_t step = (_ord == TSDB_ORDER_ASC) ? 1 : -1;
double *output=(double*)out; double *output=(double*)out;
_arithmetic_getVectorValueAddr_fn_t getVectorValueAddrFnLeft = getVectorValueAddrFn(_left_type); _arithmetic_getVectorValueAddr_fn_t getVectorValueAddrFnLeft = getVectorValueAddrFn(_left_type);
_arithmetic_getVectorValueAddr_fn_t getVectorValueAddrFnRight = getVectorValueAddrFn(_right_type); _arithmetic_getVectorValueAddr_fn_t getVectorValueAddrFnRight = getVectorValueAddrFn(_right_type);
_arithmetic_getVectorDoubleValue_fn_t getVectorDoubleValueFnLeft = getVectorDoubleValueFn(_left_type); _arithmetic_getVectorDoubleValue_fn_t getVectorDoubleValueFnLeft = getVectorDoubleValueFn(_left_type);
_arithmetic_getVectorDoubleValue_fn_t getVectorDoubleValueFnRight = getVectorDoubleValueFn(_right_type); _arithmetic_getVectorDoubleValue_fn_t getVectorDoubleValueFnRight = getVectorDoubleValueFn(_right_type);
if (len1 == (len2)) { if (len1 == (len2)) {
for (; i >= 0 && i < (len2); i += step, output += 1) { for (; i >= 0 && i < (len2); i += step, output += 1) {
if (isNull(getVectorValueAddrFnLeft(left,i), _left_type) || isNull(getVectorValueAddrFnRight(right,i), _right_type)) { if (isNull(getVectorValueAddrFnLeft(left,i), _left_type) || isNull(getVectorValueAddrFnRight(right,i), _right_type)) {
SET_DOUBLE_NULL(output); SET_DOUBLE_NULL(output);
continue; continue;
} }
double v, u = 0.0; double v, u = 0.0;
GET_TYPED_DATA(v, double, _right_type, getVectorValueAddrFnRight(right,i)); GET_TYPED_DATA(v, double, _right_type, getVectorValueAddrFnRight(right,i));
if (getComparFunc(TSDB_DATA_TYPE_DOUBLE, 0)(&v, &u) == 0) { if (getComparFunc(TSDB_DATA_TYPE_DOUBLE, 0)(&v, &u) == 0) {
SET_DOUBLE_NULL(output); SET_DOUBLE_NULL(output);
continue; continue;
} }
SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(left,i) - ((int64_t)(getVectorDoubleValueFnLeft(left,i) / getVectorDoubleValueFnRight(right,i))) * getVectorDoubleValueFnRight(right,i)); SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(left,i) - ((int64_t)(getVectorDoubleValueFnLeft(left,i) / getVectorDoubleValueFnRight(right,i))) * getVectorDoubleValueFnRight(right,i));
} }
} else if (len1 == 1) { } else if (len1 == 1) {
for (; i >= 0 && i < (len2); i += step, output += 1) { for (; i >= 0 && i < (len2); i += step, output += 1) {
if (isNull(getVectorValueAddrFnLeft(left,0), _left_type) || isNull(getVectorValueAddrFnRight(right,i), _right_type)) { if (isNull(getVectorValueAddrFnLeft(left,0), _left_type) || isNull(getVectorValueAddrFnRight(right,i), _right_type)) {
SET_DOUBLE_NULL(output); SET_DOUBLE_NULL(output);
continue; continue;
} }
double v, u = 0.0; double v, u = 0.0;
GET_TYPED_DATA(v, double, _right_type, getVectorValueAddrFnRight(right,i)); GET_TYPED_DATA(v, double, _right_type, getVectorValueAddrFnRight(right,i));
if (getComparFunc(TSDB_DATA_TYPE_DOUBLE, 0)(&v, &u) == 0) { if (getComparFunc(TSDB_DATA_TYPE_DOUBLE, 0)(&v, &u) == 0) {
SET_DOUBLE_NULL(output); SET_DOUBLE_NULL(output);
continue; continue;
} }
SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(left,0) - ((int64_t)(getVectorDoubleValueFnLeft(left,0) / getVectorDoubleValueFnRight(right,i))) * getVectorDoubleValueFnRight(right,i)); SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(left,0) - ((int64_t)(getVectorDoubleValueFnLeft(left,0) / getVectorDoubleValueFnRight(right,i))) * getVectorDoubleValueFnRight(right,i));
} }
} else if ((len2) == 1) { } else if ((len2) == 1) {
for (; i >= 0 && i < len1; i += step, output += 1) { for (; i >= 0 && i < len1; i += step, output += 1) {
if (isNull(getVectorValueAddrFnLeft(left,i), _left_type) || isNull(getVectorValueAddrFnRight(right,0), _right_type)) { if (isNull(getVectorValueAddrFnLeft(left,i), _left_type) || isNull(getVectorValueAddrFnRight(right,0), _right_type)) {
SET_DOUBLE_NULL(output); SET_DOUBLE_NULL(output);
continue; continue;
} }
double v, u = 0.0; double v, u = 0.0;
GET_TYPED_DATA(v, double, _right_type, getVectorValueAddrFnRight(right,0)); GET_TYPED_DATA(v, double, _right_type, getVectorValueAddrFnRight(right,0));
if (getComparFunc(TSDB_DATA_TYPE_DOUBLE, 0)(&v, &u) == 0) { if (getComparFunc(TSDB_DATA_TYPE_DOUBLE, 0)(&v, &u) == 0) {
SET_DOUBLE_NULL(output); SET_DOUBLE_NULL(output);
continue; continue;
} }
SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(left,i) - ((int64_t)(getVectorDoubleValueFnLeft(left,i) / getVectorDoubleValueFnRight(right,0))) * getVectorDoubleValueFnRight(right,0)); SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(left,i) - ((int64_t)(getVectorDoubleValueFnLeft(left,i) / getVectorDoubleValueFnRight(right,0))) * getVectorDoubleValueFnRight(right,0));
} }
} }
} }
_arithmetic_operator_fn_t getArithmeticOperatorFn(int32_t arithmeticOptr) { _arithmetic_operator_fn_t getArithmeticOperatorFn(int32_t arithmeticOptr) {
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include "taosdef.h" #include "taosdef.h"
#include "taosmsg.h" #include "taosmsg.h"
#include "tcmdtype.h" #include "tcmdtype.h"
#include "tcompare.h"
#include "tstrbuild.h" #include "tstrbuild.h"
#include "ttoken.h" #include "ttoken.h"
#include "ttokendef.h" #include "ttokendef.h"
...@@ -318,12 +319,17 @@ tSqlExpr *tSqlExprCreate(tSqlExpr *pLeft, tSqlExpr *pRight, int32_t optrType) { ...@@ -318,12 +319,17 @@ tSqlExpr *tSqlExprCreate(tSqlExpr *pLeft, tSqlExpr *pRight, int32_t optrType) {
} }
if ((pLeft != NULL && pRight != NULL) && if ((pLeft != NULL && pRight != NULL) &&
(optrType == TK_PLUS || optrType == TK_MINUS || optrType == TK_STAR || optrType == TK_DIVIDE || optrType == TK_REM)) { (optrType == TK_PLUS || optrType == TK_MINUS || optrType == TK_STAR || optrType == TK_DIVIDE || optrType == TK_REM ||
optrType == TK_EQ || optrType == TK_NE || optrType == TK_LT || optrType == TK_GT || optrType == TK_LE || optrType == TK_GE ||
optrType == TK_AND || optrType == TK_OR)) {
/* /*
* if a exprToken is noted as the TK_TIMESTAMP, the time precision is microsecond * if a exprToken is noted as the TK_TIMESTAMP, the time precision is microsecond
* Otherwise, the time precision is adaptive, determined by the time precision from databases. * Otherwise, the time precision is adaptive, determined by the time precision from databases.
*/ */
if ((pLeft->tokenId == TK_INTEGER && pRight->tokenId == TK_INTEGER) || if ((pLeft->tokenId == TK_INTEGER && pRight->tokenId == TK_INTEGER) ||
(pLeft->tokenId == TK_BOOL && pRight->tokenId == TK_BOOL) ||
(pLeft->tokenId == TK_INTEGER && pRight->tokenId == TK_BOOL) ||
(pLeft->tokenId == TK_BOOL && pRight->tokenId == TK_INTEGER) ||
(pLeft->tokenId == TK_TIMESTAMP && pRight->tokenId == TK_TIMESTAMP)) { (pLeft->tokenId == TK_TIMESTAMP && pRight->tokenId == TK_TIMESTAMP)) {
pExpr->value.nType = TSDB_DATA_TYPE_BIGINT; pExpr->value.nType = TSDB_DATA_TYPE_BIGINT;
pExpr->tokenId = pLeft->tokenId; pExpr->tokenId = pLeft->tokenId;
...@@ -360,12 +366,46 @@ tSqlExpr *tSqlExprCreate(tSqlExpr *pLeft, tSqlExpr *pRight, int32_t optrType) { ...@@ -360,12 +366,46 @@ tSqlExpr *tSqlExprCreate(tSqlExpr *pLeft, tSqlExpr *pRight, int32_t optrType) {
pExpr->value.i64 = pLeft->value.i64 % pRight->value.i64; pExpr->value.i64 = pLeft->value.i64 % pRight->value.i64;
break; break;
} }
case TK_EQ: {
pExpr->value.i64 = (pLeft->value.i64 == pRight->value.i64) ? 1 : 0;
break;
}
case TK_NE: {
pExpr->value.i64 = (pLeft->value.i64 != pRight->value.i64) ? 1 : 0;
break;
}
case TK_LT: {
pExpr->value.i64 = (pLeft->value.i64 < pRight->value.i64) ? 1 : 0;
break;
}
case TK_GT: {
pExpr->value.i64 = (pLeft->value.i64 > pRight->value.i64) ? 1 : 0;
break;
}
case TK_LE: {
pExpr->value.i64 = (pLeft->value.i64 <= pRight->value.i64) ? 1 : 0;
break;
}
case TK_GE: {
pExpr->value.i64 = (pLeft->value.i64 >= pRight->value.i64) ? 1 : 0;
break;
}
case TK_AND: {
pExpr->value.i64 = (pLeft->value.i64 && pRight->value.i64) ? 1 : 0;
break;
}
case TK_OR: {
pExpr->value.i64 = (pLeft->value.i64 || pRight->value.i64) ? 1 : 0;
break;
}
} }
tSqlExprDestroy(pLeft); tSqlExprDestroy(pLeft);
tSqlExprDestroy(pRight); tSqlExprDestroy(pRight);
} else if ((pLeft->tokenId == TK_FLOAT && pRight->tokenId == TK_INTEGER) || } else if ((pLeft->tokenId == TK_FLOAT && pRight->tokenId == TK_INTEGER) ||
(pLeft->tokenId == TK_INTEGER && pRight->tokenId == TK_FLOAT) || (pLeft->tokenId == TK_INTEGER && pRight->tokenId == TK_FLOAT) ||
(pLeft->tokenId == TK_BOOL && pRight->tokenId == TK_FLOAT) ||
(pLeft->tokenId == TK_FLOAT && pRight->tokenId == TK_BOOL) ||
(pLeft->tokenId == TK_FLOAT && pRight->tokenId == TK_FLOAT)) { (pLeft->tokenId == TK_FLOAT && pRight->tokenId == TK_FLOAT)) {
pExpr->value.nType = TSDB_DATA_TYPE_DOUBLE; pExpr->value.nType = TSDB_DATA_TYPE_DOUBLE;
pExpr->tokenId = TK_FLOAT; pExpr->tokenId = TK_FLOAT;
...@@ -395,6 +435,80 @@ tSqlExpr *tSqlExprCreate(tSqlExpr *pLeft, tSqlExpr *pRight, int32_t optrType) { ...@@ -395,6 +435,80 @@ tSqlExpr *tSqlExprCreate(tSqlExpr *pLeft, tSqlExpr *pRight, int32_t optrType) {
pExpr->value.dKey = left - ((int64_t)(left / right)) * right; pExpr->value.dKey = left - ((int64_t)(left / right)) * right;
break; break;
} }
case TK_EQ: {
pExpr->tokenId = TK_INTEGER;
pExpr->value.nType = TSDB_DATA_TYPE_BIGINT;
if (compareDoubleVal(&left, &right) == 0) {
pExpr->value.i64 = 1;
} else {
pExpr->value.i64 = 0;
}
break;
}
case TK_NE: {
pExpr->tokenId = TK_INTEGER;
pExpr->value.nType = TSDB_DATA_TYPE_BIGINT;
if (compareDoubleVal(&left, &right) != 0) {
pExpr->value.i64 = 1;
} else {
pExpr->value.i64 = 0;
}
break;
}
case TK_LT: {
pExpr->tokenId = TK_INTEGER;
pExpr->value.nType = TSDB_DATA_TYPE_BIGINT;
if (compareDoubleVal(&left, &right) == -1) {
pExpr->value.i64 = 1;
} else {
pExpr->value.i64 = 0;
}
break;
}
case TK_GT: {
pExpr->tokenId = TK_INTEGER;
pExpr->value.nType = TSDB_DATA_TYPE_BIGINT;
if (compareDoubleVal(&left, &right) == 1) {
pExpr->value.i64 = 1;
} else {
pExpr->value.i64 = 0;
}
break;
}
case TK_LE: {
int32_t res = compareDoubleVal(&left, &right);
pExpr->tokenId = TK_INTEGER;
pExpr->value.nType = TSDB_DATA_TYPE_BIGINT;
if (res == 0 || res == -1) {
pExpr->value.i64 = 1;
} else {
pExpr->value.i64 = 0;
}
break;
}
case TK_GE: {
int32_t res = compareDoubleVal(&left, &right);
pExpr->tokenId = TK_INTEGER;
pExpr->value.nType = TSDB_DATA_TYPE_BIGINT;
if (res == 0 || res == 1) {
pExpr->value.i64 = 1;
} else {
pExpr->value.i64 = 0;
}
break;
}
case TK_AND: {
pExpr->tokenId = TK_INTEGER;
pExpr->value.nType = TSDB_DATA_TYPE_BIGINT;
pExpr->value.i64 = (left && right) ? 1 : 0;
break;
}
case TK_OR: {
pExpr->tokenId = TK_INTEGER;
pExpr->value.nType = TSDB_DATA_TYPE_BIGINT;
pExpr->value.i64 = (left || right) ? 1 : 0;
break;
}
} }
tSqlExprDestroy(pLeft); tSqlExprDestroy(pLeft);
......
###################################################################
# Copyright (c) 2021 by TAOS Technologies, Inc.
# All rights reserved.
#
# This file is proprietary and confidential to TAOS Technologies.
# No part of this file may be reproduced, stored, transmitted,
# disclosed or used in any form or by any means other than as
# expressly provided by the written permission from Jianhui Tao
#
###################################################################
# -*- coding: utf-8 -*-
import sys
from util.log import *
from util.cases import *
from util.sql import *
class TDTestCase:
def caseDescription(self):
'''
case1<Ganlin Zhao>: [TD-12945] : taos shell crash when constant comparison cause crash
'''
return
def init(self, conn, logSql):
tdLog.debug("start to execute %s" % __file__)
tdSql.init(conn.cursor(), logSql)
def getBuildPath(self):
selfPath = os.path.dirname(os.path.realpath(__file__))
if ("community" in selfPath):
projPath = selfPath[:selfPath.find("community")]
else:
projPath = selfPath[:selfPath.find("tests")]
for root, dirs, files in os.walk(projPath):
if ("taosd" in files):
rootRealPath = os.path.dirname(os.path.realpath(root))
if ("packaging" not in rootRealPath):
buildPath = root[:len(root) - len("/build/bin")]
break
return buildPath
def run(self):
print("running {}".format(__file__))
tdSql.execute("drop database if exists db")
tdSql.execute("create database if not exists db")
tdSql.execute('use db')
#Prepare data
tdSql.execute("create table tb (ts timestamp, value int);")
tdSql.execute("insert into tb values (now, 123);")
##operator: =
tdSql.query('select 1 = 1 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 = 0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1 = 1.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 = 0.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1 = 1.0001 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1 = 1.0000000001 from tb;') ##DBL_EPSILON is used in floating number comparison
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1.0 = 1.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1.0 = 0.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1.0 = 1.001 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1.0 = 1.0000000001 from tb;') ##DBL_EPSILON is used in floating number comparison
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 = true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 0 = false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 = false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 0 = true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1.0 = true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 0.0 = false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1.0 = false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 0.0 = true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select true = 1.001 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select true = 1.0000000001 from tb;') ##DBL_EPSILON is used in floating number comparison
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.error('select "abc" = "def" from tb;')
tdSql.error('select "abc" = 1 from tb;')
tdSql.error('select 1 = "abc" from tb;')
tdSql.error('select "abc" = 1.0 from tb;')
tdSql.error('select 1.0 = "abc" from tb;')
tdSql.error('select "abc" = true from tb;')
tdSql.error('select false = "abc" from tb;')
tdSql.error('select \'abc\' = \'def\' from tb;')
tdSql.error('select \'abc\' = 1 from tb;')
tdSql.error('select 1 = \'abc\' from tb;')
tdSql.error('select \'abc\' = 1.0 from tb;')
tdSql.error('select 1.0 = \'abc\' from tb;')
tdSql.error('select \'abc\' = true from tb;')
tdSql.error('select false = \'abc\' from tb;')
##operator: !=
tdSql.query('select 1 != 1 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1 != 0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 != 1.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1 != 0.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 != 1.0001 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 != 1.0000000001 from tb;') ##DBL_EPSILON is used in floating number comparison
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1.0 != 1.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1.0 != 0.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1.0 != 1.001 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1.0 != 1.0000000001 from tb;') ##DBL_EPSILON is used in floating number comparison
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1 != true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 0 != false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1 != false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 0 != true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1.0 != true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 0.0 != false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1.0 != false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 0.0 != true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select true != 1.001 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select true != 1.0000000001 from tb;') ##DBL_EPSILON is used in floating number comparison
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.error('select "abc" != "def" from tb;')
tdSql.error('select "abc" != 1 from tb;')
tdSql.error('select 1 != "abc" from tb;')
tdSql.error('select "abc" != 1.0 from tb;')
tdSql.error('select 1.0 != "abc" from tb;')
tdSql.error('select "abc" != true from tb;')
tdSql.error('select false != "abc" from tb;')
tdSql.error('select \'abc\' != \'def\' from tb;')
tdSql.error('select \'abc\' != 1 from tb;')
tdSql.error('select 1 != \'abc\' from tb;')
tdSql.error('select \'abc\' != 1.0 from tb;')
tdSql.error('select 1.0 != \'abc\' from tb;')
tdSql.error('select \'abc\' != true from tb;')
tdSql.error('select false != \'abc\' from tb;')
##operator: <>
tdSql.query('select 1 <> 1 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1 <> 0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 <> 1.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1 <> 0.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 <> 1.0001 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 <> 1.0000000001 from tb;') ##DBL_EPSILON is used in floating number comparison
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1.0 <> 1.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1.0 <> 0.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1.0 <> 1.001 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1.0 <> 1.0000000001 from tb;') ##DBL_EPSILON is used in floating number comparison
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1 <> true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 0 <> false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1 <> false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 0 <> true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1.0 <> true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 0.0 <> false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1.0 <> false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 0.0 <> true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select true <> 1.001 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select true <> 1.0000000001 from tb;') ##DBL_EPSILON is used in floating number comparison
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.error('select "abc" <> "def" from tb;')
tdSql.error('select "abc" <> 1 from tb;')
tdSql.error('select 1 <> "abc" from tb;')
tdSql.error('select "abc" <> 1.0 from tb;')
tdSql.error('select 1.0 <> "abc" from tb;')
tdSql.error('select "abc" <> true from tb;')
tdSql.error('select false <> "abc" from tb;')
tdSql.error('select \'abc\' <> \'def\' from tb;')
tdSql.error('select \'abc\' <> 1 from tb;')
tdSql.error('select 1 <> \'abc\' from tb;')
tdSql.error('select \'abc\' <> 1.0 from tb;')
tdSql.error('select 1.0 <> \'abc\' from tb;')
tdSql.error('select \'abc\' <> true from tb;')
tdSql.error('select false <> \'abc\' from tb;')
##operator: <
tdSql.query('select 1 < 1 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 0 < 1 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 < 1.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 0.0 < 1 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 < 1.0001 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 < 1.0000000001 from tb;') ##DBL_EPSILON is used in floating number comparison
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1.0 < 1.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 0.0 < 1.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1.0 < 1.001 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1.0 < 1.0000000001 from tb;') ##DBL_EPSILON is used in floating number comparison
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 0 < true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 < false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select false < true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select true < false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1.0 < true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 0.0 < false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select false < 1.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 0.0 < true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select true < 1.001 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select true < 1.0000000001 from tb;') ##DBL_EPSILON is used in floating number comparison
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.error('select "abc" < "def" from tb;')
tdSql.error('select "abc" < 1 from tb;')
tdSql.error('select 1 < "abc" from tb;')
tdSql.error('select "abc" < 1.0 from tb;')
tdSql.error('select 1.0 < "abc" from tb;')
tdSql.error('select "abc" < true from tb;')
tdSql.error('select false < "abc" from tb;')
tdSql.error('select \'abc\' < \'def\' from tb;')
tdSql.error('select \'abc\' < 1 from tb;')
tdSql.error('select 1 < \'abc\' from tb;')
tdSql.error('select \'abc\' < 1.0 from tb;')
tdSql.error('select 1.0 < \'abc\' from tb;')
tdSql.error('select \'abc\' < true from tb;')
tdSql.error('select false < \'abc\' from tb;')
##operator: >
tdSql.query('select 1 > 1 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1 > 0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 > 1.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1 > 0.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1.0001 > 1 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 > 1.0000000001 from tb;') ##DBL_EPSILON is used in floating number comparison
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1.0 > 1.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1.0 > 0.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1.001 > 1.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1.0000000001 > 1.0 from tb;') ##DBL_EPSILON is used in floating number comparison
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1 > false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 0 > true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select false > true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select true > false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1.0 > true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 0.0 > false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1.0 > false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select true > 0.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1.001 > true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1.0000000001 > true from tb;') ##DBL_EPSILON is used in floating number comparison
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.error('select "abc" > "def" from tb;')
tdSql.error('select "abc" > 1 from tb;')
tdSql.error('select 1 > "abc" from tb;')
tdSql.error('select "abc" > 1.0 from tb;')
tdSql.error('select 1.0 > "abc" from tb;')
tdSql.error('select "abc" > true from tb;')
tdSql.error('select false > "abc" from tb;')
tdSql.error('select \'abc\' > \'def\' from tb;')
tdSql.error('select \'abc\' > 1 from tb;')
tdSql.error('select 1 > \'abc\' from tb;')
tdSql.error('select \'abc\' > 1.0 from tb;')
tdSql.error('select 1.0 > \'abc\' from tb;')
tdSql.error('select \'abc\' > true from tb;')
tdSql.error('select false > \'abc\' from tb;')
##operator: <=
tdSql.query('select 1 <= 2 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 <= 1 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 <= 0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1 <= 2.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 <= 1.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 <= 0.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1 <= 1.0001 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 <= 1.0000000001 from tb;') ##DBL_EPSILON is used in floating number comparison
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1.0 <= 2.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1.0 <= 1.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1.0 <= 0.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1.0 <= 1.001 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1.0 <= 1.0000000001 from tb;') ##DBL_EPSILON is used in floating number comparison
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 0 <= true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 <= false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select false <= true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select true <= false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select true <= true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select false <= false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1.0 <= true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 0.0 <= false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select false <= 1.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 0.0 <= true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select true <= 1.001 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select true <= 1.0000000001 from tb;') ##DBL_EPSILON is used in floating number comparison
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.error('select "abc" <= "def" from tb;')
tdSql.error('select "abc" <= 1 from tb;')
tdSql.error('select 1 <= "abc" from tb;')
tdSql.error('select "abc" <= 1.0 from tb;')
tdSql.error('select 1.0 <= "abc" from tb;')
tdSql.error('select "abc" <= true from tb;')
tdSql.error('select false <= "abc" from tb;')
tdSql.error('select \'abc\' <= \'def\' from tb;')
tdSql.error('select \'abc\' <= 1 from tb;')
tdSql.error('select 1 <= \'abc\' from tb;')
tdSql.error('select \'abc\' <= 1.0 from tb;')
tdSql.error('select 1.0 <= \'abc\' from tb;')
tdSql.error('select \'abc\' <= true from tb;')
tdSql.error('select false <= \'abc\' from tb;')
##operator: >=
tdSql.query('select 1 >= 2 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1 >= 1 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 >= 0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 >= 2.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1 >= 1.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 >= 0.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1.0001 >= 1 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 >= 1.0000000001 from tb;') ##DBL_EPSILON is used in floating number comparison
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1.0 >= 2.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1.0 >= 1.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1.0 >= 0.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1.001 >= 1.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1.0000000001 >= 1.0 from tb;') ##DBL_EPSILON is used in floating number comparison
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 >= false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 0 >= true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select false >= true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select true >= false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select false >= false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select true >= true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1.0 >= true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 0.0 >= false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1.0 >= false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select true >= 0.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1.001 >= true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1.0000000001 >= true from tb;') ##DBL_EPSILON is used in floating number comparison
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.error('select "abc" >= "def" from tb;')
tdSql.error('select "abc" >= 1 from tb;')
tdSql.error('select 1 >= "abc" from tb;')
tdSql.error('select "abc" >= 1.0 from tb;')
tdSql.error('select 1.0 >= "abc" from tb;')
tdSql.error('select "abc" >= true from tb;')
tdSql.error('select false >= "abc" from tb;')
tdSql.error('select \'abc\' >= \'def\' from tb;')
tdSql.error('select \'abc\' >= 1 from tb;')
tdSql.error('select 1 >= \'abc\' from tb;')
tdSql.error('select \'abc\' >= 1.0 from tb;')
tdSql.error('select 1.0 >= \'abc\' from tb;')
tdSql.error('select \'abc\' >= true from tb;')
tdSql.error('select false >= \'abc\' from tb;')
##operator: between and
tdSql.query('select 1 between 2 and 4 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 3 between 2 and 4 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 2 between 2 and 4 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 4 between 2 and 4 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 between 2.0 and 4.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1.0 between 2 and 4 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 3 between 2.0 and 4.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 3.0 between 2 and 4 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 2 between 2.0 and 4.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 4 between 2.0 and 4.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 2.0 between 2 and 4 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 4.0 between 2 and 4 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 2.0001 between 2 and 4 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 2.0000000001 between 2 and 4 from tb;') ##DBL_EPSILON is used in floating number comparison
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 2 between 2.0001 and 4 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 2 between 2.000000001 and 4 from tb;') ##DBL_EPSILON is used in floating number comparison
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 4 between 2 and 4.0001 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 4 between 2 and 4.000000001 from tb;') ##DBL_EPSILON is used in floating number comparison
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 4.0001 between 2 and 4 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 4.000000001 between 2 and 4 from tb;') ##DBL_EPSILON is used in floating number comparison
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select false between 0 and 1 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select false between 1 and 2 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select true between 0 and 1 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select true between -1 and 0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select false between 0.0 and 1.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select false between 1.0 and 2.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select true between 0.0 and 1.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select true between -1.0 and 0.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 0 between false and true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 between false and true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 0 between false and 10 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 between true and 10 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 0.0 between false and true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1.0 between false and true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 0 between false and 10.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 between true and 10.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.error('select "abc" between "def" and "ghi" from tb;')
tdSql.error('select "abc" between 1 and 2 from tb;')
tdSql.error('select "abc" between 1.0 and 2.0 from tb;')
tdSql.error('select "abc" between true and false from tb;')
tdSql.error('select 1 between 1.0 and "cde" from tb;')
tdSql.error('select 1.0 between true and "cde" from tb;')
tdSql.error('select true between 1 and "cde" from tb;')
tdSql.error('select 1 between "abc" and 1.0 from tb;')
tdSql.error('select 1.0 between "abc" and true from tb;')
tdSql.error('select true between "abc" and 1 from tb;')
tdSql.error('select \'abc\' between \'def\' and \'ghi\' from tb;')
tdSql.error('select \'abc\' between 1 and 2 from tb;')
tdSql.error('select \'abc\' between 1.0 and 2.0 from tb;')
tdSql.error('select \'abc\' between true and false from tb;')
tdSql.error('select 1 between 1.0 and \'cde\' from tb;')
tdSql.error('select 1.0 between true and \'cde\' from tb;')
tdSql.error('select true between 1 and \'cde\' from tb;')
tdSql.error('select 1 between \'abc\' and 1.0 from tb;')
tdSql.error('select 1.0 between \'abc\' and true from tb;')
tdSql.error('select true between \'abc\' and 1 from tb;')
##operator: and
tdSql.query('select 10 and 10 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 10.0 and 10 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 10.0 and 10.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 10 and 0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 10.0 and 0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 10.0 and 0.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 10.0 and 0.001 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 10.0 and 0.000000000000000001 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select true and 10 and false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select true and 10.0 and false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1 and 2 and 3 and 10.1 and -20.02 and 22.03 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 and 2 and 3 and 0 and 20.02 and 22.03 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1 and 2 and 3 and 0.0 and 20.02 and 22.03 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.error('select "abc" and "def" from tb;')
tdSql.error('select "abc" and 1 from tb;')
tdSql.error('select 1 and "abc" from tb;')
tdSql.error('select "abc" and 1.0 from tb;')
tdSql.error('select 1.0 and abc from tb;')
tdSql.error('select "abc" and true from tb;')
tdSql.error('select false and "abc" from tb;')
tdSql.error('select 1 and "abc" and 1.0 and true and false and 0 from tb;')
tdSql.error('select 1 and "abc" and 1.0 and "cde" and false and 0 from tb;')
tdSql.error('select 1 and "abc" and 1.0 and "cde" and false and "fhi" from tb;')
tdSql.error('select \'abc\' and \'def\' from tb;')
tdSql.error('select \'abc\' and 1 from tb;')
tdSql.error('select 1 and \'abc\' from tb;')
tdSql.error('select \'abc\' and 1.0 from tb;')
tdSql.error('select 1.0 and abc from tb;')
tdSql.error('select \'abc\' and true from tb;')
tdSql.error('select false and \'abc\' from tb;')
tdSql.error('select 1 and \'abc\' and 1.0 and true and false and 0 from tb;')
tdSql.error('select 1 and \'abc\' and 1.0 and \'cde\' and false and "fhi" from tb;')
##operator: or
tdSql.query('select 10 or 10 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 10.0 or 0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 10 or 0.0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 0.0 or 0 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 0.0 or 0.001 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 0.0 or 0.000000000000000001 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 or 2 or 3 or 0.0 or -20.02 or 22.03 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 0 or 0.0 or 0.00 or 0.000 or 0.0000 or 0.00000 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select true or 10 or false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select true or 10.0 or false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.error('select "abc" or "def" from tb;')
tdSql.error('select "abc" or 1 from tb;')
tdSql.error('select 1 or "abc" from tb;')
tdSql.error('select "abc" or 1.0 from tb;')
tdSql.error('select 1.0 or abc from tb;')
tdSql.error('select "abc" or true from tb;')
tdSql.error('select false or "abc" from tb;')
tdSql.error('select 1 or "abc" or 1.0 or true or false or 0 from tb;')
tdSql.error('select 1 or "abc" or 1.0 or "cde" or false or 0 from tb;')
tdSql.error('select 1 or "abc" or 1.0 or "cde" or false or "fhi" from tb;')
tdSql.error('select \'abc\' or \'def\' from tb;')
tdSql.error('select \'abc\' or 1 from tb;')
tdSql.error('select 1 or \'abc\' from tb;')
tdSql.error('select \'abc\' or 1.0 from tb;')
tdSql.error('select 1.0 or abc from tb;')
tdSql.error('select \'abc\' or true from tb;')
tdSql.error('select false or \'abc\' from tb;')
tdSql.error('select 1 or \'abc\' or 1.0 or true or false or 0 from tb;')
tdSql.error('select 1 or \'abc\' or 1.0 or \'cde\' or false or "fhi" from tb;')
##operator: multiple operations
tdSql.query('select 1 and 1 != 2 and 1 < 2 and 2 between 1 and 3 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 0 or 1 = 2 or 1 >= 2 or 2 between 3 and 5 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 0 and 1 != 2 and 1 < 2 and 2 between 1 and 3 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1 or 1 = 2 or 1 >= 2 or 2 between 3 and 5 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 != 2 and 1 < 2 and 1 >= 2 and 2 between 1 and 3 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1 = 2 or 1 >= 2 or 1<>3 or 2 between 3 and 5 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 0 or 1 != 2 and 1 <= 2 and 2 between 3 and 4 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 0 or 1 = 2 and 1 <= 2 and 2 between 3 and 5 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 0)
tdSql.query('select 1 != 2 and 1 < 2 or 1 >= 2 or 2 between 4 and 5 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 != 2 and 1 < 2 or 1 >= 2 or 2 between 4 and 5 or true from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 != 2 and 1 < 2 or 1 >= 2 or 2 between 4 and 5 and false from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 != 2 and 1 < 2 or 1 >= 2 or 2 between 4 and 5 and true and 10.1 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.query('select 1 != 2 and 1 < 2 or 1 >= 2 or 2 between 4 and 5 and false or 10.1 from tb;')
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1)
tdSql.error('select 1 != 2 and "abc" or 1 >= 2 or "cde" between 4 and 5 and \'ghi\' or 10.1 from tb;')
tdSql.error('select 1 != 2 and 1 < 2 or \'abc123\' or 2 between \'abc123\' and 5 and false or "abc123" from tb;')
tdSql.error('select \'1234\' or 1 < 2 or \'aace\' and "cde" between 4 and "def" and "ckas" or 10.1 from tb;')
tdSql.execute('drop database db')
def stop(self):
tdSql.close()
tdLog.success("%s successfully executed" % __file__)
tdCases.addWindows(__file__, TDTestCase())
tdCases.addLinux(__file__, TDTestCase())
...@@ -2,6 +2,7 @@ python3 ./test.py -f 2-query/ts_hidden_column.py ...@@ -2,6 +2,7 @@ python3 ./test.py -f 2-query/ts_hidden_column.py
python3 ./test.py -f 2-query/union-order.py python3 ./test.py -f 2-query/union-order.py
python3 ./test.py -f 2-query/session_two_stage.py python3 ./test.py -f 2-query/session_two_stage.py
python3 ./test.py -f 2-query/timeline_agg_func_groupby.py python3 ./test.py -f 2-query/timeline_agg_func_groupby.py
python3 ./test.py -f 2-query/constant_compare.py
python3 ./test.py -f 2-query/ts_2016.py python3 ./test.py -f 2-query/ts_2016.py
python3 ./test.py -f 2-query/function_mavg.py python3 ./test.py -f 2-query/function_mavg.py
python3 ./test.py -f 2-query/escape.py python3 ./test.py -f 2-query/escape.py
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册