udf.py 17.3 KB
Newer Older
L
liuyq-617 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
###################################################################
#           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
import taos
import os
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())

        self.ts = 1627750800000
        self.numberOfRecords = 10000

    def pre_stable(self):
        os.system("gcc -g -O0 -fPIC -shared ../script/sh/abs_max.c -o /tmp/abs_max.so")
        os.system("gcc -g -O0 -fPIC -shared ../script/sh/add_one.c -o /tmp/add_one.so")
34
        os.system("gcc -g -O0 -fPIC -shared ../script/sh/sum_double.c -o /tmp/sum_double.so")
L
liuyq-617 已提交
35 36 37 38 39 40 41 42 43
        tdSql.execute("create table stb(ts timestamp ,c1 int, c2 bigint) tags(t1 int)") 
        for i in range(50):
            for j in range(200):
                sql = "insert into t%d using stb tags(%d) values(%s,%d,%d)" % (i, i, self.ts + j, 1e2+j, 1e10+j)
                tdSql.execute(sql)
        for i in range(50):
            for j in range(200):
                sql = "insert into t%d using stb tags(%d) values(%s,%d,%d)" % (i, i, self.ts + j + 200 , -1e2-j, -j-1e10)
                tdSql.execute(sql)
44
                
L
liuyq-617 已提交
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
    def test_udf_null(self):
        tdLog.info("test missing parameters")
        tdSql.error("create aggregate function  as '/tmp/abs_maxw.so' outputtype bigint;")
        tdSql.error("create aggregate function abs_max as '' outputtype bigint;")
        tdSql.error("create aggregate function abs_max as  outputtype bigint;")
        tdSql.error("create aggregate function abs_max as '/tmp/abs_maxw.so' ;")
        tdSql.error("create aggregate  abs_max as '/tmp/abs_maxw.so' outputtype bigint;")
        tdSql.execute("create aggregate function abs_max as '/tmp/abs_max.so' outputtype bigint;") 
        tdSql.error("select abs_max() from stb")
        tdSql.error("select abs_max(c2) from ")
        tdSql.execute("drop function abs_max")

    def test_udf_format(self):
        # tdSql.error("create aggregate function avg as '/tmp/abs_max.so' outputtype bigint;")
        tdSql.error("create aggregate function .a as '/tmp/abs_max.so' outputtype bigint;")
        tdSql.error("create aggregate function .11 as '/tmp/abs_max.so' outputtype bigint;")
        tdSql.error("create aggregate function 1a as '/tmp/abs_max.so' outputtype bigint;")
        tdSql.error("create aggregate function \"1+1\" as '/tmp/abs_max.so' outputtype bigint;")
        # tdSql.error("create aggregate function [avg] as '/tmp/abs_max.so' outputtype bigint;")
        tdSql.execute("create aggregate function abs_max as '/tmp/abs_max.so' outputtype bigint;")
        # tdSql.error("create aggregate function abs_max2 as '/tmp/abs_max.so' outputtype bigint;")
        tdSql.execute("drop function abs_max;")
        tdSql.error("create aggregate function abs_max as '/tmp/add_onew.so' outputtype bigint;")

    def test_udf_test(self):
        tdSql.execute("create aggregate function abs_max as '/tmp/abs_max.so' outputtype bigint;")
        tdSql.error("create aggregate function abs_max as '/tmp/add_onew.so' outputtype bigint;")
        sql = 'select abs_max() from db.stb'
        tdSql.error(sql)
        sql = 'select abs_max(c2) from db.stb'
        tdSql.query(sql)
        tdSql.checkData(0,0,1410065607)

