diff --git a/src/query/src/qFilter.c b/src/query/src/qFilter.c index 9afd9609ee7b8817a390b0e12d705e5d678593aa..3b685b108fed7d4f6f260ded2ebf3dc8d79a6528 100644 --- a/src/query/src/qFilter.c +++ b/src/query/src/qFilter.c @@ -3588,7 +3588,7 @@ int32_t filterConverNcharColumns(SFilterInfo* info, int32_t rows, bool *gotNchar if (FILTER_EMPTY_RES(info) || FILTER_ALL_RES(info)) { return TSDB_CODE_SUCCESS; } - + for (uint32_t i = 0; i < info->fields[FLD_TYPE_COLUMN].num; ++i) { SFilterField* fi = &info->fields[FLD_TYPE_COLUMN].fields[i]; int32_t type = FILTER_GET_COL_FIELD_TYPE(fi); @@ -3602,6 +3602,15 @@ int32_t filterConverNcharColumns(SFilterInfo* info, int32_t rows, bool *gotNchar char *src = FILTER_GET_COL_FIELD_DATA(fi, j); char *dst = FILTER_GET_COL_FIELD_DATA(&nfi, j); int32_t len = 0; + char *varSrc = varDataVal(src); + size_t k = 0, varSrcLen = varDataLen(src); + while (k < varSrcLen && varSrc[k++] == -1) {} + if (k == varSrcLen) { + /* NULL */ + varDataLen(dst) = (VarDataLenT) varSrcLen; + varDataCopy(dst, src); + continue; + } bool ret = taosMbsToUcs4(varDataVal(src), varDataLen(src), varDataVal(dst), bufSize, &len); if(!ret) { qError("filterConverNcharColumns taosMbsToUcs4 error"); diff --git a/tests/pytest/fulltest.sh b/tests/pytest/fulltest.sh index c9cf6a2af4241d17d9a9536374a25d1c3add604b..cf1b4b21cf4913b70ac5364e95b64ca3b124c558 100755 --- a/tests/pytest/fulltest.sh +++ b/tests/pytest/fulltest.sh @@ -289,6 +289,7 @@ python3 ./test.py -f query/bug6586.py # python3 ./test.py -f query/bug5903.py python3 ./test.py -f query/queryLimit.py python3 ./test.py -f query/queryPriKey.py +python3 ./test.py -f query/queryNcharNull.py #stream python3 ./test.py -f stream/metric_1.py diff --git a/tests/pytest/query/queryNcharNull.py b/tests/pytest/query/queryNcharNull.py new file mode 100644 index 0000000000000000000000000000000000000000..75565afd58f6663c510a2b1735f34097cc795e83 --- /dev/null +++ b/tests/pytest/query/queryNcharNull.py @@ -0,0 +1,73 @@ +################################################################### +# Copyright (c) 2016 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 * +from util.dnodes import * + + +class TDTestCase: + def init(self, conn, logSql): + tdLog.debug("start to execute %s" % __file__) + tdSql.init(conn.cursor(), logSql) + + def run(self): + tdSql.prepare() + tdSql.execute("drop database if exists db") + tdSql.execute("create database if not exists db keep 3650") + tdSql.execute("use db") + + tdSql.execute( + "create table stb1 (ts TIMESTAMP, id INT, col1 NCHAR(20), col2 BINARY(30), col3 FLOAT) TAGS (tid INT, name BINARY(20))" + ) + + tdSql.execute( + "insert into tb1 using stb1 tags(1, 'ABC') values (now - 1m, 1, '北京', '朝阳', 3.141)" + ) + + tdSql.execute( + "insert into tb1 using stb1 tags(1, 'ABC') values (now, 2, NULL, NULL, 3.141)" + ) + + tdSql.query( + "select * from (select * from stb1) where col1 = '北京'" + ) + + tdSql.checkData(0, 2, '北京') + + tdSql.execute( + "create table normal1 (ts TIMESTAMP, id INT, col1 NCHAR(20), col2 BINARY(30), col3 FLOAT)" + ) + + tdSql.execute( + "insert into normal1 values (now - 1m, 1, '北京', '朝阳', 3.141)" + ) + + tdSql.execute( + "insert into normal1 values (now, 1, NULL, NULL, 3.141)" + ) + + tdSql.query( + "select * from (select * from normal1) where col1 = '北京'" + ) + + tdSql.checkData(0, 2, '北京') + + def stop(self): + tdSql.close() + tdLog.success("%s successfully executed" % __file__) + +tdCases.addWindows(__file__, TDTestCase()) +tdCases.addLinux(__file__, TDTestCase())