void addGByClauseRewrite(ASTNode selectExpr) { if ( gByClauseAdditions == null ) { gByClauseAdditions = ""; } if ( !addGroupByClause || !gByClauseAdditions.equals("") ) { gByClauseAdditions += ", "; } gByClauseAdditions += stream.toString( selectExpr.getTokenStartIndex(), selectExpr.getTokenStopIndex()); }
void addGByClauseRewrite(ASTNode selectExpr) { if ( gByClauseAdditions == null ) { gByClauseAdditions = ""; } if ( !addGroupByClause || !gByClauseAdditions.equals("") ) { gByClauseAdditions += ", "; } gByClauseAdditions += stream.toString( selectExpr.getTokenStartIndex(), selectExpr.getTokenStopIndex()); }
void addSelectClauseRewrite(ASTNode selectExpr, String alias) { if ( selectClauseAdditions == null ) { selectClauseAdditions = ""; } selectClauseAdditions += ", " + stream.toString(selectExpr.getTokenStartIndex(), selectExpr.getTokenStopIndex()) + " as " + alias; }
private static String getCheckExpression(ASTNode checkExprAST, final TokenRewriteStream tokenRewriteStream) throws SemanticException{ return tokenRewriteStream.toOriginalString(checkExprAST.getTokenStartIndex(), checkExprAST.getTokenStopIndex()); }
void addSelectClauseRewrite(ASTNode selectExpr, String alias) { if ( selectClauseAdditions == null ) { selectClauseAdditions = ""; } selectClauseAdditions += ", " + stream.toString(selectExpr.getTokenStartIndex(), selectExpr.getTokenStopIndex()) + " as " + alias; }
/** * This allows us to take an arbitrary ASTNode and turn it back into SQL that produced it without * needing to understand what it is (except for QuotedIdentifiers). */ private String getMatchedText(ASTNode n) { quotedIdenfierHelper.visit(n); return ctx.getTokenRewriteStream().toString(n.getTokenStartIndex(), n.getTokenStopIndex() + 1).trim(); }
private void addCondition(StringBuilder b, ASTNode cond, boolean rewritten) { if ( !rewritten ) { b.append(stream.toString(cond.getTokenStartIndex(), cond.getTokenStopIndex())); } else { addReference(b, cond); } }
private String getMatchedText(ASTNode n) { return getTokenRewriteStream().toString(n.getTokenStartIndex(), n.getTokenStopIndex() + 1).trim(); } /**
/** * This allows us to take an arbitrary ASTNode and turn it back into SQL that produced it without * needing to understand what it is (except for QuotedIdentifiers) * */ private String getMatchedText(ASTNode n) { quotedIdenfierHelper.visit(n); return ctx.getTokenRewriteStream().toString(n.getTokenStartIndex(), n.getTokenStopIndex() + 1).trim(); } /**
private void addCondition(StringBuilder b, ASTNode cond, boolean rewritten) { if ( !rewritten ) { b.append(stream.toString(cond.getTokenStartIndex(), cond.getTokenStopIndex())); } else { addReference(b, cond); } }
private String getMatchedText(ASTNode n) { return getTokenRewriteStream().toString(n.getTokenStartIndex(), n.getTokenStopIndex() + 1).trim(); } /**
void addWhereClauseRewrite(ASTNode predicate) { String cond = stream.toString(predicate.getTokenStartIndex(), predicate.getTokenStopIndex()); addWhereClauseRewrite(cond); }
void addWhereClauseRewrite(ASTNode predicate) { String cond = stream.toString(predicate.getTokenStartIndex(), predicate.getTokenStopIndex()); addWhereClauseRewrite(cond); }
private String getQueryStringFromAst(ASTNode ast) { StringBuilder sb = new StringBuilder(); int startIdx = ast.getTokenStartIndex(); int endIdx = ast.getTokenStopIndex(); boolean queryNeedsQuotes = true; if (conf.getVar(ConfVars.HIVE_QUOTEDID_SUPPORT).equals("none")) { queryNeedsQuotes = false; } for (int idx = startIdx; idx <= endIdx; idx++) { Token curTok = ctx.getTokenRewriteStream().get(idx); if (curTok.getType() == Token.EOF) { continue; } else if (queryNeedsQuotes && curTok.getType() == HiveLexer.Identifier) { // The Tokens have no distinction between Identifiers and QuotedIdentifiers. // Ugly solution is just to surround all identifiers with quotes. sb.append('`'); // Re-escape any backtick (`) characters in the identifier. sb.append(curTok.getText().replaceAll("`", "``")); sb.append('`'); } else { sb.append(curTok.getText()); } } return sb.toString(); }
@Override public Object dupTree(Object t, Object parent) { // Overriden to copy start index / end index, that is needed through optimization, // e.g., for masking/filtering ASTNode astNode = (ASTNode) t; ASTNode astNodeCopy = (ASTNode) super.dupTree(t, parent); astNodeCopy.setTokenStartIndex(astNode.getTokenStartIndex()); astNodeCopy.setTokenStopIndex(astNode.getTokenStopIndex()); return astNodeCopy; }
addRewrites(stream, qb, program, out); out.println("\nRewritten Query:\n" + stream.toString(program, ast.getTokenStartIndex(), ast.getTokenStopIndex())); } finally { stream.deleteProgram(program);
public QBSubQuery(String outerQueryId, int sqIdx, ASTNode subQueryAST, ASTNode parentQueryExpression, SubQueryTypeDef operator, ASTNode originalSQAST, Context ctx) { super(); this.subQueryAST = subQueryAST; this.parentQueryExpression = parentQueryExpression; this.operator = operator; this.outerQueryId = outerQueryId; this.sqIdx = sqIdx; this.alias = "sq_" + this.sqIdx; this.numCorrExprsinSQ = 0; this.numOuterCorrExprsForHaving = 0; String s = ctx.getTokenRewriteStream().toString( originalSQAST.getTokenStartIndex(), originalSQAST.getTokenStopIndex()); originalSQASTOrigin = new ASTNodeOrigin("SubQuery", alias, s, alias, originalSQAST); numOfCorrelationExprsAddedToSQSelect = 0; groupbyAddedToSQ = false; if ( operator.getType() == SubQueryType.NOT_IN ) { notInCheck = new NotInCheck(); } subQueryDiagnostic = SubQueryDiagnostic.getRewrite(this, ctx.getTokenRewriteStream(), ctx); }
public QBSubQuery(String outerQueryId, int sqIdx, ASTNode subQueryAST, ASTNode parentQueryExpression, SubQueryTypeDef operator, ASTNode originalSQAST, Context ctx) { super(); this.subQueryAST = subQueryAST; this.parentQueryExpression = parentQueryExpression; this.operator = operator; this.outerQueryId = outerQueryId; this.sqIdx = sqIdx; this.alias = "sq_" + this.sqIdx; this.numCorrExprsinSQ = 0; this.numOuterCorrExprsForHaving = 0; String s = ctx.getTokenRewriteStream().toString( originalSQAST.getTokenStartIndex(), originalSQAST.getTokenStopIndex()); originalSQASTOrigin = new ASTNodeOrigin("SubQuery", alias, s, alias, originalSQAST); numOfCorrelationExprsAddedToSQSelect = 0; groupbyAddedToSQ = false; if ( operator.getType() == SubQueryType.NOT_IN ) { notInCheck = new NotInCheck(); } subQueryDiagnostic = SubQueryDiagnostic.getRewrite(this, ctx.getTokenRewriteStream(), ctx); }
void addRewrites(TokenRewriteStream stream, QB qb, String program, PrintStream out) { QBSubQuery sqW = qb.getWhereClauseSubQueryPredicate(); QBSubQuery sqH = qb.getHavingClauseSubQueryPredicate(); if (sqW != null || sqH != null) { ASTNode sqNode = sqW != null ? sqW.getOriginalSubQueryASTForRewrite() : sqH.getOriginalSubQueryASTForRewrite(); ASTNode tokQry = getQueryASTNode(sqNode); ASTNode tokFrom = (ASTNode) tokQry.getChild(0); StringBuilder addedJoins = new StringBuilder(); if (sqW != null) { addRewrites(stream, sqW, program, out, qb.getId(), true, addedJoins); } if (sqH != null) { addRewrites(stream, sqH, program, out, qb.getId(), false, addedJoins); } stream.insertAfter(program, tokFrom.getTokenStopIndex(), addedJoins); } Set<String> sqAliases = qb.getSubqAliases(); for(String sqAlias : sqAliases) { addRewrites(stream, qb.getSubqForAlias(sqAlias).getQB(), program, out); } }
void addRewrites(TokenRewriteStream stream, QB qb, String program, PrintStream out) { QBSubQuery sqW = qb.getWhereClauseSubQueryPredicate(); QBSubQuery sqH = qb.getHavingClauseSubQueryPredicate(); if (sqW != null || sqH != null) { ASTNode sqNode = sqW != null ? sqW.getOriginalSubQueryASTForRewrite() : sqH.getOriginalSubQueryASTForRewrite(); ASTNode tokQry = getQueryASTNode(sqNode); ASTNode tokFrom = (ASTNode) tokQry.getChild(0); StringBuilder addedJoins = new StringBuilder(); if (sqW != null) { addRewrites(stream, sqW, program, out, qb.getId(), true, addedJoins); } if (sqH != null) { addRewrites(stream, sqH, program, out, qb.getId(), false, addedJoins); } stream.insertAfter(program, tokFrom.getTokenStopIndex(), addedJoins); } Set<String> sqAliases = qb.getSubqAliases(); for(String sqAlias : sqAliases) { addRewrites(stream, qb.getSubqForAlias(sqAlias).getQB(), program, out); } }