@Override public String toString() { return toStringHelper(this) .add("table", table.getName()) .add("where", where) .toString(); } }
public static Table table(QualifiedName name) { return new Table(name); }
@Override public Node visitShowStats(SqlBaseParser.ShowStatsContext context) { return new ShowStats(Optional.of(getLocation(context)), new Table(getQualifiedName(context.qualifiedName()))); }
@Override protected Void visitTable(Table node, Integer indent) { builder.append(formatName(node.getName())); return null; }
@Override public Node visitTable(SqlBaseParser.TableContext context) { return new Table(getLocation(context), getQualifiedName(context.qualifiedName())); }
@Override protected Void visitTable(Table node, Integer indentLevel) { String name = Joiner.on('.').join(node.getName().getParts()); print(indentLevel, "Table[" + name + "]"); return null; }
private String checksumSql(List<Column> columns, QualifiedName table) throws QueryRewriteException { if (columns.isEmpty()) { throw new QueryRewriteException("Table " + table + " has no columns"); } ImmutableList.Builder<SelectItem> selectItems = ImmutableList.builder(); for (Column column : columns) { Expression expression = new Identifier(column.getName()); if (column.isApproximateType()) { expression = new FunctionCall(QualifiedName.of("round"), ImmutableList.of(expression, new LongLiteral(Integer.toString(doublePrecision)))); } selectItems.add(new SingleColumn(new FunctionCall(QualifiedName.of("checksum"), ImmutableList.of(expression)))); } Select select = new Select(false, selectItems.build()); return formatSql(new QuerySpecification(select, Optional.of(new Table(table)), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty()), Optional.empty()); }
private void processRelation(Relation relation, Integer indent) { // TODO: handle this properly if (relation instanceof Table) { builder.append("TABLE ") .append(((Table) relation).getName()) .append('\n'); } else { process(relation, indent); } }
@Override public Node visitTableName(SqlBaseParser.TableNameContext context) { return new Table(getLocation(context), getQualifiedName(context.qualifiedName())); }
@Override protected Void visitDelete(Delete node, Integer context) { builder.append("DELETE FROM ") .append(formatName(node.getTable().getName())); if (node.getWhere().isPresent()) { builder.append(" WHERE ") .append(formatExpression(node.getWhere().get(), parameters)); } return null; }
@Override public Node visitDelete(SqlBaseParser.DeleteContext context) { return new Delete( getLocation(context), new Table(getLocation(context), getQualifiedName(context.qualifiedName())), visitIfPresent(context.booleanExpression(), Expression.class)); }
private Node rewriteShowStats(ShowStats node, Table table, Constraint<ColumnHandle> constraint) { TableHandle tableHandle = getTableHandle(node, table.getName()); TableStatistics tableStatistics = metadata.getTableStatistics(session, tableHandle, constraint); List<String> statsColumnNames = buildColumnsNames(); List<SelectItem> selectItems = buildSelectItems(statsColumnNames); TableMetadata tableMetadata = metadata.getTableMetadata(session, tableHandle); Map<String, ColumnHandle> columnHandles = metadata.getColumnHandles(session, tableHandle); List<Expression> resultRows = buildStatisticsRows(tableMetadata, columnHandles, tableStatistics); return simpleQuery(selectAll(selectItems), aliased(new Values(resultRows), "table_stats_for_" + table.getName(), statsColumnNames)); }
@Test public void testShowStats() { final String[] tableNames = {"t", "s.t", "c.s.t"}; for (String fullName : tableNames) { QualifiedName qualifiedName = QualifiedName.of(Arrays.asList(fullName.split("\\."))); assertStatement(format("SHOW STATS FOR %s", qualifiedName), new ShowStats(new Table(qualifiedName))); } }
@Override protected Scope visitTable(Table table, Optional<Scope> scope) if (!table.getName().getPrefix().isPresent()) { String name = table.getName().getSuffix(); QualifiedObjectName name = createQualifiedObjectName(session, table, table.getName()); analysis.addEmptyColumnReferencesForTable(accessControl, session.getIdentity(), name); for (ColumnMetadata column : tableMetadata.getColumns()) { Field field = Field.newQualified( table.getName(), Optional.of(column.getName()), column.getType(),
@Override protected Scope visitDelete(Delete node, Optional<Scope> scope) { Table table = node.getTable(); QualifiedObjectName tableName = createQualifiedObjectName(session, table, table.getName()); if (metadata.getView(session, tableName).isPresent()) { throw new SemanticException(NOT_SUPPORTED, node, "Deleting from views is not supported"); } // Analyzer checks for select permissions but DELETE has a separate permission, so disable access checks // TODO: we shouldn't need to create a new analyzer. The access control should be carried in the context object StatementAnalyzer analyzer = new StatementAnalyzer( analysis, metadata, sqlParser, new AllowAllAccessControl(), session, WarningCollector.NOOP); Scope tableScope = analyzer.analyze(table, scope); node.getWhere().ifPresent(where -> analyzeWhere(node, tableScope, where)); analysis.setUpdateType("DELETE"); accessControl.checkCanDeleteFromTable(session.getRequiredTransactionId(), session.getIdentity(), tableName); return createAndAssignScope(node, scope, Field.newUnqualified("rows", BIGINT)); }
private ShowStats createShowStats(QualifiedName name, List<SelectItem> selects, Optional<Expression> where) { return new ShowStats( new TableSubquery(simpleQuery(new Select(false, selects), new Table(name), where, Optional.empty()))); }
private void processRelation(Relation relation, Integer indent) { // TODO: handle this properly if (relation instanceof Table) { builder.append("TABLE ") .append(tableNameMapper.apply(((Table) relation).getName())) .append('\n'); } else { process(relation, indent); } }
new Join( Join.Type.CROSS, new Table(QualifiedName.of("a")), new Table(QualifiedName.of("b")), Optional.empty()), new Table(QualifiedName.of("c")), Optional.of(new JoinOn(BooleanLiteral.TRUE_LITERAL))))); assertStatement("SELECT * FROM a CROSS JOIN b NATURAL JOIN c CROSS JOIN d NATURAL JOIN e", new Join( Join.Type.CROSS, new Table(QualifiedName.of("a")), new Table(QualifiedName.of("b")), Optional.empty()), new Table(QualifiedName.of("c")), Optional.of(new NaturalJoin())), new Table(QualifiedName.of("d")), Optional.empty()), new Table(QualifiedName.of("e")), Optional.of(new NaturalJoin()))));
@Override protected Void visitTable(Table node, Integer indent) { if (!node.getName().getPrefix().isPresent() && queryWithTables.contains(node.getName().getSuffix().toLowerCase(Locale.ENGLISH))) { builder.append(formatName(node.getName().toString(), escapeIdentifier)); return null; } builder.append(tableNameMapper.apply(node.getName())); return null; }