/** * Alipay.com Inc. * Copyright (c) 2004-2012 All Rights Reserved. */ package com.alipay.zdal.parser.sql.dialect.oracle.parser; import com.alipay.zdal.parser.sql.ast.SQLExpr; import com.alipay.zdal.parser.sql.ast.expr.SQLListExpr; import com.alipay.zdal.parser.sql.ast.statement.SQLTableSource; import com.alipay.zdal.parser.sql.ast.statement.SQLUpdateSetItem; import com.alipay.zdal.parser.sql.dialect.oracle.ast.stmt.OracleUpdateStatement; import com.alipay.zdal.parser.sql.parser.Lexer; import com.alipay.zdal.parser.sql.parser.ParserException; import com.alipay.zdal.parser.sql.parser.SQLStatementParser; import com.alipay.zdal.parser.sql.parser.Token; /** * * @author ���� * @version $Id: OracleUpdateParser.java, v 0.1 2012-11-17 ����3:52:30 Exp $ */ public class OracleUpdateParser extends SQLStatementParser { public OracleUpdateParser(String sql) throws ParserException { super(new OracleExprParser(sql)); } public OracleUpdateParser(Lexer lexer) { super(new OracleExprParser(lexer)); } @Override public OracleUpdateStatement parseUpdateStatement() throws ParserException { OracleUpdateStatement update = new OracleUpdateStatement(); if (lexer.token() == Token.UPDATE) { lexer.nextToken(); parseHints(update); if (identifierEquals("ONLY")) { update.setOnly(true); } SQLTableSource tableSource = this.exprParser.createSelectParser().parseTableSource(); update.setTableSource(tableSource); if ((update.getAlias() == null) || (update.getAlias().length() == 0)) { update.setAlias(as()); } } parseSet(update); parseWhere(update); parseReturn(update); parseErrorLoging(update); return update; } private void parseErrorLoging(OracleUpdateStatement update) throws ParserException { if (identifierEquals("LOG")) throw new ParserException("TODO" + update); } private void parseReturn(OracleUpdateStatement update) throws ParserException { if (identifierEquals("RETURN") || lexer.token() == Token.RETURNING) { lexer.nextToken(); for (;;) { SQLExpr item = this.exprParser.expr(); update.getReturning().add(item); if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; } break; } accept(Token.INTO); for (;;) { SQLExpr item = this.exprParser.expr(); update.getReturningInto().add(item); if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; } break; } } } private void parseHints(OracleUpdateStatement update) throws ParserException { if (lexer.token() == Token.HINT) { throw new ParserException("TODO" + update); } } private void parseWhere(OracleUpdateStatement update) throws ParserException { if (lexer.token() == (Token.WHERE)) { lexer.nextToken(); update.setWhere(this.exprParser.expr()); } } private void parseSet(OracleUpdateStatement update) throws ParserException { accept(Token.SET); for (;;) { SQLUpdateSetItem item = new SQLUpdateSetItem(); if (lexer.token() == (Token.LPAREN)) { lexer.nextToken(); SQLListExpr list = new SQLListExpr(); this.exprParser.exprList(list.getItems()); accept(Token.RPAREN); item.setColumn(list); } else { item.setColumn(this.exprParser.primary()); } accept(Token.EQ); item.setValue(this.exprParser.expr()); update.getItems().add(item); if (lexer.token() != Token.COMMA) { break; } lexer.nextToken(); } } }