/** Comparison operator */ public void operatorCompare( HplsqlParser.Bool_expr_binaryContext ctx, HplsqlParser.Bool_expr_binary_operatorContext op) { Var v1 = evalPop(ctx.expr(0)); Var v2 = evalPop(ctx.expr(1)); int cmp = v1.compareTo(v2); boolean bool = false; if (op.T_GREATER() != null) { if (cmp > 0) { bool = true; } } else if (op.T_GREATEREQUAL() != null) { if (cmp >= 0) { bool = true; } } if (op.T_LESS() != null) { if (cmp < 0) { bool = true; } } else if (op.T_LESSEQUAL() != null) { if (cmp <= 0) { bool = true; } } exec.stackPush(bool); }
/** WHERE clause */ public Integer where(HplsqlParser.Where_clauseContext ctx) { StringBuilder sql = new StringBuilder(); sql.append(ctx.T_WHERE().getText()); sql.append(" " + evalPop(ctx.bool_expr())); exec.stackPush(sql); return 0; }
public Integer subselect(HplsqlParser.Subselect_stmtContext ctx) { StringBuilder sql = new StringBuilder(); if (ctx.T_SELECT() != null) { sql.append(ctx.T_SELECT().getText()); } sql.append(" " + evalPop(ctx.select_list())); if (ctx.from_clause() != null) { sql.append(" " + evalPop(ctx.from_clause())); } else { sql.append(" FROM " + conf.dualTable); } if (ctx.where_clause() != null) { sql.append(" " + evalPop(ctx.where_clause())); } if (ctx.group_by_clause() != null) { sql.append(" " + getText(ctx.group_by_clause())); } if (ctx.having_clause() != null) { sql.append(" " + getText(ctx.having_clause())); } if (ctx.order_by_clause() != null) { sql.append(" " + getText(ctx.order_by_clause())); } if (ctx.select_options() != null) { sql.append(" " + evalPop(ctx.select_options())); } if (ctx.select_list().select_list_limit() != null) { sql.append(" LIMIT " + evalPop(ctx.select_list().select_list_limit().expr())); } exec.stackPush(sql); return 0; }
/** Unary boolean expression in executable SQL statement */ public Integer execBoolUnarySql(HplsqlParser.Bool_expr_unaryContext ctx) { StringBuilder sql = new StringBuilder(); if (ctx.T_IS() != null) { sql.append(evalPop(ctx.expr(0)).toString()); sql.append(" " + exec.getText(ctx, ctx.T_IS().getSymbol(), ctx.T_NULL().getSymbol())); } else if (ctx.T_BETWEEN() != null) { sql.append(evalPop(ctx.expr(0)).toString()); sql.append(" " + ctx.T_BETWEEN().getText() + " "); sql.append(evalPop(ctx.expr(1)).toString()); sql.append(" " + ctx.T_AND().getText() + " "); sql.append(evalPop(ctx.expr(2)).toString()); } else if (ctx.T_EXISTS() != null) { exec.append(sql, exec.nvl(ctx.T_NOT(), ctx.T_EXISTS()), ctx.T_OPEN_P()); 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 if (ctx.bool_expr_single_in() != null) { singleInClauseSql(ctx.bool_expr_single_in(), sql); } else if (ctx.bool_expr_multi_in() != null) { multiInClauseSql(ctx.bool_expr_multi_in(), sql); } exec.stackPush(sql); return 0; }
/** FROM TABLE (VALUES ...) clause */ public Integer fromTableValues(HplsqlParser.From_table_values_clauseContext ctx) { StringBuilder sql = new StringBuilder(); int rows = ctx.from_table_values_row().size(); sql.append("("); for (int i = 0; i < rows; i++) { int cols = ctx.from_table_values_row(i).expr().size(); int cols_as = ctx.from_alias_clause().L_ID().size(); sql.append("SELECT "); for (int j = 0; j < cols; j++) { sql.append(evalPop(ctx.from_table_values_row(i).expr(j))); if (j < cols_as) { sql.append(" AS "); sql.append(ctx.from_alias_clause().L_ID(j)); } if (j + 1 < cols) { sql.append(", "); } } sql.append(" FROM " + conf.dualTable); if (i + 1 < rows) { sql.append("\nUNION ALL\n"); } } sql.append(") "); if (ctx.from_alias_clause() != null) { sql.append(ctx.from_alias_clause().ident().getText()); } exec.stackPush(sql); return 0; }
/** Binary boolean expression in executable SQL statement */ public Integer execBoolBinarySql(HplsqlParser.Bool_expr_binaryContext ctx) { StringBuilder sql = new StringBuilder(); sql.append(evalPop(ctx.expr(0)).toString()); sql.append(" " + exec.getFormattedText(ctx.bool_expr_binary_operator()) + " "); sql.append(evalPop(ctx.expr(1)).toString()); exec.stackPush(sql); return 0; }
/** Equality operator */ public void operatorEqual(HplsqlParser.Bool_expr_binaryContext ctx, boolean equal) { Var v1 = evalPop(ctx.expr(0)); Var v2 = evalPop(ctx.expr(1)); boolean eq = v1.equals(v2); if (!equal) { eq = !eq; } exec.stackPush(eq); }
/** Single table name in FROM */ public Integer fromTable(HplsqlParser.From_table_name_clauseContext ctx) { StringBuilder sql = new StringBuilder(); sql.append(evalPop(ctx.table_name())); if (ctx.from_alias_clause() != null) { sql.append(" ").append(exec.getText(ctx.from_alias_clause())); } exec.stackPush(sql); return 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"); } }
/** FROM clause */ public Integer from(HplsqlParser.From_clauseContext ctx) { StringBuilder sql = new StringBuilder(); sql.append(ctx.T_FROM().getText()).append(" "); sql.append(evalPop(ctx.from_table_clause())); int cnt = ctx.from_join_clause().size(); for (int i = 0; i < cnt; i++) { sql.append(evalPop(ctx.from_join_clause(i))); } exec.stackPush(sql); return 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(); } }
/** Part of SELECT */ public Integer fullselect(HplsqlParser.Fullselect_stmtContext ctx) { int cnt = ctx.fullselect_stmt_item().size(); StringBuilder sql = new StringBuilder(); for (int i = 0; i < cnt; i++) { String part = evalPop(ctx.fullselect_stmt_item(i)).toString(); sql.append(part); if (i + 1 != cnt) { sql.append("\n" + getText(ctx.fullselect_set_clause(i)) + "\n"); } } exec.stackPush(sql); return 0; }
/** String concatenation operator in executable SQL statement */ public void operatorConcatSql(HplsqlParser.Expr_concatContext ctx) { StringBuilder sql = new StringBuilder(); sql.append("CONCAT("); int cnt = ctx.expr_concat_item().size(); for (int i = 0; i < cnt; i++) { sql.append(evalPop(ctx.expr_concat_item(i)).toString()); if (i + 1 < cnt) { sql.append(", "); } } sql.append(")"); exec.stackPush(sql); }
/** Evaluate a boolean expression in executable SQL statement */ public void execBoolSql(HplsqlParser.Bool_exprContext ctx) { StringBuilder sql = new StringBuilder(); if (ctx.T_OPEN_P() != null) { sql.append("("); sql.append(evalPop(ctx.bool_expr(0)).toString()); sql.append(")"); } else if (ctx.bool_expr_atom() != null) { sql.append(evalPop(ctx.bool_expr_atom()).toString()); } else if (ctx.bool_expr_logical_operator() != null) { sql.append(evalPop(ctx.bool_expr(0)).toString()); sql.append(" " + ctx.bool_expr_logical_operator().getText() + " "); sql.append(evalPop(ctx.bool_expr(1)).toString()); } exec.stackPush(sql); }
/** JOIN clause in FROM */ public Integer fromJoin(HplsqlParser.From_join_clauseContext ctx) { StringBuilder sql = new StringBuilder(); if (ctx.T_COMMA() != null) { sql.append(", "); sql.append(evalPop(ctx.from_table_clause())); } else if (ctx.from_join_type_clause() != null) { sql.append(" "); sql.append(exec.getText(ctx.from_join_type_clause())); sql.append(" "); sql.append(evalPop(ctx.from_table_clause())); sql.append(" "); sql.append(exec.getText(ctx, ctx.T_ON().getSymbol(), ctx.bool_expr().getStop())); } exec.stackPush(sql); return 0; }
/** Binary boolean expression */ public Integer execBoolBinary(HplsqlParser.Bool_expr_binaryContext ctx) { HplsqlParser.Bool_expr_binary_operatorContext op = ctx.bool_expr_binary_operator(); if (op.T_EQUAL() != null || op.T_EQUAL2() != null) { operatorEqual(ctx, true); } else if (op.T_NOTEQUAL() != null || op.T_NOTEQUAL2() != null) { operatorEqual(ctx, false); } else if (op.T_GREATER() != null || op.T_LESS() != null || op.T_GREATEREQUAL() != null || op.T_LESSEQUAL() != null) { operatorCompare(ctx, op); } else { exec.stackPush(false); } return 0; }
/** Searched CASE expression in executable SQL statement */ public void execSearchedCaseSql(HplsqlParser.Expr_case_searchedContext ctx) { StringBuilder sql = new StringBuilder(); sql.append("CASE"); int cnt = ctx.T_WHEN().size(); for (int i = 0; i < cnt; i++) { sql.append(" WHEN "); sql.append(evalPop(ctx.bool_expr(i)).toString()); sql.append(" THEN "); sql.append(evalPop(ctx.expr(i)).toString()); } if (ctx.T_ELSE() != null) { sql.append(" ELSE "); sql.append(evalPop(ctx.expr(cnt)).toString()); } sql.append(" END"); exec.stackPush(sql); }
/** Common table expression (WITH clause) */ public Integer cte(HplsqlParser.Cte_select_stmtContext ctx) { int cnt = ctx.cte_select_stmt_item().size(); StringBuilder sql = new StringBuilder(); sql.append("WITH "); for (int i = 0; i < cnt; i++) { HplsqlParser.Cte_select_stmt_itemContext c = ctx.cte_select_stmt_item(i); sql.append(c.ident().getText()); if (c.cte_select_cols() != null) { sql.append(" " + exec.getFormattedText(c.cte_select_cols())); } sql.append(" AS ("); sql.append(evalPop(ctx.cte_select_stmt_item(i).fullselect_stmt()).toString()); sql.append(")"); if (i + 1 != cnt) { sql.append(",\n"); } } exec.stackPush(sql); return 0; }
/** Cursor attribute %ISOPEN, %FOUND and %NOTFOUND */ public void execCursorAttribute(HplsqlParser.Expr_cursor_attributeContext ctx) { String name = ctx.ident().getText(); Var val = new Var(Var.Type.BOOL); Var cursor = exec.findCursor(name); if (cursor != null) { Query query = (Query) cursor.value; if (query != null) { if (ctx.T_ISOPEN() != null) { val.setValue(query.isOpen()); } else if (ctx.T_FOUND() != null) { val.setValue(query.isFound()); } else if (ctx.T_NOTFOUND() != null) { val.setValue(query.isNotFound()); } } exec.stackPush(val); } else { trace(ctx, "Cursor not found: " + name); exec.signal(Signal.Type.SQLEXCEPTION); } }
/** 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); }
/** Unary boolean expression */ public Integer execBoolUnary(HplsqlParser.Bool_expr_unaryContext ctx) { boolean val = false; if (ctx.T_IS() != null) { val = evalPop(ctx.expr(0)).isNull(); if (ctx.T_NOT() != null) { val = !val; } } else if (ctx.T_BETWEEN() != null) { Var v = evalPop(ctx.expr(0)); Var v1 = evalPop(ctx.expr(1)); int cmp = v.compareTo(v1); if (cmp >= 0) { Var v2 = evalPop(ctx.expr(2)); cmp = v.compareTo(v2); if (cmp <= 0) { val = true; } } } exec.stackPush(val); return 0; }
/** SELECT list */ public Integer selectList(HplsqlParser.Select_listContext ctx) { StringBuilder sql = new StringBuilder(); if (ctx.select_list_set() != null) { sql.append(exec.getText(ctx.select_list_set())).append(" "); } int cnt = ctx.select_list_item().size(); for (int i = 0; i < cnt; i++) { if (ctx.select_list_item(i).select_list_asterisk() == null) { sql.append(evalPop(ctx.select_list_item(i).expr())); if (ctx.select_list_item(i).select_list_alias() != null) { sql.append(" " + exec.getText(ctx.select_list_item(i).select_list_alias())); } } else { sql.append(exec.getText(ctx.select_list_item(i).select_list_asterisk())); } if (i + 1 < cnt) { sql.append(", "); } } exec.stackPush(sql); return 0; }
/** Evaluate a boolean expression */ public void execBool(HplsqlParser.Bool_exprContext ctx) { if (ctx.bool_expr_atom() != null) { eval(ctx.bool_expr_atom()); return; } Var result = evalPop(ctx.bool_expr(0)); if (ctx.T_OPEN_P() != null) { if (ctx.T_NOT() != null) { result.negate(); } } else if (ctx.bool_expr_logical_operator() != null) { if (ctx.bool_expr_logical_operator().T_AND() != null) { if (result.isTrue()) { result = evalPop(ctx.bool_expr(1)); } } else if (ctx.bool_expr_logical_operator().T_OR() != null) { if (!result.isTrue()) { result = evalPop(ctx.bool_expr(1)); } } } exec.stackPush(result); }
/** Executing or building SELECT statement */ public Integer select(HplsqlParser.Select_stmtContext ctx) { if (ctx.parent instanceof HplsqlParser.StmtContext) { exec.stmtConnList.clear(); trace(ctx, "SELECT"); } boolean oldBuildSql = exec.buildSql; exec.buildSql = true; StringBuilder sql = new StringBuilder(); if (ctx.cte_select_stmt() != null) { sql.append(evalPop(ctx.cte_select_stmt()).toString()); sql.append("\n"); } sql.append(evalPop(ctx.fullselect_stmt()).toString()); exec.buildSql = oldBuildSql; if (!(ctx.parent instanceof HplsqlParser.StmtContext)) { // No need to execute at this stage exec.stackPush(sql); return 0; } if (trace && ctx.parent instanceof HplsqlParser.StmtContext) { trace(ctx, sql.toString()); } if (exec.getOffline()) { trace(ctx, "Not executed - offline mode set"); return 0; } String conn = exec.getStatementConnection(); Query query = exec.executeQuery(ctx, sql.toString(), conn); if (query.error()) { exec.signal(query); return 1; } trace(ctx, "SELECT completed successfully"); exec.setSqlSuccess(); try { ResultSet rs = query.getResultSet(); ResultSetMetaData rm = null; if (rs != null) { rm = rs.getMetaData(); } int into_cnt = getIntoCount(ctx); if (into_cnt > 0) { trace(ctx, "SELECT INTO statement executed"); if (rs.next()) { for (int i = 1; i <= into_cnt; i++) { String into_name = getIntoVariable(ctx, i - 1); Var var = exec.findVariable(into_name); if (var != null) { var.setValue(rs, rm, i); if (trace) { trace(ctx, "COLUMN: " + rm.getColumnName(i) + ", " + rm.getColumnTypeName(i)); trace(ctx, "SET " + var.getName() + " = " + var.toString()); } } else { trace(ctx, "Variable not found: " + into_name); } } exec.incRowCount(); exec.setSqlSuccess(); } else { exec.setSqlCode(100); exec.signal(Signal.Type.NOTFOUND); } } // Print all results for standalone SELECT statement else if (ctx.parent instanceof HplsqlParser.StmtContext) { int cols = rm.getColumnCount(); if (trace) { trace(ctx, "Standalone SELECT executed: " + cols + " columns in the result set"); } while (rs.next()) { for (int i = 1; i <= cols; i++) { if (i > 1) { System.out.print("\t"); } System.out.print(rs.getString(i)); } System.out.println(""); exec.incRowCount(); } } // Scalar subquery else { trace(ctx, "Scalar subquery executed, first row and first column fetched only"); if (rs.next()) { exec.stackPush(new Var().setValue(rs, rm, 1)); exec.setSqlSuccess(); } else { evalNull(); exec.setSqlCode(100); } } } catch (SQLException e) { exec.signal(query); exec.closeQuery(query, exec.conf.defaultConnection); return 1; } exec.closeQuery(query, exec.conf.defaultConnection); return 0; }
/** Evaluate the expression to NULL */ void evalNull() { exec.stackPush(Var.Null); }
/** 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)); }
/** SELECT statement options - LIMIT n, WITH UR i.e */ public Integer option(HplsqlParser.Select_options_itemContext ctx) { if (ctx.T_LIMIT() != null) { exec.stackPush("LIMIT " + evalPop(ctx.expr())); } return 0; }
/** Evaluate the expression to specified String value */ void evalString(String string) { exec.stackPush(new Var(string)); }