78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333
    def test_udf_values(self):
        tdSql.execute("drop function abs_max")        
        tdSql.execute("create function add_one as '/tmp/add_one.so' outputtype int")
        tdSql.execute("create aggregate function abs_max as '/tmp/abs_max.so' outputtype bigint bufsize 128;")
        tdSql.execute("create aggregate function sum_double as '/tmp/sum_double.so' outputtype int bufsize 128;")

        # UDF bug -> follow 3 cases about this bug ;
        # tdSql.error("create aggregate function max as '/tmp/abs_max.so' outputtype bigint bufsize 128;")
        # tdSql.error("create aggregate function avg as '/tmp/abs_max.so' outputtype bigint bufsize 128;")  
        # tdSql.error("create aggregate function dbs as '/tmp/abs_max.so' outputtype bigint bufsize 128;")

        tdSql.execute("drop database if exists test")
        tdSql.execute("create database test")
        tdSql.execute("use test")
        tdSql.execute("create stable st (ts timestamp,id int , val double , number bigint, chars binary(200)) tags (ind int)")
        tdSql.execute("create table tb1 using st tags(1)")
        tdSql.execute("create table tb2 using st tags(2)")
        start_time = 1604298064000
        rows = 5
        tb_nums = 2
        for i in range(1, tb_nums + 1):
             for j in range(rows):
                 start_time += 10
                 tdSql.execute(
                     "insert into tb%d values(%d, %d,%f,%d,%s) " % (i, start_time, j, float(j),j*100, "'str" + str(j) + "'"))
        tdSql.query("select count(*) from st")
        tdSql.execute("create table bound using st tags(3)")
        epoch_time=1604298064000
        intdata1 = -2**31+2
        intdata2 = 2**31-2
        bigintdata1 = -2**63+2
        bigintdata2 = 2**63-2  
        print("insert into bound values(%d, %d , %f, %d , %s)"%(epoch_time,intdata1,float(intdata1),bigintdata1,"'binary"+str(intdata1)+"'"))
        tdSql.execute("insert into bound values(%d, %d , %f, %d , %s)"%(epoch_time,intdata1,float(intdata1),bigintdata1,"'binary"+str(intdata1)+"'"))
        
        tdSql.execute("insert into bound values(%d, %d , %f, %d , %s)"%(epoch_time+10,intdata1+1,float(intdata1+1),bigintdata1+1,"'binary"+str(intdata1+1)+"'"))
        tdSql.execute("insert into bound values(%d, %d , %f, %d , %s)"%(epoch_time+100,intdata2,float(intdata2),bigintdata2,"'binary"+str(intdata2)+"'"))
        tdSql.execute("insert into bound values(%d, %d , %f, %d , %s)"%(epoch_time+1000,intdata2+1,float(intdata2+1),bigintdata2+1,"'binary"+str(intdata2+1)+"'"))
        
        # check super table calculation results
        tdSql.query("select add_one(id) from st")
        tdSql.checkData(0,0,1)
        tdSql.checkData(1,0,2)
        tdSql.checkData(4,0,5)
        tdSql.checkData(5,0,1)
        tdSql.checkData(9,0,5)
        tdSql.checkData(10,0,-2147483645)
        tdSql.checkData(13,0,None)
        # check common table calculation results
        tdSql.query("select add_one(id) from tb1")
        tdSql.checkData(0,0,1)
        tdSql.checkData(1,0,2)
        tdSql.checkData(4,0,5)

        tdSql.error("select add_one(col) from st")

        sqls= ["select add_one(chars) from st",
               "select add_one(val) from st",
               "select add_one(ts) from st"]
        for sql in sqls:
            res = tdSql.getResult(sql)
            if res == []:
                tdLog.info("====== this col not support use UDF , because datatype not match defind in UDF function ======")
            else:
                tdLog.info(" ====== unexpected error occured about UDF function =====")
                sys.exit()

        tdLog.info("======= UDF function abs_max check ======")

        sqls= ["select abs_max(val) from st",
               "select abs_max(id) from st",
               "select abs_max(ts) from st"]
        for sql in sqls:
            res = tdSql.getResult(sql)
            if res == []:
                tdLog.info("====== this col not support use UDF , because datatype not match defind in UDF function ======")
            else:
                tdLog.info(" ====== unexpected error occured about UDF function =====")
                sys.exit()

        # UDF bug -> values of abs_max not inconsistent from common table and stable.
        # tdSql.query("select abs_max(val) from st") # result is 0 rows
        # tdSql.query("select abs_max(val) from tb1")
        # tdSql.checkData(0,0,0)  # this is error result
  
        # UDF bug -> values of abs_max will error for boundary number 

        # check super table calculation results
        # tdSql.query("select abs_max(number) from st")
        # tdSql.checkData(0,0,9223372036854775807) 

        # check common table calculation results 
        tdSql.query("select abs_max(number) from tb1")
        tdSql.checkData(0,0,400)
        tdSql.query("select abs_max(number) from tb2")
        tdSql.checkData(0,0,400)

        # check boundary
        # tdSql.query("select abs_max(number) from bound")
        # tdSql.checkData(0,0,9223372036854775807)

        tdLog.info("======= UDF function sum_double check =======")

        
        tdSql.query("select sum_double(id) from st")
        tdSql.checkData(0,0,44)
        tdSql.query("select sum_double(id) from tb1")
        tdSql.checkData(0,0,20)

        # UDF bug -> values error while two function work : it is limit that udf can't work with build-in functions.
        # tdSql.query("select sum_double(id) , abs_max(number) from tb1")
        # tdSql.checkData(0,0,20)
        # tdSql.checkData(0,0,400)

        # tdSql.query("select sum_double(id) , abs_max(number) from st")
        # tdSql.checkData(0,0,44)
        # tdSql.checkData(0,0,9223372036854775807)

        # UDF not support mix up with build-in functions
        # it seems like not support  scalar_function mix up with aggregate functions
        tdSql.error("select sum_double(id) ,add_one(id) from st")
        tdSql.error("select sum_double(id) ,add_one(id) from tb1")
        tdSql.error("select sum_double(id) ,max(id) from st")
        tdSql.error("select sum_double(id) ,max(id) from tb1")

        # UDF function not support Arithmetic ===================
        tdSql.query("select max(id) + 5 from st")
        tdSql.query("select max(id) + 5 from tb1")
        tdSql.query("select max(id) + avg(val) from st")
        tdSql.query("select max(id) + avg(val) from tb1")
        tdSql.error("select abs_max(number) + 5 from st")
        tdSql.error("select abs_max(number) + 5 from tb1")
        tdSql.error("select abs_max(number) + max(id) from st")
        tdSql.error("select abs_max(number)*abs_max(val) from st")     

        # UDF bug -> values of sum_double not inconsistent from common table and stable.
        # tdSql.query("select sum_double(val) from st") # result is 0 rows
        # tdSql.query("select sum_double(val) from tb1")
        # tdSql.checkData(0,0,0)  # this is error result

        tdLog.info("======= UDF Nested query test =======")
        tdSql.query("select sum(id) from (select id from st)")
        tdSql.checkData(0,0,22)

        #UDF bug -> not support Nested query

        # tdSql.query("select abs_max(number) from (select number from st)")
        # tdSql.checkData(0,0,9223372036854775807)
        # tdSql.query("select abs_max(number) from (select number from bound)")
        # tdSql.checkData(0,0,9223372036854775807)
        # tdSql.query("select sum_double(id) from (select id from st)")
        # tdSql.checkData(0,0,44)
        # tdSql.query("select sum_double(id) from (select id from tb1)")
        # tdSql.checkData(0,0,10)

        tdSql.query("select sum_double(id) from st where ts < now and ind =1 interval(1s)")
        tdSql.checkData(0,1,20)
        tdSql.error("select sum_double(id) from st session(ts, 1s) interval (10s,1s) sliding(10s) fill (NULL) ")
        tdSql.error("select sum_double(id) from st session(ts, 1s)")
        tdSql.query("select sum_double(id) from tb1 session(ts, 1s)")
        tdSql.checkData(0,1,20)

        # UDF -> bug : intervals sliding values calculation error
        # tdSql.query("select sum_double(id) from st where ts < now and ind =1 interval(3s) sliding (1s) limit 2")
        # tdSql.checkData(0,1,20)
        # tdSql.checkData(1,1,20)
        
        # scalar_function can't work when using interval and sliding =========
        tdSql.error("select add_one(id) from st where ts < now and ind =1 interval(3s) sliding (1s) limit 2 ")

        tdLog.info(" =====================test illegal creation method =====================")
        
        tdSql.execute("drop function add_one")
        tdSql.execute("drop function abs_max")
        tdSql.execute("drop function sum_double")

        tdSql.execute("create aggregate function error_use1 as '/tmp/abs_max.so' outputtype bigint bufsize 128")
        tdSql.error("select error_use1(number) from st")

        # UDF -> bug : error return values when create aggregate functions as an scalar_function
        # with no aggregate
        # tdSql.execute("create  function abs_max as '/tmp/abs_max.so' outputtype bigint bufsize 128")
        # tdSql.query("select abs_max(number) from st")    # this bug will return 3 rows
        # tdSql.checkRows(1)
        # tdSql.execute("create function sum_double as '/tmp/sum_double.so' outputtype bigint bufsize 128")
        # tdSql.execute("select sum_double(id) from st")    
        # tdSql.checkRows(1)
        
        # UDF -> bug : give bufsize for scalar_function add_one;
        # UDF -> need improve : when outputtype is not match datatype which is defined in function codes 
        tdSql.execute("create function add_one as '/tmp/add_one.so' outputtype bigint bufsize 128")
        # tdSql.error("select add_one(val) from st")  # it should return error not [] for not match col datatype
        # tdSql.query("select add_one(id) from st")   # return error query result
        # tdSql.checkData(0,0,1)
        # tdSql.checkData(1,0,2)
        # tdSql.checkData(5,0,1)
        # tdSql.checkData(10,0,-2147483645)
        # tdSql.checkData(13,0,None)


        # UDF -> improve : aggregate function with no bufsize : it seems with no affect 
        # tdSql.execute("drop function abs_max")
        # tdSql.execute("drop function sum_double")
        tdSql.execute("create aggregate function abs_max as '/tmp/abs_max.so' outputtype bigint ")
        tdSql.execute("create aggregate function sum_double as '/tmp/sum_double.so' outputtype int ")
        tdSql.query("select sum_double(id) from st")
        tdSql.checkData(0,0,44)
        tdSql.query("select sum_double(id) from tb1")
        tdSql.checkData(0,0,20)
        # tdSql.query("select abs_max(number) from st")
        # tdSql.checkData(0,0,9223372036854775807) 
        tdSql.query("select abs_max(number) from tb1")
        tdSql.checkData(0,0,400)

        #UDF bug -> create function datatype of outputtype not match col datatype
        tdSql.execute("drop function abs_max")
        tdSql.execute("drop function sum_double")
        tdSql.execute("drop function add_one")
        tdSql.execute("create function add_one as '/tmp/add_one.so' outputtype bigint")
        tdSql.execute("create aggregate function abs_max as '/tmp/abs_max.so' outputtype int bufsize 128;")
        tdSql.execute("create aggregate function sum_double as '/tmp/sum_double.so' outputtype double bufsize 128;")
        # tdSql.query("select sum_double(id) from st")   this bug will return 0.000000
        # tdSql.checkData(0,0,44)
        # tdSql.query("select sum_double(id) from tb1")
        # tdSql.checkData(0,0,20)                        this bug will return 0.000000
        # tdSql.query("select add_one(id) from st")      this bug will return series error values
        # tdSql.checkData(0,0,1)
        # tdSql.checkData(1,0,2)
        # tdSql.checkData(5,0,1)
        # tdSql.checkData(10,0,-2147483645)
        # tdSql.checkData(13,0,None)
        # tdSql.query("select add_one(id) from tb1")     this bug will return series error values
        # tdSql.checkData(0,0,1)
        # tdSql.checkData(2,0,3)
        # tdSql.query("select abs_max(id) from st")
        # tdSql.checkData(0,0,9223372036854775807)     
        tdSql.query("select abs_max(number) from tb1")       # it seems work well
        tdSql.checkData(0,0,400)     

        # UDF bug -> follow test case will coredump for taosd  and let data lost
        # tdSql.query("select add_one(id) from st group by tbname")

        # UDF -> bug : give aggregate for scalar_function add_one ,it will let taosd coredump as data lost
        # tdSql.execute("drop function add_one")
        # tdSql.execute("create  aggregate function add_one as '/tmp/add_one.so' outputtype bigint bufsize 128")
        # tdSql.query("select add_one(id) from st")

        # UDF bug -> follow test case will coredump for taosc
        # tdSql.query("select add_one(*) from st ")
        # tdSql.query("select add_one(*) from tb1 ")

        # UDF bug -> follow test case will coredump for taosc
        # tdSql.query("select abs_max(id),abs_max(number) from st ")
        # tdSql.query("select abs_max(number),abs_max(number) from st ")
        # tdSql.query("select sum_double(id),sum_double(id) from st ")
        
L
liuyq-617 已提交
334 335 336
    def run(self):
        tdSql.prepare()

337
        tdLog.info("==============step1 prepare udf build=============")
L
liuyq-617 已提交
338
        self.pre_stable()       
339
        tdLog.info("==============step2 prepare udf null =============")
L
liuyq-617 已提交
340
        self.test_udf_null()
341
        tdLog.info("==============step3 prepare udf format ===========")
L
liuyq-617 已提交
342
        self.test_udf_format()
343
        tdLog.info("==============step4 test udf functions============")
L
liuyq-617 已提交
344
        self.test_udf_test()
345 346
        tdLog.info("==============step4 test udf values ============")
        self.test_udf_values()
L
liuyq-617 已提交
347 348 349 350 351 352 353 354

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


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