flink-user-zh mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From 张洪涛 <hongtao12...@163.com>
Subject [Blink]Cep SQL code generator bug
Date Wed, 20 Mar 2019 06:40:57 GMT
Hi 


当CEP SQL Pattern中出现aggregate 操作 并且SQL code generator 没有split 情况下
code generator 会出现问题


TableConfigOptions.SQL_CODEGEN_LENGTH_MAX 设置为默认 即48 * 1024


SQL Example


SELECT * 
FROM source 
MATCH_RECOGNIZE (
    PARTITION BY userId 
    ORDER BY proctime 
    MEASURES 
      ...
      SUM(e1.price) as price, 
      e1.behavior as behavior,
      e1.`timestamp`  as `timestamp`
    ONE ROW PER MATCH 
    AFTER MATCH SKIP PAST LAST ROW
    PATTERN (e1+ e2)
    DEFINE
      e1 as SUM(e1.price) > 10000
);




code generator 生成的code 如下 (部分)


可以看到 isNull$26, field$26 在agg函数的scope是没有定义的 而是被定义到了其他函数中


          private org.apache.flink.table.dataformat.GenericRow transformRowForAgg_variable$8(org.apache.flink.table.dataformat.BaseRow
inAgg) {
              org.apache.flink.table.dataformat.GenericRow result$25 = new org.apache.flink.table.dataformat.GenericRow(1);


              isNull$26 = inAgg.isNullAt(2);
              field$26 = -1;
              if (!isNull$26) {
                field$26 = inAgg.getInt(2);
              }
              if (isNull$26) {
                result$25.update(0, null);
              } else {
                result$25.update(0, field$26);
              }


              return result$25;
          }


试着通过修改MatchCodeGenerator.scala代码可以修复 ,但是不确定是否最佳方案



+++ b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/codegen/MatchCodeGenerator.scala
@@ -351,6 +351,7 @@ class MatchCodeGenerator(
       j"""
         public class $funcName extends ${functionClass.getCanonicalName} {
           ${ctx.reuseMemberCode()}
+          ${ctx.reuseFieldCode()}              // 在没有code split 的时候 生成reuseFieldCode


             ${reusePatternLists()}
             ${reuseClassifierLists()}
             ${ctx.reusePerRecordCode()}
-            ${ctx.reuseFieldCode()}      // 将此行注释
             ${ctx.reuseInputUnboxingCode()}
             $bodyCode
           }








--
  Best Regards,
  HongTao

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message