private void parseModelClause(OracleSelectQueryBlock queryBlock) { if (lexer.token() != Token.MODEL) { return; } lexer.nextToken(); ModelClause model = new ModelClause(); parseCellReferenceOptions(model.getCellReferenceOptions()); if (identifierEquals("RETURN")) { lexer.nextToken(); ReturnRowsClause returnRowsClause = new ReturnRowsClause(); if (lexer.token() == Token.ALL) { lexer.nextToken(); returnRowsClause.setAll(true); } else { acceptIdentifier("UPDATED"); } acceptIdentifier("ROWS"); model.setReturnRowsClause(returnRowsClause); } while (lexer.token() == Token.REFERENCE) { ReferenceModelClause referenceModelClause = new ReferenceModelClause(); lexer.nextToken(); SQLExpr name = expr(); referenceModelClause.setName(name); accept(Token.ON); accept(Token.LPAREN); OracleSelect subQuery = this.select(); accept(Token.RPAREN); referenceModelClause.setSubQuery(subQuery); parseModelColumnClause(referenceModelClause); parseCellReferenceOptions(referenceModelClause.getCellReferenceOptions()); model.getReferenceModelClauses().add(referenceModelClause); } parseMainModelClause(model); queryBlock.setModelClause(model); }