/** 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"); } }
/** 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); }
/** 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(); } }
/** 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)); }