/** * Resolve final RelNode of the new table (or view) for given table field list and new table definition. * * @param isNewTableView Is the new table created a view? This doesn't affect the functionality, but it helps format * better error messages. * @param tableFieldNames List of fields specified in new table/view field list. These are the fields given just after * new table name. * Ex. CREATE TABLE newTblName(col1, medianOfCol2, avgOfCol3) AS * SELECT col1, median(col2), avg(col3) FROM sourcetbl GROUP BY col1; * @throws ValidationException If table's fields list and field list specified in table definition are not valid. * @throws RelConversionException If failed to convert the table definition into a RelNode. */ public static RelNode resolveNewTableRel(boolean isNewTableView, List<String> tableFieldNames, RelDataType validatedRowtype, RelNode queryRelNode) throws ValidationException, RelConversionException { validateRowType(isNewTableView, tableFieldNames, validatedRowtype); if (tableFieldNames.size() > 0) { return MoreRelOptUtil.createRename(queryRelNode, tableFieldNames); } // As the column names of the view are derived from SELECT query, make sure the query has no duplicate column names ensureNoDuplicateColumnNames(validatedRowtype.getFieldNames()); return queryRelNode; }
/** * Return Dremio Logical RelNode tree for a SELECT statement, when it is executed / explained directly. * * @param relNode : root RelNode corresponds to Calcite Logical RelNode. * @param validatedRowType : the rowType for the final field names. A rename project may be placed on top of the root. * @return * @throws RelConversionException * @throws SqlUnsupportedException */ public static Rel convertToDrel(SqlHandlerConfig config, RelNode relNode, RelDataType validatedRowType) throws RelConversionException, SqlUnsupportedException { Rel convertedRelNode = convertToDrel(config, relNode); // Put a non-trivial topProject to ensure the final output field name is preserved, when necessary. convertedRelNode = addRenamedProject(config, convertedRelNode, validatedRowType); convertedRelNode = SqlHandlerUtil.storeQueryResultsIfNeeded(config.getConverter().getParserConfig(), config.getContext(), convertedRelNode); return new ScreenRel(convertedRelNode.getCluster(), convertedRelNode.getTraitSet(), convertedRelNode); }
SqlHandlerUtil.validateRowType(true, Lists.<String>newArrayList(), rowType);
final RelDataType validatedRowType = convertedRelNode.getValidatedRowType(); final RelNode queryRelNode = convertedRelNode.getConvertedNode(); final RelNode newTblRelNode = SqlHandlerUtil.resolveNewTableRel(false, sqlCreateTable.getFieldNames(), validatedRowType, queryRelNode); final RelNode newTblRelNodeWithPCol = SqlHandlerUtil.qualifyPartitionCol(newTblRelNode, sqlCreateTable.getPartitionColumns());
@Override public void unparse(SqlWriter writer, int leftPrec, int rightPrec) { writer.keyword("CREATE"); if (replaceView) { writer.keyword("OR"); writer.keyword("REPLACE"); } writer.keyword("VIEW"); viewName.unparse(writer, leftPrec, rightPrec); if (fieldList.size() > 0) { SqlHandlerUtil.unparseSqlNodeList(writer, leftPrec, rightPrec, fieldList); } writer.keyword("AS"); query.unparse(writer, leftPrec, rightPrec); }
ensureNoDuplicateColumnNames(tableFieldNames);
final RelDataType validatedRowType = convertedRelNode.getValidatedRowType(); final RelNode queryRelNode = convertedRelNode.getConvertedNode(); final RelNode newViewRelNode = SqlHandlerUtil.resolveNewTableRel(true, createView.getFieldNames(), validatedRowType, queryRelNode); Catalog catalog = config.getContext().getCatalog(); NamespaceKey viewPath = catalog.resolveSingle(createView.getPath());
private static Rel convertToDrel( SqlHandlerConfig config, RelNode relNode, Catalog catalog, NamespaceKey key, WriterOptions options, RelDataType queryRowType, final Map<String, Object> storageOptions) throws RelConversionException, SqlUnsupportedException { Rel convertedRelNode = PrelTransformer.convertToDrel(config, relNode); // Put a non-trivial topProject to ensure the final output field name is preserved, when necessary. // Only insert project when the field count from the child is same as that of the queryRowType. convertedRelNode = new WriterRel(convertedRelNode.getCluster(), convertedRelNode.getCluster().traitSet().plus(Rel.LOGICAL), convertedRelNode, catalog.createNewTable(key, options, storageOptions), queryRowType); convertedRelNode = SqlHandlerUtil.storeQueryResultsIfNeeded(config.getConverter().getParserConfig(), config.getContext(), convertedRelNode); return new ScreenRel(convertedRelNode.getCluster(), convertedRelNode.getTraitSet(), convertedRelNode); }
tblName.unparse(writer, leftPrec, rightPrec); if (fieldList.size() > 0) { SqlHandlerUtil.unparseSqlNodeList(writer, leftPrec, rightPrec, fieldList); SqlHandlerUtil.unparseSqlNodeList(writer, leftPrec, rightPrec, partitionColumns); SqlHandlerUtil.unparseSqlNodeList(writer, leftPrec, rightPrec, distributionColumns); SqlHandlerUtil.unparseSqlNodeList(writer, leftPrec, rightPrec, sortColumns); SqlHandlerUtil.unparseSqlNodeList(writer, leftPrec, rightPrec, formatOptions);
); final RelNode doubleWriter = SqlHandlerUtil.storeQueryResultsIfNeeded(config.getConverter().getParserConfig(), config.getContext(), writerDrel);
), initial.getRowType()); final RelNode doubleWriter = SqlHandlerUtil.storeQueryResultsIfNeeded(config.getConverter().getParserConfig(), config.getContext(), writerDrel);