udf.py 17.8 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
    def test_udf_values(self):
        tdSql.execute("drop function abs_max")        
        tdSql.execute("create function add_one as '/tmp/add_one.so' outputtype int")
81
        tdSql.execute("create aggregate function abs_max as '/tmp/abs_max.so' outputtype bigint;")
82 83
        tdSql.execute("create aggregate function sum_double as '/tmp/sum_double.so' outputtype int bufsize 128;")

W
wenzhouwww 已提交
84
        # UDF bug no 1 -> follow 3 cases about this bug ;
85 86 87
        # tdSql.error("create aggregate function max as '/tmp/abs_max.so' outputtype bigint ;")
        # tdSql.error("create aggregate function avg as '/tmp/abs_max.so' outputtype bigint ;")  
        # tdSql.error("create aggregate function dbs as '/tmp/abs_max.so' outputtype bigint ;")
88

W
wenzhouwww 已提交
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
        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()

W
wenzhouwww 已提交
160
        # UDF bug no 2 -> values of abs_max not inconsistent from common table and stable.
161 162 163
        # 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
W
wenzhouwww 已提交
164 165 166
        # 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
167
  
W
wenzhouwww 已提交
168
        # UDF bug no 3 -> values of abs_max will error for boundary number 
169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191

        # 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)

W
wenzhouwww 已提交
192
        # UDF bug no 4 -> values error while two function work : it is limit that udf can't work with build-in functions.
193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212
        # 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")
D
dapan1121 已提交
213 214
        tdSql.query("select abs_max(number) + 5 from st")
        tdSql.query("select abs_max(number) + 5 from tb1")
215
        tdSql.error("select abs_max(number) + max(id) from st")
D
dapan1121 已提交
216
        tdSql.query("select abs_max(number)*abs_max(val) from st")     
217 218 219 220 221

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

W
wenzhouwww 已提交
222
        #UDF bug no 5 -> not support Nested query
223 224 225 226 227 228 229 230 231 232

        # 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)

W
wenzhouwww 已提交
233 234 235 236 237 238 239 240 241 242 243 244 245
        # UDF bug no 6 -> group by work error
        tdLog.info("======= UDF work with group by =======")

        # tdSql.query("select sum_double(id) from st group by tbname;")
        # tdSql.checkData(0,0,6)
        # tdSql.checkData(0,1,'tb1')
        # tdSql.checkData(1,0,2)
        # tdSql.checkData(1,1,'tb2')
        # tdSql.query("select sum_double(id) from st group by id;")
        # tdSql.checkRows(2)
        # tdSql.query("select sum_double(id) from st group by tbname order by ts asc;")


246 247 248 249 250 251 252
        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)

W
wenzhouwww 已提交
253
        # UDF -> bug no 7 : intervals sliding values calculation error
254 255 256 257 258 259 260 261 262 263 264 265 266
        # 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")

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

W
wenzhouwww 已提交
270
        # UDF -> bug no 8: error return values when create aggregate functions as an scalar_function
271
        # with no aggregate
W
wenzhouwww 已提交
272
        # tdSql.execute("create function abs_max as '/tmp/abs_max.so' outputtype bigint bufsize 128")
273 274 275 276 277 278
        # 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)
        
W
wenzhouwww 已提交
279
        # UDF -> bug  no 9: give bufsize for scalar_function add_one;
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
        # 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)

W
wenzhouwww 已提交
305
        #UDF bug no 10 -> create function datatype of outputtype not match col datatype
306 307 308
        tdSql.execute("drop function abs_max")
        tdSql.execute("drop function sum_double")
        tdSql.execute("drop function add_one")
W
wenzhouwww 已提交
309
        tdSql.execute("create function add_one as '/tmp/add_one.so' outputtype bigint;")
310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329
        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)     

W
wenzhouwww 已提交
330 331 332


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

W
wenzhouwww 已提交
335
        # UDF -> bug  no 12: give aggregate for scalar_function add_one ,it will let taosd coredump as data lost
336 337 338 339
        # 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")

W
wenzhouwww 已提交
340
        # UDF bug no 13 -> follow test case will coredump for taosc
341 342 343
        # tdSql.query("select add_one(*) from st ")
        # tdSql.query("select add_one(*) from tb1 ")

W
wenzhouwww 已提交
344
        # UDF bug no 14 -> follow test case will coredump for taosc
345 346 347 348
        # 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 已提交
349 350 351
    def run(self):
        tdSql.prepare()

352
        tdLog.info("==============step1 prepare udf build=============")
L
liuyq-617 已提交
353
        self.pre_stable()       
354
        tdLog.info("==============step2 prepare udf null =============")
L
liuyq-617 已提交
355
        self.test_udf_null()
356
        tdLog.info("==============step3 prepare udf format ===========")
L
liuyq-617 已提交
357
        self.test_udf_format()
358
        tdLog.info("==============step4 test udf functions============")
L
liuyq-617 已提交
359
        self.test_udf_test()
360 361
        tdLog.info("==============step4 test udf values ============")
        self.test_udf_values()
L
liuyq-617 已提交
362 363 364 365 366 367 368 369

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


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