/** CREATE TABLE statement */ public Integer createTable(HplsqlParser.Create_table_stmtContext ctx) { trace(ctx, "CREATE TABLE"); StringBuilder sql = new StringBuilder(); sql.append(exec.getText(ctx, ctx.T_CREATE().getSymbol(), ctx.T_OPEN_P().getSymbol())); int cnt = ctx.create_table_columns().create_table_columns_item().size(); int cols = 0; for (int i = 0; i < cnt; i++) { Create_table_columns_itemContext col = ctx.create_table_columns().create_table_columns_item(i); if (col.create_table_column_cons() != null) { continue; } if (cols > 0) { sql.append(",\n"); } sql.append(col.ident().getText()); sql.append(" "); sql.append(exec.evalPop(col.dtype(), col.dtype_len())); cols++; } sql.append("\n)"); if (ctx.create_table_options() != null) { sql.append(" " + evalPop(ctx.create_table_options()).toString()); } trace(ctx, sql.toString()); Query query = exec.executeSql(ctx, sql.toString(), exec.conf.defaultConnection); if (query.error()) { exec.signal(query); return 1; } exec.setSqlSuccess(); exec.closeQuery(query, exec.conf.defaultConnection); return 0; }
/** Create a temporary table statement */ public Integer createTemporaryTable( ParserRuleContext ctx, Create_table_columnsContext colCtx, String name) { String managedName = null; String sql = null; String columns = exec.getFormattedText(colCtx); if (conf.tempTables == Conf.TempTables.NATIVE) { sql = "CREATE TEMPORARY TABLE " + name + "\n(" + columns + "\n)"; } else if (conf.tempTables == Conf.TempTables.MANAGED) { managedName = name + "_" + UUID.randomUUID().toString().replace("-", ""); if (!conf.tempTablesSchema.isEmpty()) { managedName = conf.tempTablesSchema + "." + managedName; } sql = "CREATE TABLE " + managedName + "\n(" + columns + "\n)"; if (!conf.tempTablesLocation.isEmpty()) { sql += "\nLOCATION '" + conf.tempTablesLocation + "/" + managedName + "'"; } if (trace) { trace(ctx, "Managed table name: " + managedName); } } if (sql != null) { Query query = exec.executeSql(ctx, sql, exec.conf.defaultConnection); if (query.error()) { exec.signal(query); return 1; } if (managedName != null) { exec.addManagedTable(name, managedName); } exec.setSqlSuccess(); exec.closeQuery(query, exec.conf.defaultConnection); } return 0; }
/** EXEC, EXECUTE and EXECUTE IMMEDIATE statement to execute dynamic SQL */ public Integer exec(HplsqlParser.Exec_stmtContext ctx) { if (trace) { trace(ctx, "EXECUTE"); } Var vsql = evalPop(ctx.expr()); String sql = vsql.toString(); if (trace) { trace(ctx, "Query: " + sql); } Query query = exec.executeSql(ctx, sql, exec.conf.defaultConnection); if (query.error()) { exec.signal(query); return 1; } ResultSet rs = query.getResultSet(); if (rs != null) { try { ResultSetMetaData rsm = rs.getMetaData(); // Assign to variables if (ctx.T_INTO() != null) { int cols = ctx.L_ID().size(); if (rs.next()) { for (int i = 0; i < cols; i++) { Var var = exec.findVariable(ctx.L_ID(i).getText()); if (var != null) { var.setValue(rs, rsm, i + 1); if (trace) { trace( ctx, "COLUMN: " + rsm.getColumnName(i + 1) + ", " + rsm.getColumnTypeName(i + 1)); trace(ctx, "SET " + var.getName() + " = " + var.toString()); } } else if (trace) { trace(ctx, "Variable not found: " + ctx.L_ID(i).getText()); } } exec.setSqlCode(0); } } // Print the results else { int cols = rsm.getColumnCount(); 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(""); } } } catch (SQLException e) { exec.setSqlCode(e); } } exec.closeQuery(query, exec.conf.defaultConnection); return 0; }
/** SQL INSERT VALUES statement */ public Integer insertValues(HplsqlParser.Insert_stmtContext ctx) { trace(ctx, "INSERT VALUES"); String table = evalPop(ctx.table_name()).toString(); String conn = exec.getObjectConnection(ctx.table_name().getText()); Conn.Type type = exec.getConnectionType(conn); StringBuilder sql = new StringBuilder(); if (type == Conn.Type.HIVE) { sql.append("INSERT INTO TABLE " + table + " "); if (conf.insertValues == Conf.InsertValues.NATIVE) { sql.append("VALUES\n("); } } else { sql.append("INSERT INTO " + table); if (ctx.insert_stmt_cols() != null) { sql.append(" " + exec.getFormattedText(ctx.insert_stmt_cols())); } sql.append(" VALUES\n("); } int rows = ctx.insert_stmt_rows().insert_stmt_row().size(); for (int i = 0; i < rows; i++) { HplsqlParser.Insert_stmt_rowContext row = ctx.insert_stmt_rows().insert_stmt_row(i); int cols = row.expr().size(); for (int j = 0; j < cols; j++) { String value = evalPop(row.expr(j)).toSqlString(); if (j == 0 && type == Conn.Type.HIVE && conf.insertValues == Conf.InsertValues.SELECT) { sql.append("SELECT "); } sql.append(value); if (j + 1 != cols) { sql.append(", "); } } if (type != Conn.Type.HIVE || conf.insertValues == Conf.InsertValues.NATIVE) { if (i + 1 == rows) { sql.append(")"); } else { sql.append("),\n("); } } else if (type == Conn.Type.HIVE && conf.insertValues == Conf.InsertValues.SELECT) { sql.append(" FROM " + conf.dualTable); if (i + 1 < rows) { sql.append("\nUNION ALL\n"); } } } if (trace) { trace(ctx, sql.toString()); } Query query = exec.executeSql(ctx, sql.toString(), conn); if (query.error()) { exec.signal(query); return 1; } exec.setSqlSuccess(); exec.closeQuery(query, exec.conf.defaultConnection); return 0; }
/** MERGE statement */ public Integer merge(HplsqlParser.Merge_stmtContext ctx) { trace(ctx, "MERGE"); String sql = exec.getFormattedText(ctx); trace(ctx, sql); Query query = exec.executeSql(ctx, sql, exec.conf.defaultConnection); if (query.error()) { exec.signal(query); return 1; } exec.setSqlSuccess(); exec.closeQuery(query, exec.conf.defaultConnection); return 0; }
/** SQL INSERT SELECT statement */ public Integer insertSelect(HplsqlParser.Insert_stmtContext ctx) { trace(ctx, "INSERT SELECT"); String table = evalPop(ctx.table_name()).toString(); String select = evalPop(ctx.select_stmt()).toString(); String sql = "INSERT INTO TABLE " + table + " " + select; trace(ctx, sql); Query query = exec.executeSql(ctx, sql, exec.conf.defaultConnection); if (query.error()) { exec.signal(query); return 1; } exec.setSqlSuccess(); exec.closeQuery(query, exec.conf.defaultConnection); return 0; }
/** USE statement */ public Integer use(HplsqlParser.Use_stmtContext ctx) { if (trace) { trace(ctx, "USE"); } String sql = ctx.T_USE().toString() + " " + evalPop(ctx.expr()).toString(); if (trace) { trace(ctx, "Query: " + sql); } Query query = exec.executeSql(ctx, sql, exec.conf.defaultConnection); if (query.error()) { exec.signal(query); return 1; } exec.setSqlCode(0); exec.closeQuery(query, exec.conf.defaultConnection); return 0; }
/** DELETE statement */ public Integer delete(HplsqlParser.Delete_stmtContext ctx) { trace(ctx, "DELETE"); String table = evalPop(ctx.table_name()).toString(); StringBuilder sql = new StringBuilder(); sql.append("DELETE FROM "); sql.append(table); if (ctx.where_clause() != null) { boolean oldBuildSql = exec.buildSql; exec.buildSql = true; sql.append(" " + evalPop(ctx.where_clause()).toString()); exec.buildSql = oldBuildSql; } trace(ctx, sql.toString()); Query query = exec.executeSql(ctx, sql.toString(), exec.conf.defaultConnection); if (query.error()) { exec.signal(query); return 1; } exec.setSqlSuccess(); exec.closeQuery(query, exec.conf.defaultConnection); return 0; }
/** DROP statement */ public Integer drop(HplsqlParser.Drop_stmtContext ctx) { trace(ctx, "DROP"); String sql = null; if (ctx.T_TABLE() != null) { sql = "DROP TABLE "; if (ctx.T_EXISTS() != null) { sql += "IF NOT EXISTS "; } sql += evalPop(ctx.table_name()).toString(); } if (sql != null) { trace(ctx, sql); Query query = exec.executeSql(ctx, sql, exec.conf.defaultConnection); if (query.error()) { exec.signal(query); return 1; } exec.setSqlSuccess(); exec.closeQuery(query, exec.conf.defaultConnection); } return 0; }