Uploaded image for project: 'Apache AsterixDB'
  1. Apache AsterixDB
  2. ASTERIXDB-2462

Complex aggregate query puts SQL++ compiler into a recursive loop

    XMLWordPrintableJSON

Details

    Description

      The following query puts *DB into a compile-time loop that causes a stack overflow.

      create type bat as closed {
         id: bigint,
         name: string,
         nationality: string,
         sex: string,
         date_of_birth:string,
         height:double?,
         weight: double?,
         sport: string,
         gold: bigint,
         silver:bigint,
         bronze:bigint,
         info: string? };
       
      create dataset athletes(bat) primary key id;
       
      /* shouldn't actually need any data for this....
      LOAD DATASET athletes USING localfs
          (("path"="localhost://athletes.csv"),("format"="delimited-text"),
          ("delimiter"=","),("header"="true"));
      */
       
      with raw_data as (
        select tobigint(a.id) as aid, sport as series,
      get_year(calendar_duration_from_datetime(current_datetime(),current_date() -
      parse_date(date_of_birth, "Y-M-D") )) as `value`
        from athletes a
        where sport in ["tennis", "wrestling","badminton", "golf", "basketball",
      "gymnastics"] ),
       
      details as (
        select t2.raw_data.`value`, t2.raw_data.series, array_count(t1) total,
      array_position(aidsByValue, t2.raw_data.aid) + 1 as row_number
        from (select value g from raw_data group by series group as g) as t1 unnest t1
      as t2
        let aidsByValue = (select value t1.raw_data.aid from t1 order by
      t1.raw_data.`value`)
      ),
       
      quartiles as (
        select t4.details.series, t4.details.`value`,
          array_avg((
            select value
              case when t3.details.row_number >= (floor(t3.details.total/2.0)/2.0)
                   and  t3.details.row_number <= (floor(t3.details.total/2.0)/2.0) + 1
              then t3.details.`value`/1.0 else null end
            from t3 )) as q1,
       
          array_avg((
            select value
              case when t3.details.row_number >= (t3.details.total/2.0)
                   and  t3.details.row_number <= (t3.details.total/2.0) + 1
              then t3.details.`value`/1.0 else null end
            from t3 )) as median,
       
          array_avg((
            select value
              case when t3.details.row_number >= ceil(t3.details.total/2.0) +
      (floor(t3.details.total/2.0)/2.0)
                   and  t3.details.row_number <= ceil(t3.details.total/2.0) +
      (floor(t3.details.total/2.0)/2.0) + 1
              then t3.details.`value`/1.0 else null end
            from t3 )) as q3
       
        from (select value g from details group by series group as g) as t3 unnest t3
      as t4
      )
       
      select series, min(`value`) AS minimum, avg(q1) AS q1, avg(median) AS median,
      avg(q3) AS q3, max(`value`) AS maximum
      from quartiles
      group by series
      order by median;
       
      

      The prefix of the stack trace is....

      09:51:03.773 [HttpExecutor(port:19001)-4] WARN  org.apache.hyracks.http.server.AbstractServlet - Unhandled throwable
      java.lang.StackOverflowError: null
              at org.apache.asterix.lang.common.struct.VarIdentifier.equals(VarIdentifier.java:66) ~[asterix-lang-common-0.9.4.jar:0.9.4]
              at java.util.Objects.equals(Objects.java:59) ~[?:1.8.0_66]
              at org.apache.asterix.lang.common.expression.VariableExpr.equals(VariableExpr.java:83) ~[asterix-lang-common-0.9.4.jar:0.9.4]
              at java.util.HashMap.getNode(HashMap.java:578) ~[?:1.8.0_66]
              at java.util.HashMap.get(HashMap.java:556) ~[?:1.8.0_66]
              at org.apache.asterix.lang.sqlpp.visitor.SqlppSubstituteExpressionVisitor.preVisit(SqlppSubstituteExpressionVisitor.java:53) ~[asterix-lang-sqlpp-0.9.4.jar:0.9.4]
              at org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppSimpleExpressionVisitor.visit(AbstractSqlppSimpleExpressionVisitor.java:359) ~[asterix-lang-sqlpp-0.9.4.jar:0.9.4]
              at org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppSimpleExpressionVisitor.visit(AbstractSqlppSimpleExpressionVisitor.java:373) ~[asterix-lang-sqlpp-0.9.4.jar:0.9.4]
              at org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppSimpleExpressionVisitor.visit(AbstractSqlppSimpleExpressionVisitor.java:308) ~[asterix-lang-sqlpp-0.9.4.jar:0.9.4]
              at org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppSimpleExpressionVisitor.visit(AbstractSqlppSimpleExpressionVisitor.java:66) ~[asterix-lang-sqlpp-0.9.4.jar:0.9.4]
              at org.apache.asterix.lang.common.expression.CallExpr.accept(CallExpr.java:62) ~[asterix-lang-common-0.9.4.jar:0.9.4]
              at org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppSimpleExpressionVisitor.visit(AbstractSqlppSimpleExpressionVisitor.java:359) ~[asterix-lang-sqlpp-0.9.4.jar:0.9.4]
              at org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppSimpleExpressionVisitor.visit(AbstractSqlppSimpleExpressionVisitor.java:373) ~[asterix-lang-sqlpp-0.9.4.jar:0.9.4]
              at org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppSimpleExpressionVisitor.visit(AbstractSqlppSimpleExpressionVisitor.java:308) ~[asterix-lang-sqlpp-0.9.4.jar:0.9.4]
              at org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppSimpleExpressionVisitor.visit(AbstractSqlppSimpleExpressionVisitor.java:66) ~[asterix-lang-sqlpp-0.9.4.jar:0.9.4]
              at org.apache.asterix.lang.common.expression.CallExpr.accept(CallExpr.java:62) ~[asterix-lang-common-0.9.4.jar:0.9.4]
              at org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppSimpleExpressionVisitor.visit(AbstractSqlppSimpleExpressionVisitor.java:359) ~[asterix-lang-sqlpp-0.9.4.jar:0.9.4]
              at org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppSimpleExpressionVisitor.visit(AbstractSqlppSimpleExpressionVisitor.java:373) ~[asterix-lang-sqlpp-0.9.4.jar:0.9.4]
      

      Attachments

        Activity

          People

            dlychagin-cb Dmitry Lychagin
            dtabass Michael J. Carey
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: