###################################################################
#           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-11220]<feature>: time related functions
        '''
        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 getISOTimeFmt(self, epoch, precision = None, delta = datetime.timedelta(hours = 8)):
        if precision == "m":
            time = datetime.datetime.fromtimestamp(epoch / 1000, tz = datetime.timezone(delta))
            time_str = time.strftime("%Y-%m-%dT%H:%M:%S.%f%z")
            tz = time_str[-5:]
            return time_str[:-8] + tz
        elif precision == "u":
            time = datetime.datetime.fromtimestamp(epoch / 1000000, tz = datetime.timezone(delta))
            return time.strftime("%Y-%m-%dT%H:%M:%S.%f%z")
        elif precision == "n":
            time = datetime.datetime.fromtimestamp(epoch / 1000000000, tz = datetime.timezone(delta))
            time_str = time.strftime("%Y-%m-%dT%H:%M:%S.%f%z")
            tz = time_str[-5:]
            nanoDigits = str(epoch)[-3:]
            return time_str[:-5] + nanoDigits + tz

        else:
            time = datetime.datetime.fromtimestamp(epoch, tz = datetime.timezone(delta))
            return time.strftime("%Y-%m-%dT%H:%M:%S%z")

    def checkTimestampEqual(self, elm, expect_elm):
        caller = inspect.getframeinfo(inspect.stack()[1][0])
        if len(elm) == len(expect_elm):
            delta = abs(int(elm[-1]) - int(expect_elm[-1]))
            if delta == 1: #ignore 1 second diff
                new_elm = expect_elm[0:-1] + elm[-1]
            else:
                new_elm = expect_elm;
            if elm == new_elm:
                tdLog.info("sql:%s, elm:%s == expect_elm:%s" % (tdSql.sql, elm, new_elm))
            else:
                args = (caller.filename, caller.lineno, tdSql.sql, elm, new_elm)
                tdLog.exit("%s(%d) failed: sql:%s, elm:%s != expect_elm:%s" % args)
        else:
            args = (caller.filename, caller.lineno, tdSql.sql, elm, expect_elm)
            tdLog.exit("%s(%d) failed: sql:%s, elm:%s != expect_elm:%s" % args)


    def run(self):
        print("running {}".format(__file__))

        #Prepare data
        #db precision "ms"
        tdSql.execute("drop database if exists db_m")
        tdSql.execute("create database if not exists db_m")
        tdSql.execute('use db_m')

        tdSql.execute("create stable stb (ts timestamp, col_timestamp timestamp, col_tinyint tinyint, col_smallint smallint, col_int int, col_bigint bigint, col_float float, col_double double, col_bool bool, col_binary binary(10), col_nchar nchar(10)) \
                       tags(tag_timestamp timestamp, tag_tinyint tinyint, tag_smallint smallint, tag_int int, tag_bigint bigint, tag_float float, tag_double double, tag_bool bool, tag_binary binary(10), tag_nchar nchar(10));")
        tdSql.execute("create table ctb using stb tags ('2022-02-02 02:00:00', 1, 1, 1, 1, 1.0, 1.0, true, 'abc', 'abc');")
        tdSql.execute("create table tb (ts timestamp, col_timestamp timestamp, col_tinyint tinyint, col_smallint smallint, col_int int, col_bigint bigint, col_float float, col_double double, col_bool bool, col_binary binary(10), col_nchar nchar(10));")

        tdSql.execute("insert into ctb values ('2022-02-02 02:00:00', '2022-02-02 02:00:00', 1, 1, 1, 1, 1.0, 1.0, true, 'abc', 'abc');")

        tdSql.execute("insert into tb values ('2022-02-02 02:00:00', '2022-02-02 02:00:00', 1, 1, 1, 1, 1.0, 1.0, true, 'abc', 'abc');")

        #db precision "us"
        tdSql.execute("drop database if exists db_u")
        tdSql.execute("create database if not exists db_u precision 'us'")
        tdSql.execute('use db_u')

        tdSql.execute("create stable stb (ts timestamp, col_timestamp timestamp, col_tinyint tinyint, col_smallint smallint, col_int int, col_bigint bigint, col_float float, col_double double, col_bool bool, col_binary binary(10), col_nchar nchar(10)) \
                       tags(tag_timestamp timestamp, tag_tinyint tinyint, tag_smallint smallint, tag_int int, tag_bigint bigint, tag_float float, tag_double double, tag_bool bool, tag_binary binary(10), tag_nchar nchar(10));")
        tdSql.execute("create table ctb using stb tags ('2022-02-02 02:00:00', 1, 1, 1, 1, 1.0, 1.0, true, 'abc', 'abc');")
        tdSql.execute("create table tb (ts timestamp, col_timestamp timestamp, col_tinyint tinyint, col_smallint smallint, col_int int, col_bigint bigint, col_float float, col_double double, col_bool bool, col_binary binary(10), col_nchar nchar(10));")

        tdSql.execute("insert into ctb values ('2022-02-02 02:00:00', '2022-02-02 02:00:00', 1, 1, 1, 1, 1.0, 1.0, true, 'abc', 'abc');")

        tdSql.execute("insert into tb values ('2022-02-02 02:00:00', '2022-02-02 02:00:00', 1, 1, 1, 1, 1.0, 1.0, true, 'abc', 'abc');")

        #db precision "ns"
        tdSql.execute("drop database if exists db_n")
        tdSql.execute("create database if not exists db_n precision 'ns'")
        tdSql.execute('use db_n')

        tdSql.execute("create stable stb (ts timestamp, col_timestamp timestamp, col_tinyint tinyint, col_smallint smallint, col_int int, col_bigint bigint, col_float float, col_double double, col_bool bool, col_binary binary(10), col_nchar nchar(10)) \
                       tags(tag_timestamp timestamp, tag_tinyint tinyint, tag_smallint smallint, tag_int int, tag_bigint bigint, tag_float float, tag_double double, tag_bool bool, tag_binary binary(10), tag_nchar nchar(10));")
        tdSql.execute("create table ctb using stb tags ('2022-02-02 02:00:00', 1, 1, 1, 1, 1.0, 1.0, true, 'abc', 'abc');")
        tdSql.execute("create table tb (ts timestamp, col_timestamp timestamp, col_tinyint tinyint, col_smallint smallint, col_int int, col_bigint bigint, col_float float, col_double double, col_bool bool, col_binary binary(10), col_nchar nchar(10));")

        tdSql.execute("insert into ctb values ('2022-02-02 02:00:00', '2022-02-02 02:00:00', 1, 1, 1, 1, 1.0, 1.0, true, 'abc', 'abc');")

        tdSql.execute("insert into tb values ('2022-02-02 02:00:00', '2022-02-02 02:00:00', 1, 1, 1, 1, 1.0, 1.0, true, 'abc', 'abc');")

        #execute query
        print("============== STEP 1: select to_iso8601() with milliesecond db precision ================== ")

        tdSql.execute('use db_m')

        #epoch as input
        ts = 0
        tdSql.query("select to_iso8601(%d) from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))

        ts = 2743200
        tdSql.query("select to_iso8601(%d) from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))

        ts = 633895200
        tdSql.query("select to_iso8601(%d) from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))

        ts = 1643738400
        tdSql.query("select to_iso8601(%d) from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))

        ts = 1643738400123
        tdSql.query("select to_iso8601(%d) from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts, "m"))
        tdSql.query("select to_iso8601(%d) from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts, "m"))
        tdSql.query("select to_iso8601(%d) from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts, "m"))

        ts = 1643738400000123
        tdSql.query("select to_iso8601(%d) from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts, "u"))
        tdSql.query("select to_iso8601(%d) from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts, "u"))
        tdSql.query("select to_iso8601(%d) from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts, "u"))

        ts = 1643738400000000123
        tdSql.query("select to_iso8601(%d) from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts, "n"))
        tdSql.query("select to_iso8601(%d) from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts, "n"))
        tdSql.query("select to_iso8601(%d) from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts, "n"))

        #timestamp column as input
        tdSql.execute("insert into ctb values ('2022-02-02 02:00:00.001', '2022-02-02 02:00:00.001', 1, 1, 1, 1, 1.0, 1.0, true, 'abc', 'abc');")
        tdSql.execute("insert into ctb values ('2022-02-02 02:00:00.002', '2022-02-02 02:00:00.002', 1, 1, 1, 1, 1.0, 1.0, true, 'abc', 'abc');")
        tdSql.execute("insert into tb values ('2022-02-02 02:00:00.001', '2022-02-02 02:00:00.001', 1, 1, 1, 1, 1.0, 1.0, true, 'abc', 'abc');")
        tdSql.execute("insert into tb values ('2022-02-02 02:00:00.002', '2022-02-02 02:00:00.002', 1, 1, 1, 1, 1.0, 1.0, true, 'abc', 'abc');")

        tdSql.query("select to_iso8601(ts) from tb")
        tdSql.checkRows(3)
        tdSql.checkData(0, 0, "2022-02-02T02:00:00.000+0800")
        tdSql.checkData(1, 0, "2022-02-02T02:00:00.001+0800")
        tdSql.checkData(2, 0, "2022-02-02T02:00:00.002+0800")
        tdSql.query("select to_iso8601(ts) from ctb")
        tdSql.checkRows(3)
        tdSql.checkData(0, 0, "2022-02-02T02:00:00.000+0800")
        tdSql.checkData(1, 0, "2022-02-02T02:00:00.001+0800")
        tdSql.checkData(2, 0, "2022-02-02T02:00:00.002+0800")
        tdSql.query("select to_iso8601(ts) from stb")
        tdSql.checkRows(3)
        tdSql.checkData(0, 0, "2022-02-02T02:00:00.000+0800")
        tdSql.checkData(1, 0, "2022-02-02T02:00:00.001+0800")
        tdSql.checkData(2, 0, "2022-02-02T02:00:00.002+0800")

        tdSql.query("select to_iso8601(col_timestamp) from tb")
        tdSql.checkRows(3)
        tdSql.checkData(0, 0, "2022-02-02T02:00:00.000+0800")
        tdSql.checkData(1, 0, "2022-02-02T02:00:00.001+0800")
        tdSql.checkData(2, 0, "2022-02-02T02:00:00.002+0800")
        tdSql.query("select to_iso8601(col_timestamp) from ctb")
        tdSql.checkRows(3)
        tdSql.checkData(0, 0, "2022-02-02T02:00:00.000+0800")
        tdSql.checkData(1, 0, "2022-02-02T02:00:00.001+0800")
        tdSql.checkData(2, 0, "2022-02-02T02:00:00.002+0800")
        tdSql.query("select to_iso8601(col_timestamp) from stb")
        tdSql.checkRows(3)
        tdSql.checkData(0, 0, "2022-02-02T02:00:00.000+0800")
        tdSql.checkData(1, 0, "2022-02-02T02:00:00.001+0800")
        tdSql.checkData(2, 0, "2022-02-02T02:00:00.002+0800")

        print("============== STEP 2: select to_iso8601() with microsecond db precision ================== ")

        tdSql.execute('use db_u')

        #epoch as input
        ts = 0
        tdSql.query("select to_iso8601(%d) from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))

        ts = 2743200
        tdSql.query("select to_iso8601(%d) from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))

        ts = 633895200
        tdSql.query("select to_iso8601(%d) from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))

        ts = 1643738400
        tdSql.query("select to_iso8601(%d) from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))

        ts = 1643738400123
        tdSql.query("select to_iso8601(%d) from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts, "m"))
        tdSql.query("select to_iso8601(%d) from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts, "m"))
        tdSql.query("select to_iso8601(%d) from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts, "m"))

        ts = 1643738400000123
        tdSql.query("select to_iso8601(%d) from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts, "u"))
        tdSql.query("select to_iso8601(%d) from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts, "u"))
        tdSql.query("select to_iso8601(%d) from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts, "u"))

        ts = 1643738400000000123
        tdSql.query("select to_iso8601(%d) from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts, "n"))
        tdSql.query("select to_iso8601(%d) from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts, "n"))
        tdSql.query("select to_iso8601(%d) from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts, "n"))

        #timestamp column as input
        tdSql.execute("insert into ctb values ('2022-02-02 02:00:00.000001', '2022-02-02 02:00:00.000001', 1, 1, 1, 1, 1.0, 1.0, true, 'abc', 'abc');")
        tdSql.execute("insert into ctb values ('2022-02-02 02:00:00.000002', '2022-02-02 02:00:00.000002', 1, 1, 1, 1, 1.0, 1.0, true, 'abc', 'abc');")
        tdSql.execute("insert into tb values ('2022-02-02 02:00:00.000001', '2022-02-02 02:00:00.000001', 1, 1, 1, 1, 1.0, 1.0, true, 'abc', 'abc');")
        tdSql.execute("insert into tb values ('2022-02-02 02:00:00.000002', '2022-02-02 02:00:00.000002', 1, 1, 1, 1, 1.0, 1.0, true, 'abc', 'abc');")

        tdSql.query("select to_iso8601(ts) from tb")
        tdSql.checkRows(3)
        tdSql.checkData(0, 0, "2022-02-02T02:00:00.000000+0800")
        tdSql.checkData(1, 0, "2022-02-02T02:00:00.000001+0800")
        tdSql.checkData(2, 0, "2022-02-02T02:00:00.000002+0800")
        tdSql.query("select to_iso8601(ts) from ctb")
        tdSql.checkRows(3)
        tdSql.checkData(0, 0, "2022-02-02T02:00:00.000000+0800")
        tdSql.checkData(1, 0, "2022-02-02T02:00:00.000001+0800")
        tdSql.checkData(2, 0, "2022-02-02T02:00:00.000002+0800")
        tdSql.query("select to_iso8601(ts) from stb")
        tdSql.checkRows(3)
        tdSql.checkData(0, 0, "2022-02-02T02:00:00.000000+0800")
        tdSql.checkData(1, 0, "2022-02-02T02:00:00.000001+0800")
        tdSql.checkData(2, 0, "2022-02-02T02:00:00.000002+0800")

        tdSql.query("select to_iso8601(col_timestamp) from tb")
        tdSql.checkRows(3)
        tdSql.checkData(0, 0, "2022-02-02T02:00:00.000000+0800")
        tdSql.checkData(1, 0, "2022-02-02T02:00:00.000001+0800")
        tdSql.checkData(2, 0, "2022-02-02T02:00:00.000002+0800")
        tdSql.query("select to_iso8601(col_timestamp) from ctb")
        tdSql.checkRows(3)
        tdSql.checkData(0, 0, "2022-02-02T02:00:00.000000+0800")
        tdSql.checkData(1, 0, "2022-02-02T02:00:00.000001+0800")
        tdSql.checkData(2, 0, "2022-02-02T02:00:00.000002+0800")
        tdSql.query("select to_iso8601(col_timestamp) from stb")
        tdSql.checkRows(3)
        tdSql.checkData(0, 0, "2022-02-02T02:00:00.000000+0800")
        tdSql.checkData(1, 0, "2022-02-02T02:00:00.000001+0800")
        tdSql.checkData(2, 0, "2022-02-02T02:00:00.000002+0800")

        print("============== STEP 3: select to_iso8601() with nanosecond db precision ================== ")

        tdSql.execute('use db_n')

        ts = 0
        tdSql.query("select to_iso8601(%d) from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))

        ts = 2743200
        tdSql.query("select to_iso8601(%d) from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))

        ts = 633895200
        tdSql.query("select to_iso8601(%d) from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))

        ts = 1643738400
        tdSql.query("select to_iso8601(%d) from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))

        ts = 1643738400123
        tdSql.query("select to_iso8601(%d) from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts, "m"))
        tdSql.query("select to_iso8601(%d) from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts, "m"))
        tdSql.query("select to_iso8601(%d) from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts, "m"))

        ts = 1643738400000123
        tdSql.query("select to_iso8601(%d) from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts, "u"))
        tdSql.query("select to_iso8601(%d) from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts, "u"))
        tdSql.query("select to_iso8601(%d) from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts, "u"))

        ts = 1643738400000000123
        tdSql.query("select to_iso8601(%d) from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts, "n"))
        tdSql.query("select to_iso8601(%d) from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts, "n"))
        tdSql.query("select to_iso8601(%d) from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts, "n"))

        #timestamp column as input
        tdSql.execute("insert into ctb values ('2022-02-02 02:00:00.000000001', '2022-02-02 02:00:00.000000001', 1, 1, 1, 1, 1.0, 1.0, true, 'abc', 'abc');")
        tdSql.execute("insert into ctb values ('2022-02-02 02:00:00.000000002', '2022-02-02 02:00:00.000000002', 1, 1, 1, 1, 1.0, 1.0, true, 'abc', 'abc');")
        tdSql.execute("insert into tb values ('2022-02-02 02:00:00.000000001', '2022-02-02 02:00:00.000000001', 1, 1, 1, 1, 1.0, 1.0, true, 'abc', 'abc');")
        tdSql.execute("insert into tb values ('2022-02-02 02:00:00.000000002', '2022-02-02 02:00:00.000000002', 1, 1, 1, 1, 1.0, 1.0, true, 'abc', 'abc');")

        tdSql.query("select to_iso8601(ts) from tb")
        tdSql.checkRows(3)
        tdSql.checkData(0, 0, "2022-02-02T02:00:00.000000000+0800")
        tdSql.checkData(1, 0, "2022-02-02T02:00:00.000000001+0800")
        tdSql.checkData(2, 0, "2022-02-02T02:00:00.000000002+0800")
        tdSql.query("select to_iso8601(ts) from ctb")
        tdSql.checkRows(3)
        tdSql.checkData(0, 0, "2022-02-02T02:00:00.000000000+0800")
        tdSql.checkData(1, 0, "2022-02-02T02:00:00.000000001+0800")
        tdSql.checkData(2, 0, "2022-02-02T02:00:00.000000002+0800")
        tdSql.query("select to_iso8601(ts) from stb")
        tdSql.checkRows(3)
        tdSql.checkData(0, 0, "2022-02-02T02:00:00.000000000+0800")
        tdSql.checkData(1, 0, "2022-02-02T02:00:00.000000001+0800")
        tdSql.checkData(2, 0, "2022-02-02T02:00:00.000000002+0800")

        tdSql.query("select to_iso8601(col_timestamp) from tb")
        tdSql.checkRows(3)
        tdSql.checkData(0, 0, "2022-02-02T02:00:00.000000000+0800")
        tdSql.checkData(1, 0, "2022-02-02T02:00:00.000000001+0800")
        tdSql.checkData(2, 0, "2022-02-02T02:00:00.000000002+0800")
        tdSql.query("select to_iso8601(col_timestamp) from ctb")
        tdSql.checkRows(3)
        tdSql.checkData(0, 0, "2022-02-02T02:00:00.000000000+0800")
        tdSql.checkData(1, 0, "2022-02-02T02:00:00.000000001+0800")
        tdSql.checkData(2, 0, "2022-02-02T02:00:00.000000002+0800")
        tdSql.query("select to_iso8601(col_timestamp) from stb")
        tdSql.checkRows(3)
        tdSql.checkData(0, 0, "2022-02-02T02:00:00.000000000+0800")
        tdSql.checkData(1, 0, "2022-02-02T02:00:00.000000001+0800")
        tdSql.checkData(2, 0, "2022-02-02T02:00:00.000000002+0800")

        print("============== STEP 4: select to_iso8601() other use cases ================== ")
        tdSql.execute("drop database if exists db_m")
        tdSql.execute("create database if not exists db_m")
        tdSql.execute('use db_m')

        tdSql.execute("create stable stb (ts timestamp, col_timestamp timestamp, col_tinyint tinyint, col_smallint smallint, col_int int, col_bigint bigint, col_float float, col_double double, col_bool bool, col_binary binary(10), col_nchar nchar(10)) \
                       tags(tag_timestamp timestamp, tag_tinyint tinyint, tag_smallint smallint, tag_int int, tag_bigint bigint, tag_float float, tag_double double, tag_bool bool, tag_binary binary(10), tag_nchar nchar(10));")
        tdSql.execute("create table ctb using stb tags ('2022-02-02 02:00:00', 1, 1, 1, 1, 1.0, 1.0, true, 'abc', 'abc');")
        tdSql.execute("create table tb (ts timestamp, col_timestamp timestamp, col_tinyint tinyint, col_smallint smallint, col_int int, col_bigint bigint, col_float float, col_double double, col_bool bool, col_binary binary(10), col_nchar nchar(10));")

        tdSql.execute("insert into ctb values ('2022-02-02 02:00:00', '2022-02-02 02:00:00', 1, 1, 1, 1, 1.0, 1.0, true, 'abc', 'abc');")

        tdSql.execute("insert into tb values ('2022-02-02 02:00:00', '2022-02-02 02:00:00', 1, 1, 1, 1, 1.0, 1.0, true, 'abc', 'abc');")

        ts = 1643738400
        #to_iso8601(), col
        tdSql.query("select to_iso8601(%d),col_bigint from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, 1)
        tdSql.query("select to_iso8601(%d),col_bigint from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, 1)
        tdSql.query("select to_iso8601(%d),col_bigint from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, 1)

        tdSql.query("select to_iso8601(%d),col_bool from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, True)
        tdSql.query("select to_iso8601(%d),col_bool from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, True)
        tdSql.query("select to_iso8601(%d),col_bool from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, True)

        tdSql.query("select to_iso8601(%d),col_float from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, 1.0)
        tdSql.query("select to_iso8601(%d),col_float from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, 1.0)
        tdSql.query("select to_iso8601(%d),col_float from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, 1.0)

        tdSql.query("select to_iso8601(%d),col_binary from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, "abc")
        tdSql.query("select to_iso8601(%d),col_binary from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, "abc")
        tdSql.query("select to_iso8601(%d),col_binary from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, "abc")

        tdSql.query("select ts, col_smallint, col_float, to_iso8601(%d), col_binary, col_timestamp from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(6)
        res = tdSql.getData(0, 0)
        self.checkTimestampEqual(str(res), "2022-02-02 02:00:00")
        tdSql.checkData(0, 1, 1)
        tdSql.checkData(0, 2, 1.0)
        tdSql.checkData(0, 3, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 4, "abc")
        res = tdSql.getData(0, 5)
        self.checkTimestampEqual(str(res), "2022-02-02 02:00:00")
        tdSql.query("select ts, col_smallint, col_float, to_iso8601(%d), col_binary, col_timestamp from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(6)
        res = tdSql.getData(0, 0)
        self.checkTimestampEqual(str(res), "2022-02-02 02:00:00")
        tdSql.checkData(0, 1, 1)
        tdSql.checkData(0, 2, 1.0)
        tdSql.checkData(0, 3, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 4, "abc")
        res = tdSql.getData(0, 5)
        self.checkTimestampEqual(str(res), "2022-02-02 02:00:00")
        tdSql.query("select ts, col_smallint, col_float, to_iso8601(%d), col_binary, col_timestamp from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(6)
        res = tdSql.getData(0, 0)
        self.checkTimestampEqual(str(res), "2022-02-02 02:00:00")
        tdSql.checkData(0, 1, 1)
        tdSql.checkData(0, 2, 1.0)
        tdSql.checkData(0, 3, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 4, "abc")
        res = tdSql.getData(0, 5)
        self.checkTimestampEqual(str(res), "2022-02-02 02:00:00")

        #to_iso8601(%d), tag
        tdSql.query("select to_iso8601(%d),tag_bigint from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, 1)
        tdSql.query("select to_iso8601(%d),tag_bigint from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, 1)

        tdSql.query("select to_iso8601(%d),tag_bool from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, True)
        tdSql.query("select to_iso8601(%d),tag_bool from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, True)

        tdSql.query("select to_iso8601(%d),tag_float from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, 1.0)
        tdSql.query("select to_iso8601(%d),tag_float from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, 1.0)

        tdSql.query("select to_iso8601(%d),tag_binary from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, "abc")
        tdSql.query("select to_iso8601(%d),tag_binary from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, "abc")

        tdSql.query("select tag_smallint, tag_float, to_iso8601(%d), tag_binary, tag_timestamp from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(5)
        tdSql.checkData(0, 0, 1)
        tdSql.checkData(0, 1, 1.0)
        tdSql.checkData(0, 2, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 3, "abc")
        res = tdSql.getData(0, 4)
        self.checkTimestampEqual(str(res), "2022-02-02 02:00:00")
        tdSql.query("select tag_smallint, tag_float, to_iso8601(%d), tag_binary, tag_timestamp from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(5)
        tdSql.checkData(0, 0, 1)
        tdSql.checkData(0, 1, 1.0)
        tdSql.checkData(0, 2, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 3, "abc")
        res = tdSql.getData(0, 4)
        self.checkTimestampEqual(str(res), "2022-02-02 02:00:00")

        #to_iso8601(%d),tbname
        tdSql.query("select to_iso8601(%d),tbname from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, "tb")
        tdSql.query("select to_iso8601(%d),tbname from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, "ctb")
        tdSql.query("select to_iso8601(%d),tbname from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, "ctb")

        #to_iso8601(%d),_c0/_C0
        tdSql.query("select to_iso8601(%d),_c0 from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        res = tdSql.getData(0, 1)
        self.checkTimestampEqual(str(res), "2022-02-02 02:00:00")
        tdSql.query("select to_iso8601(%d),_c0 from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        res = tdSql.getData(0, 1)
        self.checkTimestampEqual(str(res), "2022-02-02 02:00:00")
        tdSql.query("select to_iso8601(%d),_c0 from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        res = tdSql.getData(0, 1)
        self.checkTimestampEqual(str(res), "2022-02-02 02:00:00")

        tdSql.query("select _C0,to_iso8601(%d) from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        res = tdSql.getData(0, 0)
        self.checkTimestampEqual(str(res), "2022-02-02 02:00:00")
        tdSql.checkData(0, 1, self.getISOTimeFmt(ts))
        tdSql.query("select _C0,to_iso8601(%d) from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        res = tdSql.getData(0, 0)
        self.checkTimestampEqual(str(res), "2022-02-02 02:00:00")
        tdSql.checkData(0, 1, self.getISOTimeFmt(ts))
        tdSql.query("select _C0,to_iso8601(%d) from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        res = tdSql.getData(0, 0)
        self.checkTimestampEqual(str(res), "2022-02-02 02:00:00")
        tdSql.checkData(0, 1, self.getISOTimeFmt(ts))

        #to_iso8601(),func()
        #can only be used with scalar functions together
        tdSql.query("select to_iso8601(%d),ceil(col_bigint) from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, 1)
        tdSql.query("select to_iso8601(%d),ceil(col_bigint) from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, 1)
        tdSql.query("select to_iso8601(%d),ceil(col_bigint) from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, 1)

        tdSql.query("select to_iso8601(%d),round(col_float) from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, 1.0)
        tdSql.query("select to_iso8601(%d),round(col_float) from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, 1.0)
        tdSql.query("select to_iso8601(%d),round(col_float) from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, 1.0)

        tdSql.query("select to_iso8601(%d),floor(1.5) from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, 1.0)
        tdSql.query("select to_iso8601(%d),floor(1.5) from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, 1.0)
        tdSql.query("select to_iso8601(%d),floor(1.5) from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, 1.0)

        tdSql.query("select abs(-1),to_iso8601(%d) from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, 1)
        tdSql.checkData(0, 1, self.getISOTimeFmt(ts))
        tdSql.query("select abs(-1),to_iso8601(%d) from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, 1)
        tdSql.checkData(0, 1, self.getISOTimeFmt(ts))
        tdSql.query("select abs(-1),to_iso8601(%d) from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, 1)
        tdSql.checkData(0, 1, self.getISOTimeFmt(ts))

        tdSql.query("select pow(2,2),to_iso8601(%d) from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, 4.0)
        tdSql.checkData(0, 1, self.getISOTimeFmt(ts))
        tdSql.query("select pow(2,2),to_iso8601(%d) from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, 4.0)
        tdSql.checkData(0, 1, self.getISOTimeFmt(ts))
        tdSql.query("select pow(2,2),to_iso8601(%d) from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(2)
        tdSql.checkData(0, 0, 4.0)
        tdSql.checkData(0, 1, self.getISOTimeFmt(ts))

        #to_iso8601(%d),to_iso8601(%d)
        tdSql.query("select to_iso8601(%d),to_iso8601(%d),to_iso8601(%d) from tb" %(ts, ts, ts))
        tdSql.checkRows(1)
        tdSql.checkCols(3)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 2, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d),to_iso8601(%d),to_iso8601(%d) from ctb" %(ts, ts, ts))
        tdSql.checkRows(1)
        tdSql.checkCols(3)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 2, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d),to_iso8601(%d),to_iso8601(%d) from stb" %(ts, ts, ts))
        tdSql.checkRows(1)
        tdSql.checkCols(3)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 1, self.getISOTimeFmt(ts))
        tdSql.checkData(0, 2, self.getISOTimeFmt(ts))

        #to_iso8601(%d),constant
        tdSql.query("select 123,123.0,true,'123',to_iso8601(%d) from tb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(5)
        tdSql.checkData(0, 0, 123)
        tdSql.checkData(0, 1, 123.0)
        tdSql.checkData(0, 2, True)
        tdSql.checkData(0, 3, '123')
        tdSql.checkData(0, 4, self.getISOTimeFmt(ts))
        tdSql.query("select 123,123.0,true,'123',to_iso8601(%d) from ctb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(5)
        tdSql.checkData(0, 0, 123)
        tdSql.checkData(0, 1, 123.0)
        tdSql.checkData(0, 2, True)
        tdSql.checkData(0, 3, '123')
        tdSql.checkData(0, 4, self.getISOTimeFmt(ts))
        tdSql.query("select 123,123.0,true,'123',to_iso8601(%d) from stb" %ts)
        tdSql.checkRows(1)
        tdSql.checkCols(5)
        tdSql.checkData(0, 0, 123)
        tdSql.checkData(0, 1, 123.0)
        tdSql.checkData(0, 2, True)
        tdSql.checkData(0, 3, '123')
        tdSql.checkData(0, 4, self.getISOTimeFmt(ts))

        #insert some more data
        tdSql.execute("insert into ctb values ('2022-02-02 02:00:00.001', '2022-02-02 02:00:00.001', 1, 1, 1, 1, 1.0, 1.0, true, 'abc', 'abc');")
        tdSql.execute("insert into tb values ('2022-02-02 02:00:00.001', '2022-02-02 02:00:00.001', 1, 1, 1, 1, 1.0, 1.0, true, 'abc', 'abc');")
        tdSql.execute("insert into ctb values ('2022-02-02 02:00:00.002', '2022-02-02 02:00:00.002', 1, 1, 1, 1, 1.0, 1.0, true, 'abc', 'abc');")
        tdSql.execute("insert into tb values ('2022-02-02 02:00:00.002', '2022-02-02 02:00:00.002', 1, 1, 1, 1, 1.0, 1.0, true, 'abc', 'abc');")

        #order by
        tdSql.query("select to_iso8601(%d) from tb order by ts" %ts)
        tdSql.checkRows(3)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(2, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from ctb order by ts" %ts)
        tdSql.checkRows(3)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(2, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from stb order by ts" %ts)
        tdSql.checkRows(3)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(2, 0, self.getISOTimeFmt(ts))

        tdSql.query("select to_iso8601(%d) from tb order by ts desc" %ts)
        tdSql.checkRows(3)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(2, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from ctb order by ts desc" %ts)
        tdSql.checkRows(3)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(2, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from stb order by ts desc" %ts)
        tdSql.checkRows(3)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(2, 0, self.getISOTimeFmt(ts))

        #limit/offset
        tdSql.query("select to_iso8601(%d) from tb limit 2" %ts)
        tdSql.checkRows(2)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from ctb limit 2" %ts)
        tdSql.checkRows(2)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from stb limit 2" %ts)
        tdSql.checkRows(2)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))

        tdSql.query("select to_iso8601(%d) from tb limit 2 offset 1" %ts)
        tdSql.checkRows(2)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from ctb limit 2 offset 1" %ts)
        tdSql.checkRows(2)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from stb limit 2 offset 1" %ts)
        tdSql.checkRows(2)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))

        tdSql.query("select to_iso8601(%d) from tb limit 1,2" %ts)
        tdSql.checkRows(2)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from ctb limit 1,2" %ts)
        tdSql.checkRows(2)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.query("select to_iso8601(%d) from stb limit 1,2" %ts)
        tdSql.checkRows(2)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))

        #join
        tdSql.execute("create stable stb1 (col_timestamp timestamp, col_tinyint tinyint, col_smallint smallint, col_int int, col_bigint bigint, col_float float, col_double double, col_bool bool, col_binary binary(10), col_nchar nchar(10)) \
                       tags(tag_timestamp timestamp, tag_tinyint tinyint, tag_smallint smallint, tag_int int, tag_bigint bigint, tag_float float, tag_double double, tag_bool bool, tag_binary binary(10), tag_nchar nchar(10));")
        tdSql.execute("create table ctb1 using stb1 tags (now, 1, 1, 1, 1, 1.0, 1.0, true, 'abc', 'abc');")
        tdSql.execute("create table tb1 (col_timestamp timestamp, col_tinyint tinyint, col_smallint smallint, col_int int, col_bigint bigint, col_float float, col_double double, col_bool bool, col_binary binary(10), col_nchar nchar(10));")

        tdSql.execute("insert into ctb1 values ('2022-01-01 00:00:00.000', -9, -9, -9, -9, -9.5, -9.5, true, 'abc', 'abc');")
        tdSql.execute("insert into ctb1 values ('2022-01-01 00:00:00.001', -1, -1, -1, -1, -1.5, -1.5, true, 'abc', 'abc');")
        tdSql.execute("insert into ctb1 values ('2022-01-01 00:00:00.002', 1, 1, 1, 1, 1.5, 1.5, true, 'abc', 'abc');")

        tdSql.execute("insert into tb1 values ('2022-01-01 00:00:00.000', -9, -9, -9, -9, -9.5, -9.5, true, 'abc', 'abc');")
        tdSql.execute("insert into tb1 values ('2022-01-01 00:00:00.001', -1, -1, -1, -1, -1.5, -1.5, true, 'abc', 'abc');")
        tdSql.execute("insert into tb1 values ('2022-01-01 00:00:00.002', 1, 1, 1, 1, 1.5, 1.5, true, 'abc', 'abc');")

        tdSql.execute("create stable stb2 (col_timestamp timestamp, col_tinyint tinyint, col_smallint smallint, col_int int, col_bigint bigint, col_float float, col_double double, col_bool bool, col_binary binary(10), col_nchar nchar(10)) \
                       tags(tag_timestamp timestamp, tag_tinyint tinyint, tag_smallint smallint, tag_int int, tag_bigint bigint, tag_float float, tag_double double, tag_bool bool, tag_binary binary(10), tag_nchar nchar(10));")
        tdSql.execute("create table ctb2 using stb2 tags (now, 1, 1, 1, 1, 1.0, 1.0, true, 'abc', 'abc');")
        tdSql.execute("create table tb2 (col_timestamp timestamp, col_tinyint tinyint, col_smallint smallint, col_int int, col_bigint bigint, col_float float, col_double double, col_bool bool, col_binary binary(10), col_nchar nchar(10));")

        tdSql.execute("insert into ctb2 values ('2022-01-01 00:00:00.000', -9, -9, -9, -9, -9.5, -9.5, true, 'abc', 'abc');")
        tdSql.execute("insert into ctb2 values ('2022-01-01 00:00:00.001', -1, -1, -1, -1, -1.5, -1.5, true, 'abc', 'abc');")
        tdSql.execute("insert into ctb2 values ('2022-01-01 00:00:00.002', 1, 1, 1, 1, 1.5, 1.5, true, 'abc', 'abc');")

        tdSql.execute("insert into tb2 values ('2022-01-01 00:00:00.000', -9, -9, -9, -9, -9.5, -9.5, true, 'abc', 'abc');")
        tdSql.execute("insert into tb2 values ('2022-01-01 00:00:00.001', -1, -1, -1, -1, -1.5, -1.5, true, 'abc', 'abc');")
        tdSql.execute("insert into tb2 values ('2022-01-01 00:00:00.002', 1, 1, 1, 1, 1.5, 1.5, true, 'abc', 'abc');")

        tdSql.query('select to_iso8601(%d) from tb1, tb2 where tb1.col_timestamp = tb2.col_timestamp' %ts);
        tdSql.checkRows(3)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(2, 0, self.getISOTimeFmt(ts))

        tdSql.query('select to_iso8601(%d) from ctb1, ctb2 where ctb1.col_timestamp = ctb2.col_timestamp' %ts);
        tdSql.checkRows(3)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(2, 0, self.getISOTimeFmt(ts))

        tdSql.query('select to_iso8601(%d) from stb1, stb2 where stb1.col_timestamp = stb2.col_timestamp and stb1.tag_int = stb2.tag_int' %ts);
        tdSql.checkRows(3)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(2, 0, self.getISOTimeFmt(ts))

        #union all
        tdSql.query('select to_iso8601(%d) from tb1 union all select to_iso8601(%d) from tb2' %(ts, ts))
        tdSql.checkRows(6)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(2, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(3, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(4, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(5, 0, self.getISOTimeFmt(ts))
        tdSql.query('select to_iso8601(%d) from ctb1 union all select to_iso8601(%d) from ctb2' %(ts, ts))
        tdSql.checkRows(6)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(2, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(3, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(4, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(5, 0, self.getISOTimeFmt(ts))
        tdSql.query('select to_iso8601(%d) from stb1 union all select to_iso8601(%d) from stb2' %(ts, ts))
        tdSql.checkRows(6)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(2, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(3, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(4, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(5, 0, self.getISOTimeFmt(ts))

        #nested query
        tdSql.query('select to_iso8601(%d) from (select * from tb)' %ts)
        tdSql.checkRows(3)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(2, 0, self.getISOTimeFmt(ts))
        tdSql.query('select to_iso8601(%d) from (select * from ctb)' %ts)
        tdSql.checkRows(3)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(2, 0, self.getISOTimeFmt(ts))
        tdSql.query('select to_iso8601(%d) from (select * from stb)' %ts)
        tdSql.checkRows(3)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(2, 0, self.getISOTimeFmt(ts))

        tdSql.query('select to_iso8601(%d) from (select col_int as val from tb)' %ts)
        tdSql.checkRows(3)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(2, 0, self.getISOTimeFmt(ts))
        tdSql.query('select to_iso8601(%d) from (select col_int as val from ctb)' %ts)
        tdSql.checkRows(3)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(2, 0, self.getISOTimeFmt(ts))
        tdSql.query('select to_iso8601(%d) from (select col_int as val from stb)' %ts)
        tdSql.checkRows(3)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(2, 0, self.getISOTimeFmt(ts))

        tdSql.query('select * from (select to_iso8601(%d) from tb)' %ts)
        tdSql.checkRows(3)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(2, 0, self.getISOTimeFmt(ts))
        tdSql.query('select * from (select to_iso8601(%d) from ctb)' %ts)
        tdSql.checkRows(3)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(2, 0, self.getISOTimeFmt(ts))
        tdSql.query('select * from (select to_iso8601(%d) from stb)' %ts)
        tdSql.checkRows(3)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(2, 0, self.getISOTimeFmt(ts))

        tdSql.query('select _c0 from (select to_iso8601(%d) from tb)' %ts)
        tdSql.checkRows(3)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(2, 0, self.getISOTimeFmt(ts))
        tdSql.query('select _c0 from (select to_iso8601(%d) from ctb)' %ts)
        tdSql.checkRows(3)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(2, 0, self.getISOTimeFmt(ts))
        tdSql.query('select _c0 from (select to_iso8601(%d) from stb)' %ts)
        tdSql.checkRows(3)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(2, 0, self.getISOTimeFmt(ts))

        tdSql.query('select to_iso8601(%d) from (select to_iso8601(%d) from tb)' %(ts, ts))
        tdSql.checkRows(3)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(2, 0, self.getISOTimeFmt(ts))
        tdSql.query('select to_iso8601(%d) from (select to_iso8601(%d) from ctb)' %(ts, ts))
        tdSql.checkRows(3)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(2, 0, self.getISOTimeFmt(ts))
        tdSql.query('select to_iso8601(%d) from (select to_iso8601(%d) from stb)' %(ts, ts))
        tdSql.checkRows(3)
        tdSql.checkCols(1)
        tdSql.checkData(0, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(1, 0, self.getISOTimeFmt(ts))
        tdSql.checkData(2, 0, self.getISOTimeFmt(ts))

        ##ERROR CASES
        #param
        tdSql.error("select to_iso8601(16437384001) from tb")
        tdSql.error("select to_iso8601(16437384001) from ctb")
        tdSql.error("select to_iso8601(16437384001) from stb")
        tdSql.error("select to_iso8601(164373840012) from tb")
        tdSql.error("select to_iso8601(164373840012) from ctb")
        tdSql.error("select to_iso8601(164373840012) from stb")
        tdSql.error("select to_iso8601(16437384001231) from tb")
        tdSql.error("select to_iso8601(16437384001231) from ctb")
        tdSql.error("select to_iso8601(16437384001231) from stb")
        tdSql.error("select to_iso8601(164373840012312) from tb")
        tdSql.error("select to_iso8601(164373840012312) from ctb")
        tdSql.error("select to_iso8601(164373840012312) from stb")
        tdSql.error("select to_iso8601(16437384001231231) from tb")
        tdSql.error("select to_iso8601(16437384001231231) from ctb")
        tdSql.error("select to_iso8601(16437384001231231) from stb")
        tdSql.error("select to_iso8601(164373840012312312) from tb")
        tdSql.error("select to_iso8601(164373840012312312) from ctb")
        tdSql.error("select to_iso8601(164373840012312312) from stb")
        tdSql.error("select to_iso8601(16437384001231231231) from tb")
        tdSql.error("select to_iso8601(16437384001231231231) from ctb")
        tdSql.error("select to_iso8601(16437384001231231231) from stb")
        tdSql.error("select to_iso8601(1643738400123123123123456) from tb")
        tdSql.error("select to_iso8601(1643738400123123123123456) from ctb")
        tdSql.error("select to_iso8601(1643738400123123123123456) from stb")
        tdSql.error("select to_iso8601(-1) from tb")
        tdSql.error("select to_iso8601(-1) from ctb")
        tdSql.error("select to_iso8601(true) from tb")
        tdSql.error("select to_iso8601(false) from ctb")
        tdSql.error("select to_iso8601(1.5) from stb")
        tdSql.error("select to_iso8601(1.5) from tb")
        tdSql.error("select to_iso8601(1.5) from ctb")
        tdSql.error("select to_iso8601(1.5) from stb")
        tdSql.error("select to_iso8601(\"abc\") from tb")
        tdSql.error("select to_iso8601(\"abc\") from ctb")
        tdSql.error("select to_iso8601(\"abc\") from stb")
        tdSql.error("select to_iso8601('abc') from tb")
        tdSql.error("select to_iso8601('abc') from ctb")
        tdSql.error("select to_iso8601('abc') from stb")
        tdSql.error("select to_iso8601(to_iso8601) from tb")
        tdSql.error("select to_iso8601(to_iso8601) from ctb")
        tdSql.error("select to_iso8601(to_iso8601) from stb")
        tdSql.error("select to_iso8601(*) from tb")
        tdSql.error("select to_iso8601(*) from ctb")
        tdSql.error("select to_iso8601(*) from stb")
        tdSql.error("select to_iso8601(tbname) from tb")
        tdSql.error("select to_iso8601(tbname) from ctb")
        tdSql.error("select to_iso8601(tbname) from stb")
        tdSql.error("select to_iso8601(col_bigint) from tb")
        tdSql.error("select to_iso8601(col_bigint) from ctb")
        tdSql.error("select to_iso8601(col_bigint) from stb")
        tdSql.error("select to_iso8601(col_double) from tb")
        tdSql.error("select to_iso8601(col_double) from ctb")
        tdSql.error("select to_iso8601(col_double) from stb")
        tdSql.error("select to_iso8601(col_bool) from tb")
        tdSql.error("select to_iso8601(col_bool) from ctb")
        tdSql.error("select to_iso8601(col_bool) from stb")
        tdSql.error("select to_iso8601(col_binary) from tb")
        tdSql.error("select to_iso8601(col_binary) from ctb")
        tdSql.error("select to_iso8601(col_binary) from stb")
        tdSql.error("select to_iso8601(tag_timestamp) from tb")
        tdSql.error("select to_iso8601(tag_timestamp) from ctb")
        tdSql.error("select to_iso8601(tag_timestamp) from stb")
        tdSql.error("select to_iso8601(tag_bigint) from tb")
        tdSql.error("select to_iso8601(tag_bigint) from ctb")
        tdSql.error("select to_iso8601(tag_bigint) from stb")
        tdSql.error("select to_iso8601(tag_double) from tb")
        tdSql.error("select to_iso8601(tag_double) from ctb")
        tdSql.error("select to_iso8601(tag_double) from stb")
        tdSql.error("select to_iso8601(tag_bool) from tb")
        tdSql.error("select to_iso8601(tag_bool) from ctb")
        tdSql.error("select to_iso8601(tag_bool) from stb")
        tdSql.error("select to_iso8601(tag_binary) from tb")
        tdSql.error("select to_iso8601(tag_binary) from ctb")
        tdSql.error("select to_iso8601(tag_binary) from stb")
        tdSql.error("select to_iso8601(1,'abc',col_bigint) from tb")
        tdSql.error("select to_iso8601(1,'abc',col_bigint) from ctb")
        tdSql.error("select to_iso8601(1,'abc',col_bigint) from stb")

        #distinct
        tdSql.error("select distinct to_iso8601(ts) from tb")
        tdSql.error("select distinct to_iso8601(ts) from ctb")
        tdSql.error("select distinct to_iso8601(ts) from stb")

        #arithmetic
        tdSql.error("select to_iso8601(ts) + count(*) from tb")
        tdSql.error("select to_iso8601(ts) + count(*) from ctb")
        tdSql.error("select to_iso8601(ts) + count(*) from stb")
        tdSql.error("select to_iso8601(ts) + avg(col_timestamp) from tb")
        tdSql.error("select to_iso8601(ts) + avg(col_timestamp) from ctb")
        tdSql.error("select to_iso8601(ts) + avg(col_timestamp) from stb")
        tdSql.error("select to_iso8601(ts) + sum(col_int) from tb")
        tdSql.error("select to_iso8601(ts) + sum(col_int) from ctb")
        tdSql.error("select to_iso8601(ts) + sum(col_int) from stb")

        tdSql.error("select to_iso8601(ts) + max(col_timestamp) from tb")
        tdSql.error("select to_iso8601(ts) + max(col_timestamp) from ctb")
        tdSql.error("select to_iso8601(ts) + max(col_timestamp) from stb")
        tdSql.error("select to_iso8601(ts) + first(col_timestamp) from tb")
        tdSql.error("select to_iso8601(ts) + first(col_timestamp) from ctb")
        tdSql.error("select to_iso8601(ts) + first(col_timestamp) from stb")
        tdSql.error("select to_iso8601(ts) + top(col_timestamp, 1) from tb")
        tdSql.error("select to_iso8601(ts) + top(col_timestamp, 1) from ctb")
        tdSql.error("select to_iso8601(ts) + top(col_timestamp, 1) from stb")

        tdSql.error("select to_iso8601(ts) + ceil(col_timestamp) from tb")
        tdSql.error("select to_iso8601(ts) + ceil(col_timestamp) from ctb")
        tdSql.error("select to_iso8601(ts) + ceil(col_timestamp) from stb")
        tdSql.error("select to_iso8601(ts) + floor(col_int) from tb")
        tdSql.error("select to_iso8601(ts) + floor(col_int) from ctb")
        tdSql.error("select to_iso8601(ts) + floor(col_int) from stb")
        tdSql.error("select to_iso8601(ts) + round(1.5) from tb")
        tdSql.error("select to_iso8601(ts) + round(1.5) from ctb")
        tdSql.error("select to_iso8601(ts) + round(1.5) from stb")
        tdSql.error("select to_iso8601(ts) + diff(col_timestamp) from tb")
        tdSql.error("select to_iso8601(ts) + diff(col_timestamp) from ctb")
        tdSql.error("select to_iso8601(ts) + diff(col_timestamp) from stb")

        tdSql.error("select to_iso8601(ts) + 1 from tb")
        tdSql.error("select to_iso8601(ts) + 1 from ctb")
        tdSql.error("select to_iso8601(ts) + 1 from stb")
        tdSql.error("select to_iso8601(ts) + 1.5 from tb")
        tdSql.error("select to_iso8601(ts) + 1.5 from ctb")
        tdSql.error("select to_iso8601(ts) + 1.5 from stb")
        #tdSql.error("select to_iso8601(ts) + true from tb")
        #tdSql.error("select to_iso8601(ts) + true from ctb")
        #tdSql.error("select to_iso8601(ts) + true from stb")
        tdSql.error("select to_iso8601(ts) + 'abc' from tb")
        tdSql.error("select to_iso8601(ts) + 'abc' from ctb")
        tdSql.error("select to_iso8601(ts) + 'abc' from stb")
        tdSql.error("select to_iso8601(ts) + abc from tb")
        tdSql.error("select to_iso8601(ts) + abc from ctb")
        tdSql.error("select to_iso8601(ts) + abc from stb")

        tdSql.error("select to_iso8601(ts) + ts from tb")
        tdSql.error("select to_iso8601(ts) + ts from ctb")
        tdSql.error("select to_iso8601(ts) + ts from stb")
        tdSql.error("select to_iso8601(ts) + col_timestamp from tb")
        tdSql.error("select to_iso8601(ts) + col_timestamp from ctb")
        tdSql.error("select to_iso8601(ts) + col_timestamp from stb")
        tdSql.error("select to_iso8601(ts) + col_tinyint from tb")
        tdSql.error("select to_iso8601(ts) + col_tinyint from ctb")
        tdSql.error("select to_iso8601(ts) + col_tinyint from stb")
        tdSql.error("select to_iso8601(ts) + col_smallint from tb")
        tdSql.error("select to_iso8601(ts) + col_smallint from ctb")
        tdSql.error("select to_iso8601(ts) + col_smallint from stb")
        tdSql.error("select to_iso8601(ts) + col_int from tb")
        tdSql.error("select to_iso8601(ts) + col_int from ctb")
        tdSql.error("select to_iso8601(ts) + col_int from stb")
        tdSql.error("select to_iso8601(ts) + col_bigint from tb")
        tdSql.error("select to_iso8601(ts) + col_bigint from ctb")
        tdSql.error("select to_iso8601(ts) + col_bigint from stb")
        tdSql.error("select to_iso8601(ts) + col_bool from tb")
        tdSql.error("select to_iso8601(ts) + col_bool from ctb")
        tdSql.error("select to_iso8601(ts) + col_bool from stb")
        tdSql.error("select to_iso8601(ts) + col_float from tb")
        tdSql.error("select to_iso8601(ts) + col_float from ctb")
        tdSql.error("select to_iso8601(ts) + col_float from stb")
        tdSql.error("select to_iso8601(ts) + col_double from tb")
        tdSql.error("select to_iso8601(ts) + col_double from ctb")
        tdSql.error("select to_iso8601(ts) + col_double from stb")
        tdSql.error("select to_iso8601(ts) + col_binary from tb")
        tdSql.error("select to_iso8601(ts) + col_binary from ctb")
        tdSql.error("select to_iso8601(ts) + col_binary from stb")
        tdSql.error("select to_iso8601(ts) + col_nchar from tb")
        tdSql.error("select to_iso8601(ts) + col_nchar from ctb")
        tdSql.error("select to_iso8601(ts) + col_nchar from stb")

        tdSql.error("select to_iso8601(ts) + tag_timestamp from tb")
        tdSql.error("select to_iso8601(ts) + tag_timestamp from ctb")
        tdSql.error("select to_iso8601(ts) + tag_timestamp from stb")
        tdSql.error("select to_iso8601(ts) + tag_tinyint from tb")
        tdSql.error("select to_iso8601(ts) + tag_tinyint from ctb")
        tdSql.error("select to_iso8601(ts) + tag_tinyint from stb")
        tdSql.error("select to_iso8601(ts) + tag_smallint from tb")
        tdSql.error("select to_iso8601(ts) + tag_smallint from ctb")
        tdSql.error("select to_iso8601(ts) + tag_smallint from stb")
        tdSql.error("select to_iso8601(ts) + tag_int from tb")
        tdSql.error("select to_iso8601(ts) + tag_int from ctb")
        tdSql.error("select to_iso8601(ts) + tag_int from stb")
        tdSql.error("select to_iso8601(ts) + tag_bigint from tb")
        tdSql.error("select to_iso8601(ts) + tag_bigint from ctb")
        tdSql.error("select to_iso8601(ts) + tag_bigint from stb")
        tdSql.error("select to_iso8601(ts) + tag_bool from tb")
        tdSql.error("select to_iso8601(ts) + tag_bool from ctb")
        tdSql.error("select to_iso8601(ts) + tag_bool from stb")
        tdSql.error("select to_iso8601(ts) + tag_float from tb")
        tdSql.error("select to_iso8601(ts) + tag_float from ctb")
        tdSql.error("select to_iso8601(ts) + tag_float from stb")
        tdSql.error("select to_iso8601(ts) + tag_double from tb")
        tdSql.error("select to_iso8601(ts) + tag_double from ctb")
        tdSql.error("select to_iso8601(ts) + tag_double from stb")
        tdSql.error("select to_iso8601(ts) + tag_binary from tb")
        tdSql.error("select to_iso8601(ts) + tag_binary from ctb")
        tdSql.error("select to_iso8601(ts) + tag_binary from stb")
        tdSql.error("select to_iso8601(ts) + tag_nchar from tb")
        tdSql.error("select to_iso8601(ts) + tag_nchar from ctb")
        tdSql.error("select to_iso8601(ts) + tag_nchar from stb")

        tdSql.error("select to_iso8601(ts) + 0.5b from tb")
        tdSql.error("select to_iso8601(ts) + 0.5b from ctb")
        tdSql.error("select to_iso8601(ts) + 0.5b from stb")
        tdSql.error("select to_iso8601(ts) + 1.5u from tb")
        tdSql.error("select to_iso8601(ts) + 1.5u from ctb")
        tdSql.error("select to_iso8601(ts) + 1.5u from stb")
        tdSql.error("select to_iso8601(ts) + 2.5a from tb")
        tdSql.error("select to_iso8601(ts) + 2.5a from ctb")
        tdSql.error("select to_iso8601(ts) + 2.5a from stb")
        tdSql.error("select to_iso8601(ts) + 3.5s from tb")
        tdSql.error("select to_iso8601(ts) + 3.5s from ctb")
        tdSql.error("select to_iso8601(ts) + 3.5s from stb")
        tdSql.error("select to_iso8601(ts) + 4.5m from tb")
        tdSql.error("select to_iso8601(ts) + 4.5m from ctb")
        tdSql.error("select to_iso8601(ts) + 4.5m from stb")
        tdSql.error("select to_iso8601(ts) + 5.5h from tb")
        tdSql.error("select to_iso8601(ts) + 5.5h from ctb")
        tdSql.error("select to_iso8601(ts) + 5.5h from stb")
        tdSql.error("select to_iso8601(ts) + 6.5d from tb")
        tdSql.error("select to_iso8601(ts) + 6.5d from ctb")
        tdSql.error("select to_iso8601(ts) + 6.5d from stb")
        tdSql.error("select to_iso8601(ts) + 7.5w from tb")
        tdSql.error("select to_iso8601(ts) + 7.5w from ctb")
        tdSql.error("select to_iso8601(ts) + 7.5w from stb")

        tdSql.error("select to_iso8601(ts) - 0.5b from tb")
        tdSql.error("select to_iso8601(ts) - 0.5b from ctb")
        tdSql.error("select to_iso8601(ts) - 0.5b from stb")
        tdSql.error("select to_iso8601(ts) - 1.5u from tb")
        tdSql.error("select to_iso8601(ts) - 1.5u from ctb")
        tdSql.error("select to_iso8601(ts) - 1.5u from stb")
        tdSql.error("select to_iso8601(ts) - 2.5a from tb")
        tdSql.error("select to_iso8601(ts) - 2.5a from ctb")
        tdSql.error("select to_iso8601(ts) - 2.5a from stb")
        tdSql.error("select to_iso8601(ts) - 3.5s from tb")
        tdSql.error("select to_iso8601(ts) - 3.5s from ctb")
        tdSql.error("select to_iso8601(ts) - 3.5s from stb")
        tdSql.error("select to_iso8601(ts) - 4.5m from tb")
        tdSql.error("select to_iso8601(ts) - 4.5m from ctb")
        tdSql.error("select to_iso8601(ts) - 4.5m from stb")
        tdSql.error("select to_iso8601(ts) - 5.5h from tb")
        tdSql.error("select to_iso8601(ts) - 5.5h from ctb")
        tdSql.error("select to_iso8601(ts) - 5.5h from stb")
        tdSql.error("select to_iso8601(ts) - 6.5d from tb")
        tdSql.error("select to_iso8601(ts) - 6.5d from ctb")
        tdSql.error("select to_iso8601(ts) - 6.5d from stb")
        tdSql.error("select to_iso8601(ts) - 7.5w from tb")
        tdSql.error("select to_iso8601(ts) - 7.5w from ctb")
        tdSql.error("select to_iso8601(ts) - 7.5w from stb")

        tdSql.error("select to_iso8601(ts) * 1d from tb")
        tdSql.error("select to_iso8601(ts) * 1d from ctb")
        tdSql.error("select to_iso8601(ts) * 1d from stb")
        tdSql.error("select to_iso8601(ts) / 5m from tb")
        tdSql.error("select to_iso8601(ts) / 5m from ctb")
        tdSql.error("select to_iso8601(ts) / 5m from stb")
        tdSql.error("select to_iso8601(ts) % 10h from tb")
        tdSql.error("select to_iso8601(ts) % 10h from ctb")
        tdSql.error("select to_iso8601(ts) % 10h from stb")
        tdSql.error("select to_iso8601(ts) + 1a * 60b from tb")
        tdSql.error("select to_iso8601(ts) + 1a * 60b from ctb")
        tdSql.error("select to_iso8601(ts) + 1a * 60b from stb")
        tdSql.error("select to_iso8601(ts) + 1s * 60 from tb")
        tdSql.error("select to_iso8601(ts) + 1s * 60 from ctb")
        tdSql.error("select to_iso8601(ts) + 1s * 60 from stb")

        #to_iso8601(ts), func()
        tdSql.error("select to_iso8601(ts),count(*) from tb")
        tdSql.error("select to_iso8601(ts),count(*) from ctb")
        tdSql.error("select to_iso8601(ts),count(*) from stb")
        tdSql.error("select to_iso8601(ts),avg(col_timestamp) from tb")
        tdSql.error("select to_iso8601(ts),avg(col_timestamp) from ctb")
        tdSql.error("select to_iso8601(ts),avg(col_timestamp) from stb")
        tdSql.error("select to_iso8601(ts),sum(col_int) from tb")
        tdSql.error("select to_iso8601(ts),sum(col_int) from ctb")
        tdSql.error("select to_iso8601(ts),sum(col_int) from stb")

        tdSql.error("select to_iso8601(ts),max(col_timestamp) from tb")
        tdSql.error("select to_iso8601(ts),max(col_timestamp) from ctb")
        tdSql.error("select to_iso8601(ts),max(col_timestamp) from stb")
        tdSql.error("select to_iso8601(ts),first(col_timestamp) from tb")
        tdSql.error("select to_iso8601(ts),first(col_timestamp) from ctb")
        tdSql.error("select to_iso8601(ts),first(col_timestamp) from stb")
        tdSql.error("select to_iso8601(ts),top(col_timestamp, 1) from tb")
        tdSql.error("select to_iso8601(ts),top(col_timestamp, 1) from ctb")
        tdSql.error("select to_iso8601(ts),top(col_timestamp, 1) from stb")

        #session
        tdSql.error("select to_iso8601(ts) from tb session(ts, 1d)")
        tdSql.error("select to_iso8601(ts) from ctb session(ts, 1h)")
        tdSql.error("select to_iso8601(ts) from stb session(ts, 1m)")

        #state_window
        tdSql.error('select to_iso8601(ts) from tb state_window(col_timestamp);')
        tdSql.error('select to_iso8601(ts) from tb state_window(col_tinyint);')
        tdSql.error('select to_iso8601(ts) from tb state_window(col_smallint);')
        tdSql.error('select to_iso8601(ts) from tb state_window(col_int);')
        tdSql.error('select to_iso8601(ts) from tb state_window(col_bigint);')
        tdSql.error('select to_iso8601(ts) from tb state_window(col_bool);')
        tdSql.error('select to_iso8601(ts) from tb state_window(col_float);')
        tdSql.error('select to_iso8601(ts) from tb state_window(col_double);')
        tdSql.error('select to_iso8601(ts) from tb state_window(col_binary);')
        tdSql.error('select to_iso8601(ts) from tb state_window(col_nchar);')

        #interval/sliding
        tdSql.error('select to_iso8601(ts) from tb interval(1y)')
        tdSql.error('select to_iso8601(ts) from tb interval(1n)')
        tdSql.error('select to_iso8601(ts) from tb interval(1w)')
        tdSql.error('select to_iso8601(ts) from tb interval(1d)')
        tdSql.error('select to_iso8601(ts) from tb interval(1h)')
        tdSql.error('select to_iso8601(ts) from tb interval(1s)')
        tdSql.error('select to_iso8601(ts) from tb interval(1y) sliding(1y)')
        tdSql.error('select to_iso8601(ts) from tb interval(1n) sliding(1n)')
        tdSql.error('select to_iso8601(ts) from tb interval(1w) sliding(1w)')
        tdSql.error('select to_iso8601(ts) from tb interval(1d) sliding(1d)')
        tdSql.error('select to_iso8601(ts) from tb interval(1h) sliding(1h)')
        tdSql.error('select to_iso8601(ts) from tb interval(1s) sliding(1s)')

        #group by
        tdSql.error('select to_iso8601(ts) from stb group by ts;')
        tdSql.error('select to_iso8601(ts) from stb group by col_tinyint;')
        tdSql.error('select to_iso8601(ts) from stb group by col_smallint;')
        tdSql.error('select to_iso8601(ts) from stb group by col_int;')
        tdSql.error('select to_iso8601(ts) from stb group by col_bigint;')
        tdSql.error('select to_iso8601(ts) from stb group by col_bool;')
        tdSql.error('select to_iso8601(ts) from stb group by col_float;')
        tdSql.error('select to_iso8601(ts) from stb group by col_double;')
        tdSql.error('select to_iso8601(ts) from stb group by col_binary;')
        tdSql.error('select to_iso8601(ts) from stb group by col_nchar;')

        tdSql.error('select to_iso8601(ts) from stb group by tag_tinyint;')
        tdSql.error('select to_iso8601(ts) from stb group by tag_smallint;')
        tdSql.error('select to_iso8601(ts) from stb group by tag_int;')
        tdSql.error('select to_iso8601(ts) from stb group by tag_bigint;')
        tdSql.error('select to_iso8601(ts) from stb group by tag_bool;')
        tdSql.error('select to_iso8601(ts) from stb group by tag_float;')
        tdSql.error('select to_iso8601(ts) from stb group by tag_double;')
        tdSql.error('select to_iso8601(ts) from stb group by tag_binary;')
        tdSql.error('select to_iso8601(ts) from stb group by tag_nchar;')

        tdSql.error('select to_iso8601(ts) from stb group by tbname;')

        tdSql.error('select to_iso8601(ts) from stb group by tag_tinyint,col_tinyint;')
        tdSql.error('select to_iso8601(ts) from stb group by tag_smallint,col_smallint;')
        tdSql.error('select to_iso8601(ts) from stb group by tag_int,col_int;')
        tdSql.error('select to_iso8601(ts) from stb group by tag_bigint,col_bigint;')
        tdSql.error('select to_iso8601(ts) from stb group by tag_bool,col_bool;')
        tdSql.error('select to_iso8601(ts) from stb group by tag_float,col_float;')
        tdSql.error('select to_iso8601(ts) from stb group by tag_double,col_double;')
        tdSql.error('select to_iso8601(ts) from stb group by tag_binary,col_binary;')
        tdSql.error('select to_iso8601(ts) from stb group by tag_nchar,col_nchar;')

        #order by
        tdSql.error('select to_iso8601(ts) from stb order by col_tinyint;')
        tdSql.error('select to_iso8601(ts) from stb order by col_tinyint desc;')
        tdSql.error('select to_iso8601(ts) from stb order by col_smallint;')
        tdSql.error('select to_iso8601(ts) from stb order by col_smallint desc;')
        tdSql.error('select to_iso8601(ts) from stb order by col_int;')
        tdSql.error('select to_iso8601(ts) from stb order by col_int desc;')
        tdSql.error('select to_iso8601(ts) from stb order by col_bigint;')
        tdSql.error('select to_iso8601(ts) from stb order by col_bigint desc;')
        tdSql.error('select to_iso8601(ts) from stb order by col_bool;')
        tdSql.error('select to_iso8601(ts) from stb order by col_bool desc;')
        tdSql.error('select to_iso8601(ts) from stb order by col_float;')
        tdSql.error('select to_iso8601(ts) from stb order by col_float desc;')
        tdSql.error('select to_iso8601(ts) from stb order by col_double;')
        tdSql.error('select to_iso8601(ts) from stb order by col_double desc;')
        tdSql.error('select to_iso8601(ts) from stb order by col_double;')
        tdSql.error('select to_iso8601(ts) from stb order by col_double desc;')

        tdSql.error('select to_iso8601(ts) from stb order by tag_timestamp;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_timestamp desc;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_tinyint;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_tinyint desc;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_smallint;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_smallint desc;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_int;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_int desc;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_bigint;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_bigint desc;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_bool;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_bool desc;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_float;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_float desc;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_double;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_double desc;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_double;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_double desc;')

        tdSql.error('select to_iso8601(ts) from stb order by tbname;')
        tdSql.error('select to_iso8601(ts) from stb order by tbname desc;')

        tdSql.error('select to_iso8601(ts) from stb order by tag_timestamp,col_timestamp;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_timestamp,col_timestamp desc;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_tinyint,col_timestamp;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_tinyint,col_timestamp desc;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_smallint,col_timestamp;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_smallint,col_timestamp desc;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_int,col_timestamp;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_int,col_timestamp desc;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_bigint,col_timestamp;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_bigint,col_timestamp desc;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_bool,col_timestamp;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_bool,col_timestamp desc;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_float,col_timestamp;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_float,col_timestamp desc;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_double,col_timestamp;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_double,col_timestamp desc;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_double,col_timestamp;')
        tdSql.error('select to_iso8601(ts) from stb order by tag_double,col_timestamp desc;')

        tdSql.execute('drop database db_m')
        tdSql.execute('drop database db_u')
        tdSql.execute('drop database db_n')

    def stop(self):
        tdSql.close()
        tdLog.success("%s successfully executed" % __file__)


tdCases.addWindows(__file__, TDTestCase())
tdCases.addLinux(__file__, TDTestCase())
