use of com.facebook.presto.sql.tree.Statement in project airpal by airbnb.
the class QueryExecutionAuthorizer method tablesUsedByQuery.
public static Set<Table> tablesUsedByQuery(String query, String defaultConnector, String defaultSchema) {
List<String> statements = STATEMENT_SPLITTER.splitToList(query);
ImmutableSet.Builder<Table> tables = ImmutableSet.builder();
CatalogSchemaContext context = new CatalogSchemaContext(defaultConnector, defaultSchema);
for (String strStatement : statements) {
InputReferenceExtractor extractor = new InputReferenceExtractor();
Statement statement = SQL_PARSER.createStatement(strStatement);
context = statement.accept(extractor, context);
tables.addAll(extractor.getReferences());
}
return tables.build();
}
use of com.facebook.presto.sql.tree.Statement in project presto by prestodb.
the class LocalQueryRunner method createPlan.
public Plan createPlan(Session session, @Language("SQL") String sql, LogicalPlanner.Stage stage) {
Statement statement = unwrapExecuteStatement(sqlParser.createStatement(sql), sqlParser, session);
assertFormattedSql(sqlParser, statement);
FeaturesConfig featuresConfig = new FeaturesConfig().setDistributedIndexJoinsEnabled(false).setOptimizeHashGeneration(true);
PlanOptimizers planOptimizers = new PlanOptimizers(metadata, sqlParser, featuresConfig, true, new MBeanExporter(new TestingMBeanServer()));
return createPlan(session, sql, planOptimizers.get(), stage);
}
use of com.facebook.presto.sql.tree.Statement in project presto by prestodb.
the class TestAnalyzer method analyze.
private void analyze(Session clientSession, @Language("SQL") String query) {
transaction(transactionManager, accessControl).singleStatement().readUncommitted().readOnly().execute(clientSession, session -> {
Analyzer analyzer = createAnalyzer(session, metadata);
Statement statement = SQL_PARSER.createStatement(query);
analyzer.analyze(statement);
});
}
use of com.facebook.presto.sql.tree.Statement in project presto by prestodb.
the class CreateViewTask method execute.
@Override
public ListenableFuture<?> execute(CreateView statement, TransactionManager transactionManager, Metadata metadata, AccessControl accessControl, QueryStateMachine stateMachine, List<Expression> parameters) {
Session session = stateMachine.getSession();
QualifiedObjectName name = createQualifiedObjectName(session, statement, statement.getName());
accessControl.checkCanCreateView(session.getRequiredTransactionId(), session.getIdentity(), name);
String sql = getFormattedSql(statement.getQuery(), sqlParser, Optional.of(parameters));
Analysis analysis = analyzeStatement(statement, session, metadata, accessControl, parameters);
List<ViewColumn> columns = analysis.getOutputDescriptor(statement.getQuery()).getVisibleFields().stream().map(field -> new ViewColumn(field.getName().get(), field.getType())).collect(toImmutableList());
String data = codec.toJson(new ViewDefinition(sql, session.getCatalog(), session.getSchema(), columns, Optional.of(session.getUser())));
metadata.createView(session, name, data, statement.isReplace());
return immediateFuture(null);
}
use of com.facebook.presto.sql.tree.Statement in project presto by prestodb.
the class SqlQueryManager method createQuery.
@Override
public QueryInfo createQuery(SessionSupplier sessionSupplier, String query) {
requireNonNull(sessionSupplier, "sessionFactory is null");
requireNonNull(query, "query is null");
checkArgument(!query.isEmpty(), "query must not be empty string");
QueryId queryId = queryIdGenerator.createNextQueryId();
Session session = null;
QueryExecution queryExecution;
Statement statement;
try {
session = sessionSupplier.createSession(queryId, transactionManager, accessControl, sessionPropertyManager);
if (query.length() > maxQueryLength) {
int queryLength = query.length();
query = query.substring(0, maxQueryLength);
throw new PrestoException(QUERY_TEXT_TOO_LARGE, format("Query text length (%s) exceeds the maximum length (%s)", queryLength, maxQueryLength));
}
Statement wrappedStatement = sqlParser.createStatement(query);
statement = unwrapExecuteStatement(wrappedStatement, sqlParser, session);
List<Expression> parameters = wrappedStatement instanceof Execute ? ((Execute) wrappedStatement).getParameters() : emptyList();
validateParameters(statement, parameters);
QueryExecutionFactory<?> queryExecutionFactory = executionFactories.get(statement.getClass());
if (queryExecutionFactory == null) {
throw new PrestoException(NOT_SUPPORTED, "Unsupported statement type: " + statement.getClass().getSimpleName());
}
if (statement instanceof Explain && ((Explain) statement).isAnalyze()) {
Statement innerStatement = ((Explain) statement).getStatement();
if (!(executionFactories.get(innerStatement.getClass()) instanceof SqlQueryExecutionFactory)) {
throw new PrestoException(NOT_SUPPORTED, "EXPLAIN ANALYZE only supported for statements that are queries");
}
}
queryExecution = queryExecutionFactory.createQueryExecution(queryId, query, session, statement, parameters);
} catch (ParsingException | PrestoException | SemanticException e) {
// This is intentionally not a method, since after the state change listener is registered
// it's not safe to do any of this, and we had bugs before where people reused this code in a method
URI self = locationFactory.createQueryLocation(queryId);
// if session creation failed, create a minimal session object
if (session == null) {
session = Session.builder(new SessionPropertyManager()).setQueryId(queryId).setIdentity(sessionSupplier.getIdentity()).build();
}
Optional<ResourceGroupId> resourceGroup = Optional.empty();
if (e instanceof QueryQueueFullException) {
resourceGroup = Optional.of(((QueryQueueFullException) e).getResourceGroup());
}
QueryExecution execution = new FailedQueryExecution(queryId, query, resourceGroup, session, self, transactionManager, queryExecutor, metadata, e);
QueryInfo queryInfo = null;
try {
queries.put(queryId, execution);
queryInfo = execution.getQueryInfo();
queryMonitor.queryCreatedEvent(queryInfo);
queryMonitor.queryCompletedEvent(queryInfo);
stats.queryFinished(queryInfo);
} finally {
// execution MUST be added to the expiration queue or there will be a leak
expirationQueue.add(execution);
}
return queryInfo;
}
QueryInfo queryInfo = queryExecution.getQueryInfo();
queryMonitor.queryCreatedEvent(queryInfo);
queryExecution.addFinalQueryInfoListener(finalQueryInfo -> {
try {
QueryInfo info = queryExecution.getQueryInfo();
stats.queryFinished(info);
queryMonitor.queryCompletedEvent(info);
} finally {
expirationQueue.add(queryExecution);
}
});
addStatsListener(queryExecution);
queries.put(queryId, queryExecution);
// start the query in the background
queueManager.submit(statement, queryExecution, queryExecutor);
return queryInfo;
}
Aggregations