private static List<RexNode> convertExpressionList(SqlRexContext cx, List<SqlNode> nodes, SqlOperandTypeChecker.Consistency consistency) { final List<RexNode> exprs = Lists.newArrayList(); for (SqlNode node : nodes) { exprs.add(cx.convertExpression(node)); } if (exprs.size() > 1) { final RelDataType type = consistentType(cx, consistency, RexUtil.types(exprs)); if (type != null) { final List<RexNode> oldExprs = Lists.newArrayList(exprs); exprs.clear(); for (RexNode expr : oldExprs) { exprs.add(cx.getRexBuilder().ensureType(type, expr, true)); } } } return exprs; }
public ConvertletTable(ContextInformation contextInformation) { super(); registerOp(SqlStdOperatorTable.TIMESTAMP_DIFF, DEFAULT_CONVERTLET); registerOp(SqlStdOperatorTable.IS_DISTINCT_FROM, DistinctFromConvertlet.INSTANCE); registerOp(SqlStdOperatorTable.IS_NOT_DISTINCT_FROM, DistinctFromConvertlet.INSTANCE); registerOp(SqlFlattenOperator.INSTANCE, FlattenConvertlet.INSTANCE); registerOp(SqlDatePartOperator.INSTANCE, SqlDatePartOperator.CONVERTLET); registerOp(SqlStdOperatorTable.MINUS, new SqlRexConvertlet() { @Override public RexNode convertCall(SqlRexContext cx, SqlCall call) { registerOp(SqlStdOperatorTable.TIMESTAMP_ADD, new SqlRexConvertlet() { @Override public RexNode convertCall(SqlRexContext cx, SqlCall call) { registerOp(SqlStdOperatorTable.CURRENT_DATE, new CurrentDateConvertlet(contextInformation)); registerOp(SqlStdOperatorTable.CURRENT_TIME, new CurrentTimeConvertlet(contextInformation)); registerOp(SqlStdOperatorTable.LOCALTIME, new CurrentTimeConvertlet(contextInformation)); registerOp(SqlStdOperatorTable.CURRENT_TIMESTAMP, new CurrentTimeStampConvertlet(contextInformation)); registerOp(SqlStdOperatorTable.LOCALTIMESTAMP, new CurrentTimeStampConvertlet(contextInformation));
/** * Returns a rel root that defers materialization of scans via {@link com.dremio.exec.planner.logical.ConvertibleScan} * * Used for serialization. */ public RelRootPlus toConvertibleRelRoot(final SqlNode validatedNode, boolean expand) { final OptionManager o = settings.getOptions(); final boolean useLegacyDecorrelator = o.getOption(PlannerSettings.USE_LEGACY_DECORRELATOR); final long inSubQueryThreshold = o.getOption(ExecConstants.FAST_OR_ENABLE) ? o.getOption(ExecConstants.FAST_OR_MAX_THRESHOLD) : settings.getOptions().getOption(ExecConstants.PLANNER_IN_SUBQUERY_THRESHOLD); final SqlToRelConverter.Config config = SqlToRelConverter.configBuilder() .withInSubQueryThreshold((int) inSubQueryThreshold) .withTrimUnusedFields(true) .withConvertTableAccess(false) .withExpand(expand) .build(); final ReflectionAllowedMonitoringConvertletTable convertletTable = new ReflectionAllowedMonitoringConvertletTable(new ConvertletTable(functionContext.getContextInformation())); final SqlToRelConverter sqlToRelConverter = new DremioSqlToRelConverter(this, validator, convertletTable, config); // Previously we had "top" = !innerQuery, but calcite only adds project if it is not a top query. final RelRoot rel = sqlToRelConverter.convertQuery(validatedNode, false /* needs validate */, false /* top */); final RelNode rel2 = sqlToRelConverter.flattenTypes(rel.rel, true); final RelNode rel3; rel3 = expand ? rel2 : rel2.accept(new RelsWithRexSubQueryFlattener(sqlToRelConverter)); final RelNode rel4 = RelDecorrelator.decorrelateQuery(rel3, useLegacyDecorrelator); if (logger.isDebugEnabled()) { logger.debug("ConvertQuery with expand = {}:\n{}", expand, RelOptUtil.toString(rel4, SqlExplainLevel.ALL_ATTRIBUTES)); } return RelRootPlus.of(rel4, rel.kind, convertletTable.isReflectionDisallowed()); }
/** Converts a {@link SqlCall} to a {@link RexCall} with a perhaps different * operator. */ private RexNode convertCall( SqlRexContext cx, SqlCall call, SqlOperator op) { final List<SqlNode> operands = call.getOperandList(); final RexBuilder rexBuilder = cx.getRexBuilder(); final SqlOperandTypeChecker.Consistency consistency = op.getOperandTypeChecker() == null ? SqlOperandTypeChecker.Consistency.NONE : op.getOperandTypeChecker().getConsistency(); final List<RexNode> exprs = convertExpressionList(cx, operands, consistency); RelDataType type = rexBuilder.deriveReturnType(op, exprs); return rexBuilder.makeCall(type, op, RexUtil.flatten(exprs, op)); }
.build()) .defaultSchema(CalciteSchema.createRootSchema(false /* addMetadata */, false /* cache */).plus()) .convertletTable(new ConvertletTable(new ContextInformation() { @Override public String getQueryUser() {