/** Evaluate the expression and pop value from the stack */ Var evalPop(ParserRuleContext ctx) { exec.visit(ctx); if (!exec.stack.isEmpty()) { return exec.stackPop(); } return Var.Empty; }
Var evalPop(ParserRuleContext ctx, long def) { if (ctx != null) { exec.visit(ctx); return exec.stackPop(); } return new Var(def); }
/** IF statement (Transact-SQL syntax) */ public Integer ifTsql(HplsqlParser.If_tsql_stmtContext ctx) { trace(ctx, "IF"); visit(ctx.bool_expr()); if (exec.stackPop().isTrue()) { trace(ctx, "IF TRUE executed"); visit(ctx.single_block_stmt(0)); } else if (ctx.T_ELSE() != null) { trace(ctx, "ELSE executed"); visit(ctx.single_block_stmt(1)); } return 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); }