2.00.12

2.00.12.1

缺陷修复带来的系统影响

管理员用户调用 shell 函数的权限发生了变化:

  • 之前版本,允许管理员用户调用。

  • 当前版本,默认不允许任何用户调用。可通过设置配置参数 enableShellFunction=true ,允许管理员用户调用。

2.00.12

涉及保持一致性或兼容行业惯例的修改

修改浮点数转换为 DECIMAL 类型的行为:

  • 以前版本,以截断的方式舍入。

  • 当前版本,以四舍五入的方式舍入。

decimal128(0.000009,5)
// 以前版本,output:0.00000
// 当前版本,output:0.00001

缺陷修复带来的系统影响

  • 当分区表参与 asof join 时,如果连接列数大于 1,且前 n-1 列连接列没有同时覆盖参与 asof join 的分区表的所有分区列:
    • 以前版本,可以正常执行。
    • 当前版本,禁止执行,并抛出异常。

    // 创建分区表 dfs://aj_test/pt1 和 dfs://aj_test/pt2 并写入数据
    if(existsDatabase("dfs://aj_test")) dropDatabase("dfs://aj_test")
    db=database("dfs://aj_test", VALUE, 2023.01M..2024.01M, engine='TSDB')
    
    sym=take(`a`b, 20)
    date=2023.01.01 + (1..20) * 5
    value= rand(10.0, 20)
    t1 = table(sym, date, value)
    
    sym=take(`a`b, 20)
    date=2023.01.02 + (1..20) * 5
    price= rand(10.0, 20)
    t2 = table(sym, date, price)
    
    pt1 = db.createPartitionedTable(t1, "pt1", `date, sortColumns=`sym`date).append!(t1)
    pt2 = db.createPartitionedTable(t2, "pt2", `date, sortColumns=`sym`date).append!(t2)
    
    // asof join,连接列为 sym,date,前 n-1 列为 sym,没有覆盖分区列 date
    select * from aj(pt1, pt2, `sym`date)
    // 以前版本,得出结果。
    // 当前版本,抛出异常:In asof join (aj), if the left or right table is a partitioned table, the matching columns except the last one must include all partitioning columns.
  • 当聚合函数和向量函数接收列数为 0 的矩阵作为参数时:
    • 以前版本,不会报错;

    • 当前版本,抛出异常。

    input=matrix(INT,1,0)
    valueChanged(input)
    // 以前版本,不会报错
    // 当前版本,抛出异常:The column number of matrix must be greater than 0.
  • 函数 at(func, arg) arg 是一个元组时的行为改变:
    • 以前版本,如果 func 可以只接收一个参数,会将元组整体作为唯一 参数传入;

    • 当前版本,会将元组的每一个元素作为一个参数传入 func

    def myFunc(x, y=10){
        return x+y
    }
    at(myFunc, (1,2))
    // 以前版本,output:(11,12)
    // 当前版本,output:3
    • 在当前版本中,若需要将元组整体作为唯一 参数,必须将该元组作为另一个元组的唯一元素,然后将这个包含唯一元素的元组作为参数传递。例如:

    def myFunc(x, y=10){
        return x+y
    }
    at(myFunc, [(1,2)])
    // output: (11,12)
  • SQL 查询中,如果谓词 IN 后涉及分布式表的列:
    • 以前版本,表连接时可直接访问该列

    • 当前版本,所有情况下均不可直接访问该列,必须通过 SQL 查询的方式

    // 创建两个分布式表
    if(existsDatabase("dfs://in_test")){
    	dropDatabase("dfs://in_test")
    }
    db=database("dfs://in_test", VALUE, 1..10,,'TSDB')
    t1=table([1 ,1, 2 ,2] as id, "A"+string(1..4) as sym, rand(10.0,4) as val)
    t2=table([1 ,1, 2 ,3] as uid, "A"+string(1..4) as sym, rand(10.0,4) as val)
    pt1=db.createPartitionedTable(t1, `pt1,`id,,`sym).append!(t1)
    pt2=db.createPartitionedTable(t2, `pt2,`uid,,`sym).append!(t2)
    
    // 查询
    select * from pt1 left join pt2 on pt1.id ==pt2.uid where pt1.id in (case when pt1.sym="A1" then 1 end)
    // 以前版本,正常执行并返回结果
    // 当前版本,报错:The '[not] in' predicate cannot be followed by columns from the partitioned table. Please use a subquery instead.
    // 当前版本需通过以下方式执行
    select * from pt1 left join pt2 on pt1.id ==pt2.uid where pt1.id in (select case when sym="A1" then 1 end from pt1)
  • milastNot, mifirstNot,mimax, mimin, mfirstNot, mlastNot, mifirstNot, milastNot, mimaxLast, miminLast 函数中,当 X 是索引序列或者索引矩阵时的行为发生改变:
    • 当索引包含空值时,它们在以前版本上可以正常执行,在当前版本上执行报错。
      data = indexedSeries(NULL 2014.01.12 2014.01.13 2014.01.14 2014.01.15 2014.01.16, 1..6)
      milastNot(data, 4)
      
      //以前版本,返回结果:
      
      label	col1
      	
      2014.01.12	
      2014.01.13	
      2014.01.14	3
      2014.01.15	3
      2014.01.16	3
      
      //当前版本报错:The row index of the matrix can't contain null if window is a time offset.
      
    • 以前版本窗口元素选取方式和普通向量/矩阵相同,即按行选取,这不符合索引序列/矩阵的窗口选取规则,即按时间选取。当前版本,修正了这个错误。
      data = indexedSeries(2014.01.11 2014.01.12 2014.01.13 2014.01.14 2014.01.15 2014.01.16, 1 NULL 3 NULL 4 5)
      milastNot(data, 4)
      
      //以前版本,返回结果:
      label	col1
      2014.01.11	
      2014.01.12	
      2014.01.13	
      2014.01.14	2
      2014.01.15	3
      2014.01.16	3
      
      //当前版本,返回结果:
      label	col1
      2014.01.11	0
      2014.01.12	0
      2014.01.13	2
      2014.01.14	2
      2014.01.15	3
      2014.01.16	3