Beispiel #1
0
 /** Evaluate an expression */
 public void exec(HplsqlParser.ExprContext ctx) {
   try {
     if (ctx.T_ADD() != null) {
       operatorAdd(ctx);
     } else if (ctx.T_SUB() != null) {
       operatorSub(ctx);
     } else if (ctx.T_MUL() != null) {
       operatorMultiply(ctx);
     } else if (ctx.T_DIV() != null) {
       operatorDiv(ctx);
     } else if (ctx.interval_item() != null) {
       createInterval(ctx);
     } else {
       visitChildren(ctx);
     }
   } catch (Exception e) {
     exec.signal(e);
   }
 }
Beispiel #2
0
 /** Division operator */
 public void operatorDiv(HplsqlParser.ExprContext ctx) {
   Var v1 = evalPop(ctx.expr(0));
   Var v2 = evalPop(ctx.expr(1));
   if (v1.value == null || v2.value == null) {
     evalNull();
   } else if (v1.type == Type.BIGINT && v2.type == Type.BIGINT) {
     exec.stackPush(new Var((Long) v1.value / (Long) v2.value));
   } else {
     exec.signal(Signal.Type.UNSUPPORTED_OPERATION, "Unsupported data types in division operator");
   }
 }
Beispiel #3
0
 /** Subtraction operator */
 public void operatorSub(HplsqlParser.ExprContext ctx) {
   Var v1 = evalPop(ctx.expr(0));
   Var v2 = evalPop(ctx.expr(1));
   if (v1.value == null || v2.value == null) {
     evalNull();
   } else if (v1.type == Type.BIGINT && v2.type == Type.BIGINT) {
     exec.stackPush(new Var((Long) v1.value - (Long) v2.value));
   } else if (v1.type == Type.DATE && v2.type == Type.BIGINT) {
     exec.stackPush(changeDateByInt((Date) v1.value, (Long) v2.value, false /*subtract*/));
   } else if (v1.type == Type.DATE && v2.type == Type.INTERVAL) {
     exec.stackPush(
         new Var(((Interval) v2.value).dateChange((Date) v1.value, false /*subtract*/)));
   } else if (v1.type == Type.TIMESTAMP && v2.type == Type.INTERVAL) {
     exec.stackPush(
         new Var(
             ((Interval) v2.value).timestampChange((Timestamp) v1.value, false /*subtract*/),
             v1.scale));
   } else {
     evalNull();
   }
 }
Beispiel #4
0
 /** Evaluate an expression in executable SQL statement */
 public void execSql(HplsqlParser.ExprContext ctx) {
   StringBuilder sql = new StringBuilder();
   if (ctx.T_OPEN_P() != null) {
     sql.append("(");
     if (ctx.select_stmt() != null) {
       exec.append(
           sql,
           evalPop(ctx.select_stmt()).toString(),
           ctx.T_OPEN_P().getSymbol(),
           ctx.select_stmt().getStart());
       exec.append(
           sql, ctx.T_CLOSE_P().getText(), ctx.select_stmt().stop, ctx.T_CLOSE_P().getSymbol());
     } else {
       sql.append(evalPop(ctx.expr(0)).toString());
       sql.append(")");
     }
   } else if (ctx.T_MUL() != null) {
     sql.append(evalPop(ctx.expr(0)).toString());
     sql.append(" * ");
     sql.append(evalPop(ctx.expr(1)).toString());
   } else if (ctx.T_DIV() != null) {
     sql.append(evalPop(ctx.expr(0)).toString());
     sql.append(" / ");
     sql.append(evalPop(ctx.expr(1)).toString());
   } else if (ctx.T_ADD() != null) {
     sql.append(evalPop(ctx.expr(0)).toString());
     sql.append(" + ");
     sql.append(evalPop(ctx.expr(1)).toString());
   } else if (ctx.T_SUB() != null) {
     sql.append(evalPop(ctx.expr(0)).toString());
     sql.append(" - ");
     sql.append(evalPop(ctx.expr(1)).toString());
   } else if (ctx.interval_item() != null) {
     sql.append(exec.getFormattedText(ctx));
   } else {
     visitChildren(ctx);
     sql.append(exec.stackPop().toString());
   }
   exec.stackPush(sql);
 }
Beispiel #5
0
 /** Create an interval variable */
 public void createInterval(HplsqlParser.ExprContext ctx) {
   int num = evalPop(ctx.expr(0)).intValue();
   Interval interval = new Interval().set(num, ctx.interval_item().getText());
   exec.stackPush(new Var(interval));
 }