[ 
https://issues.apache.org/jira/browse/CALCITE-1164?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15209510#comment-15209510
 ] 

Vladimir Sitnikov edited comment on CALCITE-1164 at 3/24/16 7:12 AM:
---------------------------------------------------------------------

-Do you think the following query should fail? It looks awkward-



was (Author: vladimirsitnikov):
Do you think the following query should fail? It looks awkward
{code:java}
  @Test
  public void testWithInsideWhereExists() throws SQLException {
    Connection con = CalciteAssert.hr()
        .connect();
    PreparedStatement ps =
        con.prepareStatement("select * from \"hr\".\"depts\" where 'a' = ?");
    ps.setObject(1, "a");
    ps.execute();
  }
{code}
{noformat}
  private final java.util.List relClasses;
  public final org.apache.calcite.rel.metadata.RelMdCollation provider0;
  public GeneratedMetadataHandler_Collation(java.util.List relClasses,
      org.apache.calcite.rel.metadata.RelMdCollation provider0) {
    this.relClasses = relClasses;
    this.provider0 = provider0;
  }
  public org.apache.calcite.rel.metadata.MetadataDef getDef() {
    return org.apache.calcite.rel.metadata.BuiltInMetadata$Collation.DEF;
  }
  public com.google.common.collect.ImmutableList collations(
      org.apache.calcite.rel.RelNode r,
      org.apache.calcite.rel.metadata.RelMetadataQuery mq) {
    final java.util.List key = 
org.apache.calcite.runtime.FlatLists.of(org.apache.calcite.rel.metadata.BuiltInMetadata$Collation.DEF,
 r);
    final Object v = mq.map.get(key);
    if (v != null) {
      if (v == org.apache.calcite.rel.metadata.NullSentinel.ACTIVE) {
        throw org.apache.calcite.rel.metadata.CyclicMetadataException.INSTANCE;
      }
      return (com.google.common.collect.ImmutableList) v;
    }
    mq.map.put(key,org.apache.calcite.rel.metadata.NullSentinel.ACTIVE);
    try {
      final com.google.common.collect.ImmutableList x = collations_(r, mq);
      mq.map.put(key, x);
      return x;
    } catch 
(org.apache.calcite.rel.metadata.JaninoRelMetadataProvider$NoHandler e) {
      mq.map.remove(key);
      throw e;
    }
  }

  private com.google.common.collect.ImmutableList collations_(
      org.apache.calcite.rel.RelNode r,
      org.apache.calcite.rel.metadata.RelMetadataQuery mq) {
    switch (relClasses.indexOf(r.getClass())) {
    default:
      return provider0.collations((org.apache.calcite.rel.RelNode) r, mq);
    case 2:
      return provider0.collations((org.apache.calcite.plan.volcano.RelSubset) 
r, mq);
    case 3:
      return collations(((org.apache.calcite.plan.hep.HepRelVertex) 
r).getCurrentRel(), mq);
    case 10:
    case 25:
    case 34:
      return provider0.collations((org.apache.calcite.rel.core.Filter) r, mq);
    case 14:
    case 26:
    case 38:
      return provider0.collations((org.apache.calcite.rel.core.Project) r, mq);
    case 15:
    case 39:
      return provider0.collations((org.apache.calcite.rel.core.Sort) r, mq);
    case 18:
    case 28:
    case 42:
      return provider0.collations((org.apache.calcite.rel.core.TableScan) r, 
mq);
    case 20:
    case 44:
      return provider0.collations((org.apache.calcite.rel.core.Values) r, mq);
    case 21:
    case 45:
      return provider0.collations((org.apache.calcite.rel.core.Window) r, mq);
    case -1:
      throw new 
org.apache.calcite.rel.metadata.JaninoRelMetadataProvider$NoHandler(r.getClass());
    }
  }

  private final java.util.List relClasses;
  public final org.apache.calcite.rel.metadata.RelMdPercentageOriginalRows 
provider0;
  public GeneratedMetadataHandler_NonCumulativeCost(java.util.List relClasses,
      org.apache.calcite.rel.metadata.RelMdPercentageOriginalRows provider0) {
    this.relClasses = relClasses;
    this.provider0 = provider0;
  }
  public org.apache.calcite.rel.metadata.MetadataDef getDef() {
    return 
org.apache.calcite.rel.metadata.BuiltInMetadata$NonCumulativeCost.DEF;
  }
  public org.apache.calcite.plan.RelOptCost getNonCumulativeCost(
      org.apache.calcite.rel.RelNode r,
      org.apache.calcite.rel.metadata.RelMetadataQuery mq) {
    final java.util.List key = 
org.apache.calcite.runtime.FlatLists.of(org.apache.calcite.rel.metadata.BuiltInMetadata$NonCumulativeCost.DEF,
 r);
    final Object v = mq.map.get(key);
    if (v != null) {
      if (v == org.apache.calcite.rel.metadata.NullSentinel.ACTIVE) {
        throw org.apache.calcite.rel.metadata.CyclicMetadataException.INSTANCE;
      }
      return (org.apache.calcite.plan.RelOptCost) v;
    }
    mq.map.put(key,org.apache.calcite.rel.metadata.NullSentinel.ACTIVE);
    try {
      final org.apache.calcite.plan.RelOptCost x = getNonCumulativeCost_(r, mq);
      mq.map.put(key, x);
      return x;
    } catch 
(org.apache.calcite.rel.metadata.JaninoRelMetadataProvider$NoHandler e) {
      mq.map.remove(key);
      throw e;
    }
  }

  private org.apache.calcite.plan.RelOptCost getNonCumulativeCost_(
      org.apache.calcite.rel.RelNode r,
      org.apache.calcite.rel.metadata.RelMetadataQuery mq) {
    switch (relClasses.indexOf(r.getClass())) {
    default:
      return provider0.getNonCumulativeCost((org.apache.calcite.rel.RelNode) r, 
mq);
    case 3:
      return getNonCumulativeCost(((org.apache.calcite.plan.hep.HepRelVertex) 
r).getCurrentRel(), mq);
    case -1:
      throw new 
org.apache.calcite.rel.metadata.JaninoRelMetadataProvider$NoHandler(r.getClass());
    }
  }

  private final java.util.List relClasses;
  public final org.apache.calcite.rel.metadata.RelMdExplainVisibility provider0;
  public GeneratedMetadataHandler_ExplainVisibility(java.util.List relClasses,
      org.apache.calcite.rel.metadata.RelMdExplainVisibility provider0) {
    this.relClasses = relClasses;
    this.provider0 = provider0;
  }
  public org.apache.calcite.rel.metadata.MetadataDef getDef() {
    return 
org.apache.calcite.rel.metadata.BuiltInMetadata$ExplainVisibility.DEF;
  }
  public java.lang.Boolean isVisibleInExplain(
      org.apache.calcite.rel.RelNode r,
      org.apache.calcite.rel.metadata.RelMetadataQuery mq,
      org.apache.calcite.sql.SqlExplainLevel a0) {
    final java.util.List key = 
org.apache.calcite.runtime.FlatLists.of(org.apache.calcite.rel.metadata.BuiltInMetadata$ExplainVisibility.DEF,
 r, org.apache.calcite.rel.metadata.NullSentinel.mask(a0));
    final Object v = mq.map.get(key);
    if (v != null) {
      if (v == org.apache.calcite.rel.metadata.NullSentinel.ACTIVE) {
        throw org.apache.calcite.rel.metadata.CyclicMetadataException.INSTANCE;
      }
      return (java.lang.Boolean) v;
    }
    mq.map.put(key,org.apache.calcite.rel.metadata.NullSentinel.ACTIVE);
    try {
      final java.lang.Boolean x = isVisibleInExplain_(r, mq, a0);
      mq.map.put(key, x);
      return x;
    } catch 
(org.apache.calcite.rel.metadata.JaninoRelMetadataProvider$NoHandler e) {
      mq.map.remove(key);
      throw e;
    }
  }

  private java.lang.Boolean isVisibleInExplain_(
      org.apache.calcite.rel.RelNode r,
      org.apache.calcite.rel.metadata.RelMetadataQuery mq,
      org.apache.calcite.sql.SqlExplainLevel a0) {
    switch (relClasses.indexOf(r.getClass())) {
    default:
      return provider0.isVisibleInExplain((org.apache.calcite.rel.RelNode) r, 
mq, a0);
    case 3:
      return isVisibleInExplain(((org.apache.calcite.plan.hep.HepRelVertex) 
r).getCurrentRel(), mq, a0);
    case -1:
      throw new 
org.apache.calcite.rel.metadata.JaninoRelMetadataProvider$NoHandler(r.getClass());
    }
  }

  private final java.util.List relClasses;
  public final org.apache.calcite.rel.metadata.RelMdRowCount provider0;
  public GeneratedMetadataHandler_RowCount(java.util.List relClasses,
      org.apache.calcite.rel.metadata.RelMdRowCount provider0) {
    this.relClasses = relClasses;
    this.provider0 = provider0;
  }
  public org.apache.calcite.rel.metadata.MetadataDef getDef() {
    return org.apache.calcite.rel.metadata.BuiltInMetadata$RowCount.DEF;
  }
  public java.lang.Double getRowCount(
      org.apache.calcite.rel.RelNode r,
      org.apache.calcite.rel.metadata.RelMetadataQuery mq) {
    final java.util.List key = 
org.apache.calcite.runtime.FlatLists.of(org.apache.calcite.rel.metadata.BuiltInMetadata$RowCount.DEF,
 r);
    final Object v = mq.map.get(key);
    if (v != null) {
      if (v == org.apache.calcite.rel.metadata.NullSentinel.ACTIVE) {
        throw org.apache.calcite.rel.metadata.CyclicMetadataException.INSTANCE;
      }
      return (java.lang.Double) v;
    }
    mq.map.put(key,org.apache.calcite.rel.metadata.NullSentinel.ACTIVE);
    try {
      final java.lang.Double x = getRowCount_(r, mq);
      mq.map.put(key, x);
      return x;
    } catch 
(org.apache.calcite.rel.metadata.JaninoRelMetadataProvider$NoHandler e) {
      mq.map.remove(key);
      throw e;
    }
  }

  private java.lang.Double getRowCount_(
      org.apache.calcite.rel.RelNode r,
      org.apache.calcite.rel.metadata.RelMetadataQuery mq) {
    switch (relClasses.indexOf(r.getClass())) {
    default:
      return provider0.getRowCount((org.apache.calcite.rel.RelNode) r, mq);
    case 2:
      return provider0.getRowCount((org.apache.calcite.plan.volcano.RelSubset) 
r, mq);
    case 3:
      return getRowCount(((org.apache.calcite.plan.hep.HepRelVertex) 
r).getCurrentRel(), mq);
    case 4:
    case 5:
    case 9:
    case 17:
    case 21:
    case 22:
    case 23:
    case 29:
    case 33:
    case 41:
    case 45:
    case 46:
    case 47:
      return provider0.getRowCount((org.apache.calcite.rel.SingleRel) r, mq);
    case 6:
    case 24:
    case 30:
      return provider0.getRowCount((org.apache.calcite.rel.core.Aggregate) r, 
mq);
    case 7:
    case 31:
      return provider0.getRowCount((org.apache.calcite.rel.core.Calc) r, mq);
    case 10:
    case 25:
    case 34:
      return provider0.getRowCount((org.apache.calcite.rel.core.Filter) r, mq);
    case 11:
    case 35:
      return provider0.getRowCount((org.apache.calcite.rel.core.Intersect) r, 
mq);
    case 12:
    case 27:
    case 36:
    case 48:
      return provider0.getRowCount((org.apache.calcite.rel.core.Join) r, mq);
    case 13:
    case 37:
      return provider0.getRowCount((org.apache.calcite.rel.core.Minus) r, mq);
    case 14:
    case 26:
    case 38:
      return provider0.getRowCount((org.apache.calcite.rel.core.Project) r, mq);
    case 15:
    case 39:
      return provider0.getRowCount((org.apache.calcite.rel.core.Sort) r, mq);
    case 18:
    case 28:
    case 42:
      return provider0.getRowCount((org.apache.calcite.rel.core.TableScan) r, 
mq);
    case 19:
    case 43:
      return provider0.getRowCount((org.apache.calcite.rel.core.Union) r, mq);
    case 20:
    case 44:
      return provider0.getRowCount((org.apache.calcite.rel.core.Values) r, mq);
    case -1:
      throw new 
org.apache.calcite.rel.metadata.JaninoRelMetadataProvider$NoHandler(r.getClass());
    }
  }

  private final java.util.List relClasses;
  public final org.apache.calcite.rel.metadata.RelMdSelectivity provider0;
  public GeneratedMetadataHandler_Selectivity(java.util.List relClasses,
      org.apache.calcite.rel.metadata.RelMdSelectivity provider0) {
    this.relClasses = relClasses;
    this.provider0 = provider0;
  }
  public org.apache.calcite.rel.metadata.MetadataDef getDef() {
    return org.apache.calcite.rel.metadata.BuiltInMetadata$Selectivity.DEF;
  }
  public java.lang.Double getSelectivity(
      org.apache.calcite.rel.RelNode r,
      org.apache.calcite.rel.metadata.RelMetadataQuery mq,
      org.apache.calcite.rex.RexNode a0) {
    final java.util.List key = 
org.apache.calcite.runtime.FlatLists.of(org.apache.calcite.rel.metadata.BuiltInMetadata$Selectivity.DEF,
 r, a0 == null ? "" : a0.toString());
    final Object v = mq.map.get(key);
    if (v != null) {
      if (v == org.apache.calcite.rel.metadata.NullSentinel.ACTIVE) {
        throw org.apache.calcite.rel.metadata.CyclicMetadataException.INSTANCE;
      }
      return (java.lang.Double) v;
    }
    mq.map.put(key,org.apache.calcite.rel.metadata.NullSentinel.ACTIVE);
    try {
      final java.lang.Double x = getSelectivity_(r, mq, a0);
      mq.map.put(key, x);
      return x;
    } catch 
(org.apache.calcite.rel.metadata.JaninoRelMetadataProvider$NoHandler e) {
      mq.map.remove(key);
      throw e;
    }
  }

  private java.lang.Double getSelectivity_(
      org.apache.calcite.rel.RelNode r,
      org.apache.calcite.rel.metadata.RelMetadataQuery mq,
      org.apache.calcite.rex.RexNode a0) {
    switch (relClasses.indexOf(r.getClass())) {
    default:
      return provider0.getSelectivity((org.apache.calcite.rel.RelNode) r, mq, 
a0);
    case 3:
      return getSelectivity(((org.apache.calcite.plan.hep.HepRelVertex) 
r).getCurrentRel(), mq, a0);
    case 6:
    case 24:
    case 30:
      return provider0.getSelectivity((org.apache.calcite.rel.core.Aggregate) 
r, mq, a0);
    case 10:
    case 25:
    case 34:
      return provider0.getSelectivity((org.apache.calcite.rel.core.Filter) r, 
mq, a0);
    case 14:
    case 26:
    case 38:
      return provider0.getSelectivity((org.apache.calcite.rel.core.Project) r, 
mq, a0);
    case 15:
    case 39:
      return provider0.getSelectivity((org.apache.calcite.rel.core.Sort) r, mq, 
a0);
    case 19:
    case 43:
      return provider0.getSelectivity((org.apache.calcite.rel.core.Union) r, 
mq, a0);
    case -1:
      throw new 
org.apache.calcite.rel.metadata.JaninoRelMetadataProvider$NoHandler(r.getClass());
    }
  }

  private final java.util.List relClasses;
  public final org.apache.calcite.rel.metadata.RelMdPercentageOriginalRows 
provider0;
  public GeneratedMetadataHandler_CumulativeCost(java.util.List relClasses,
      org.apache.calcite.rel.metadata.RelMdPercentageOriginalRows provider0) {
    this.relClasses = relClasses;
    this.provider0 = provider0;
  }
  public org.apache.calcite.rel.metadata.MetadataDef getDef() {
    return org.apache.calcite.rel.metadata.BuiltInMetadata$CumulativeCost.DEF;
  }
  public org.apache.calcite.plan.RelOptCost getCumulativeCost(
      org.apache.calcite.rel.RelNode r,
      org.apache.calcite.rel.metadata.RelMetadataQuery mq) {
    final java.util.List key = 
org.apache.calcite.runtime.FlatLists.of(org.apache.calcite.rel.metadata.BuiltInMetadata$CumulativeCost.DEF,
 r);
    final Object v = mq.map.get(key);
    if (v != null) {
      if (v == org.apache.calcite.rel.metadata.NullSentinel.ACTIVE) {
        throw org.apache.calcite.rel.metadata.CyclicMetadataException.INSTANCE;
      }
      return (org.apache.calcite.plan.RelOptCost) v;
    }
    mq.map.put(key,org.apache.calcite.rel.metadata.NullSentinel.ACTIVE);
    try {
      final org.apache.calcite.plan.RelOptCost x = getCumulativeCost_(r, mq);
      mq.map.put(key, x);
      return x;
    } catch 
(org.apache.calcite.rel.metadata.JaninoRelMetadataProvider$NoHandler e) {
      mq.map.remove(key);
      throw e;
    }
  }

  private org.apache.calcite.plan.RelOptCost getCumulativeCost_(
      org.apache.calcite.rel.RelNode r,
      org.apache.calcite.rel.metadata.RelMetadataQuery mq) {
    switch (relClasses.indexOf(r.getClass())) {
    default:
      return provider0.getCumulativeCost((org.apache.calcite.rel.RelNode) r, 
mq);
    case 3:
      return getCumulativeCost(((org.apache.calcite.plan.hep.HepRelVertex) 
r).getCurrentRel(), mq);
    case -1:
      throw new 
org.apache.calcite.rel.metadata.JaninoRelMetadataProvider$NoHandler(r.getClass());
    }
  }

  private final java.util.List relClasses;
  public final org.apache.calcite.rel.metadata.RelMdExplainVisibility provider0;
  public GeneratedMetadataHandler_ExplainVisibility(java.util.List relClasses,
      org.apache.calcite.rel.metadata.RelMdExplainVisibility provider0) {
    this.relClasses = relClasses;
    this.provider0 = provider0;
  }
  public org.apache.calcite.rel.metadata.MetadataDef getDef() {
    return 
org.apache.calcite.rel.metadata.BuiltInMetadata$ExplainVisibility.DEF;
  }
  public java.lang.Boolean isVisibleInExplain(
      org.apache.calcite.rel.RelNode r,
      org.apache.calcite.rel.metadata.RelMetadataQuery mq,
      org.apache.calcite.sql.SqlExplainLevel a0) {
    final java.util.List key = 
org.apache.calcite.runtime.FlatLists.of(org.apache.calcite.rel.metadata.BuiltInMetadata$ExplainVisibility.DEF,
 r, org.apache.calcite.rel.metadata.NullSentinel.mask(a0));
    final Object v = mq.map.get(key);
    if (v != null) {
      if (v == org.apache.calcite.rel.metadata.NullSentinel.ACTIVE) {
        throw org.apache.calcite.rel.metadata.CyclicMetadataException.INSTANCE;
      }
      return (java.lang.Boolean) v;
    }
    mq.map.put(key,org.apache.calcite.rel.metadata.NullSentinel.ACTIVE);
    try {
      final java.lang.Boolean x = isVisibleInExplain_(r, mq, a0);
      mq.map.put(key, x);
      return x;
    } catch 
(org.apache.calcite.rel.metadata.JaninoRelMetadataProvider$NoHandler e) {
      mq.map.remove(key);
      throw e;
    }
  }

  private java.lang.Boolean isVisibleInExplain_(
      org.apache.calcite.rel.RelNode r,
      org.apache.calcite.rel.metadata.RelMetadataQuery mq,
      org.apache.calcite.sql.SqlExplainLevel a0) {
    switch (relClasses.indexOf(r.getClass())) {
    default:
      return provider0.isVisibleInExplain((org.apache.calcite.rel.RelNode) r, 
mq, a0);
    case 3:
      return isVisibleInExplain(((org.apache.calcite.plan.hep.HepRelVertex) 
r).getCurrentRel(), mq, a0);
    case -1:
      throw new 
org.apache.calcite.rel.metadata.JaninoRelMetadataProvider$NoHandler(r.getClass());
    }
  }

  private final java.util.List relClasses;
  public final org.apache.calcite.rel.metadata.RelMdRowCount provider0;
  public GeneratedMetadataHandler_RowCount(java.util.List relClasses,
      org.apache.calcite.rel.metadata.RelMdRowCount provider0) {
    this.relClasses = relClasses;
    this.provider0 = provider0;
  }
  public org.apache.calcite.rel.metadata.MetadataDef getDef() {
    return org.apache.calcite.rel.metadata.BuiltInMetadata$RowCount.DEF;
  }
  public java.lang.Double getRowCount(
      org.apache.calcite.rel.RelNode r,
      org.apache.calcite.rel.metadata.RelMetadataQuery mq) {
    final java.util.List key = 
org.apache.calcite.runtime.FlatLists.of(org.apache.calcite.rel.metadata.BuiltInMetadata$RowCount.DEF,
 r);
    final Object v = mq.map.get(key);
    if (v != null) {
      if (v == org.apache.calcite.rel.metadata.NullSentinel.ACTIVE) {
        throw org.apache.calcite.rel.metadata.CyclicMetadataException.INSTANCE;
      }
      return (java.lang.Double) v;
    }
    mq.map.put(key,org.apache.calcite.rel.metadata.NullSentinel.ACTIVE);
    try {
      final java.lang.Double x = getRowCount_(r, mq);
      mq.map.put(key, x);
      return x;
    } catch 
(org.apache.calcite.rel.metadata.JaninoRelMetadataProvider$NoHandler e) {
      mq.map.remove(key);
      throw e;
    }
  }

  private java.lang.Double getRowCount_(
      org.apache.calcite.rel.RelNode r,
      org.apache.calcite.rel.metadata.RelMetadataQuery mq) {
    switch (relClasses.indexOf(r.getClass())) {
    default:
      return provider0.getRowCount((org.apache.calcite.rel.RelNode) r, mq);
    case 2:
      return provider0.getRowCount((org.apache.calcite.plan.volcano.RelSubset) 
r, mq);
    case 3:
      return getRowCount(((org.apache.calcite.plan.hep.HepRelVertex) 
r).getCurrentRel(), mq);
    case 4:
    case 5:
    case 9:
    case 17:
    case 21:
    case 22:
    case 23:
    case 29:
    case 33:
    case 41:
    case 45:
    case 46:
    case 47:
      return provider0.getRowCount((org.apache.calcite.rel.SingleRel) r, mq);
    case 6:
    case 24:
    case 30:
      return provider0.getRowCount((org.apache.calcite.rel.core.Aggregate) r, 
mq);
    case 7:
    case 31:
    case 51:
      return provider0.getRowCount((org.apache.calcite.rel.core.Calc) r, mq);
    case 10:
    case 25:
    case 34:
      return provider0.getRowCount((org.apache.calcite.rel.core.Filter) r, mq);
    case 11:
    case 35:
      return provider0.getRowCount((org.apache.calcite.rel.core.Intersect) r, 
mq);
    case 12:
    case 27:
    case 36:
    case 48:
      return provider0.getRowCount((org.apache.calcite.rel.core.Join) r, mq);
    case 13:
    case 37:
      return provider0.getRowCount((org.apache.calcite.rel.core.Minus) r, mq);
    case 14:
    case 26:
    case 38:
      return provider0.getRowCount((org.apache.calcite.rel.core.Project) r, mq);
    case 15:
    case 39:
      return provider0.getRowCount((org.apache.calcite.rel.core.Sort) r, mq);
    case 18:
    case 28:
    case 42:
      return provider0.getRowCount((org.apache.calcite.rel.core.TableScan) r, 
mq);
    case 19:
    case 43:
      return provider0.getRowCount((org.apache.calcite.rel.core.Union) r, mq);
    case 20:
    case 44:
      return provider0.getRowCount((org.apache.calcite.rel.core.Values) r, mq);
    case -1:
      throw new 
org.apache.calcite.rel.metadata.JaninoRelMetadataProvider$NoHandler(r.getClass());
    }
  }

  private final java.util.List relClasses;
  public final org.apache.calcite.rel.metadata.RelMdSelectivity provider0;
  public GeneratedMetadataHandler_Selectivity(java.util.List relClasses,
      org.apache.calcite.rel.metadata.RelMdSelectivity provider0) {
    this.relClasses = relClasses;
    this.provider0 = provider0;
  }
  public org.apache.calcite.rel.metadata.MetadataDef getDef() {
    return org.apache.calcite.rel.metadata.BuiltInMetadata$Selectivity.DEF;
  }
  public java.lang.Double getSelectivity(
      org.apache.calcite.rel.RelNode r,
      org.apache.calcite.rel.metadata.RelMetadataQuery mq,
      org.apache.calcite.rex.RexNode a0) {
    final java.util.List key = 
org.apache.calcite.runtime.FlatLists.of(org.apache.calcite.rel.metadata.BuiltInMetadata$Selectivity.DEF,
 r, a0 == null ? "" : a0.toString());
    final Object v = mq.map.get(key);
    if (v != null) {
      if (v == org.apache.calcite.rel.metadata.NullSentinel.ACTIVE) {
        throw org.apache.calcite.rel.metadata.CyclicMetadataException.INSTANCE;
      }
      return (java.lang.Double) v;
    }
    mq.map.put(key,org.apache.calcite.rel.metadata.NullSentinel.ACTIVE);
    try {
      final java.lang.Double x = getSelectivity_(r, mq, a0);
      mq.map.put(key, x);
      return x;
    } catch 
(org.apache.calcite.rel.metadata.JaninoRelMetadataProvider$NoHandler e) {
      mq.map.remove(key);
      throw e;
    }
  }

  private java.lang.Double getSelectivity_(
      org.apache.calcite.rel.RelNode r,
      org.apache.calcite.rel.metadata.RelMetadataQuery mq,
      org.apache.calcite.rex.RexNode a0) {
    switch (relClasses.indexOf(r.getClass())) {
    default:
      return provider0.getSelectivity((org.apache.calcite.rel.RelNode) r, mq, 
a0);
    case 3:
      return getSelectivity(((org.apache.calcite.plan.hep.HepRelVertex) 
r).getCurrentRel(), mq, a0);
    case 6:
    case 24:
    case 30:
      return provider0.getSelectivity((org.apache.calcite.rel.core.Aggregate) 
r, mq, a0);
    case 10:
    case 25:
    case 34:
      return provider0.getSelectivity((org.apache.calcite.rel.core.Filter) r, 
mq, a0);
    case 14:
    case 26:
    case 38:
      return provider0.getSelectivity((org.apache.calcite.rel.core.Project) r, 
mq, a0);
    case 15:
    case 39:
      return provider0.getSelectivity((org.apache.calcite.rel.core.Sort) r, mq, 
a0);
    case 19:
    case 43:
      return provider0.getSelectivity((org.apache.calcite.rel.core.Union) r, 
mq, a0);
    case -1:
      throw new 
org.apache.calcite.rel.metadata.JaninoRelMetadataProvider$NoHandler(r.getClass());
    }
  }

  private final java.util.List relClasses;
  public final org.apache.calcite.rel.metadata.RelMdPercentageOriginalRows 
provider0;
  public GeneratedMetadataHandler_CumulativeCost(java.util.List relClasses,
      org.apache.calcite.rel.metadata.RelMdPercentageOriginalRows provider0) {
    this.relClasses = relClasses;
    this.provider0 = provider0;
  }
  public org.apache.calcite.rel.metadata.MetadataDef getDef() {
    return org.apache.calcite.rel.metadata.BuiltInMetadata$CumulativeCost.DEF;
  }
  public org.apache.calcite.plan.RelOptCost getCumulativeCost(
      org.apache.calcite.rel.RelNode r,
      org.apache.calcite.rel.metadata.RelMetadataQuery mq) {
    final java.util.List key = 
org.apache.calcite.runtime.FlatLists.of(org.apache.calcite.rel.metadata.BuiltInMetadata$CumulativeCost.DEF,
 r);
    final Object v = mq.map.get(key);
    if (v != null) {
      if (v == org.apache.calcite.rel.metadata.NullSentinel.ACTIVE) {
        throw org.apache.calcite.rel.metadata.CyclicMetadataException.INSTANCE;
      }
      return (org.apache.calcite.plan.RelOptCost) v;
    }
    mq.map.put(key,org.apache.calcite.rel.metadata.NullSentinel.ACTIVE);
    try {
      final org.apache.calcite.plan.RelOptCost x = getCumulativeCost_(r, mq);
      mq.map.put(key, x);
      return x;
    } catch 
(org.apache.calcite.rel.metadata.JaninoRelMetadataProvider$NoHandler e) {
      mq.map.remove(key);
      throw e;
    }
  }

  private org.apache.calcite.plan.RelOptCost getCumulativeCost_(
      org.apache.calcite.rel.RelNode r,
      org.apache.calcite.rel.metadata.RelMetadataQuery mq) {
    switch (relClasses.indexOf(r.getClass())) {
    default:
      return provider0.getCumulativeCost((org.apache.calcite.rel.RelNode) r, 
mq);
    case 3:
      return getCumulativeCost(((org.apache.calcite.plan.hep.HepRelVertex) 
r).getCurrentRel(), mq);
    case -1:
      throw new 
org.apache.calcite.rel.metadata.JaninoRelMetadataProvider$NoHandler(r.getClass());
    }
  }

  private final java.util.List relClasses;
  public final org.apache.calcite.rel.metadata.RelMdPercentageOriginalRows 
provider0;
  public GeneratedMetadataHandler_NonCumulativeCost(java.util.List relClasses,
      org.apache.calcite.rel.metadata.RelMdPercentageOriginalRows provider0) {
    this.relClasses = relClasses;
    this.provider0 = provider0;
  }
  public org.apache.calcite.rel.metadata.MetadataDef getDef() {
    return 
org.apache.calcite.rel.metadata.BuiltInMetadata$NonCumulativeCost.DEF;
  }
  public org.apache.calcite.plan.RelOptCost getNonCumulativeCost(
      org.apache.calcite.rel.RelNode r,
      org.apache.calcite.rel.metadata.RelMetadataQuery mq) {
    final java.util.List key = 
org.apache.calcite.runtime.FlatLists.of(org.apache.calcite.rel.metadata.BuiltInMetadata$NonCumulativeCost.DEF,
 r);
    final Object v = mq.map.get(key);
    if (v != null) {
      if (v == org.apache.calcite.rel.metadata.NullSentinel.ACTIVE) {
        throw org.apache.calcite.rel.metadata.CyclicMetadataException.INSTANCE;
      }
      return (org.apache.calcite.plan.RelOptCost) v;
    }
    mq.map.put(key,org.apache.calcite.rel.metadata.NullSentinel.ACTIVE);
    try {
      final org.apache.calcite.plan.RelOptCost x = getNonCumulativeCost_(r, mq);
      mq.map.put(key, x);
      return x;
    } catch 
(org.apache.calcite.rel.metadata.JaninoRelMetadataProvider$NoHandler e) {
      mq.map.remove(key);
      throw e;
    }
  }

  private org.apache.calcite.plan.RelOptCost getNonCumulativeCost_(
      org.apache.calcite.rel.RelNode r,
      org.apache.calcite.rel.metadata.RelMetadataQuery mq) {
    switch (relClasses.indexOf(r.getClass())) {
    default:
      return provider0.getNonCumulativeCost((org.apache.calcite.rel.RelNode) r, 
mq);
    case 3:
      return getNonCumulativeCost(((org.apache.calcite.plan.hep.HepRelVertex) 
r).getCurrentRel(), mq);
    case -1:
      throw new 
org.apache.calcite.rel.metadata.JaninoRelMetadataProvider$NoHandler(r.getClass());
    }
  }

{noformat}

{noformat}

java.lang.RuntimeException: exception while executing [with emp2 as (select * 
from "hr"."emps")
select * from emp2
where 'a'=1]

        at 
org.apache.calcite.test.CalciteAssert$AssertQuery.returns(CalciteAssert.java:1215)
        at 
org.apache.calcite.test.CalciteAssert$AssertQuery.returns(CalciteAssert.java:1194)
        at 
org.apache.calcite.test.CalciteAssert$AssertQuery.returns(CalciteAssert.java:1158)
        at org.apache.calcite.test.JdbcTest.testWithOrderBy2(JdbcTest.java:3401)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at 
org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
        at 
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
        at 
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
        at 
org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
        at 
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
        at 
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
        at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
        at 
com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:119)
        at 
com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42)
        at 
com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234)
        at 
com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: java.lang.RuntimeException: With materializationsEnabled=false, 
limit=0
        at 
org.apache.calcite.test.CalciteAssert.assertQuery(CalciteAssert.java:504)
        at 
org.apache.calcite.test.CalciteAssert$AssertQuery.returns(CalciteAssert.java:1211)
        ... 30 more
Caused by: java.sql.SQLException: Error while executing SQL "with emp2 as 
(select * from "hr"."emps")
select * from emp2
where 'a'=1": while resolving method 'eq[class java.lang.String, int]' in class 
class org.apache.calcite.runtime.SqlFunctions
        at org.apache.calcite.avatica.Helper.createException(Helper.java:56)
        at org.apache.calcite.avatica.Helper.createException(Helper.java:41)
        at 
org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement.java:143)
        at 
org.apache.calcite.avatica.AvaticaStatement.executeQuery(AvaticaStatement.java:186)
        at 
org.apache.calcite.test.CalciteAssert.assertQuery(CalciteAssert.java:472)
        ... 31 more
Caused by: java.lang.RuntimeException: while resolving method 'eq[class 
java.lang.String, int]' in class class org.apache.calcite.runtime.SqlFunctions
        at org.apache.calcite.linq4j.tree.Types.lookupMethod(Types.java:346)
        at org.apache.calcite.linq4j.tree.Expressions.call(Expressions.java:442)
        at 
org.apache.calcite.adapter.enumerable.RexImpTable$BinaryImplementor.implement(RexImpTable.java:1276)
        at 
org.apache.calcite.adapter.enumerable.RexImpTable$HarmonizingBinaryImplementor.implement(RexImpTable.java:1301)
        at 
org.apache.calcite.adapter.enumerable.RexToLixTranslator.translateCall(RexToLixTranslator.java:443)
        at 
org.apache.calcite.adapter.enumerable.RexToLixTranslator.translate0(RexToLixTranslator.java:416)
        at 
org.apache.calcite.adapter.enumerable.RexToLixTranslator.translate(RexToLixTranslator.java:176)
        at 
org.apache.calcite.adapter.enumerable.RexToLixTranslator.translate(RexToLixTranslator.java:172)
        at 
org.apache.calcite.adapter.enumerable.RexToLixTranslator.translateCondition(RexToLixTranslator.java:610)
        at 
org.apache.calcite.adapter.enumerable.EnumerableCalc.implement(EnumerableCalc.java:163)
        at 
org.apache.calcite.adapter.enumerable.EnumerableRelImplementor.implementRoot(EnumerableRelImplementor.java:102)
        at 
org.apache.calcite.adapter.enumerable.EnumerableInterpretable.toBindable(EnumerableInterpretable.java:92)
        at 
org.apache.calcite.prepare.CalcitePrepareImpl$CalcitePreparingStmt.implement(CalcitePrepareImpl.java:1172)
        at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:294)
        at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:193)
        at 
org.apache.calcite.prepare.CalcitePrepareImpl.prepare2_(CalcitePrepareImpl.java:720)
        at 
org.apache.calcite.prepare.CalcitePrepareImpl.prepare_(CalcitePrepareImpl.java:587)
        at 
org.apache.calcite.prepare.CalcitePrepareImpl.prepareSql(CalcitePrepareImpl.java:557)
        at 
org.apache.calcite.jdbc.CalciteConnectionImpl.parseQuery(CalciteConnectionImpl.java:214)
        at 
org.apache.calcite.jdbc.CalciteMetaImpl.prepareAndExecute(CalciteMetaImpl.java:573)
        at 
org.apache.calcite.avatica.AvaticaConnection.prepareAndExecuteInternal(AvaticaConnection.java:572)
        at 
org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement.java:136)
        ... 33 more
...
{noformat}
{noformat}
Caused by: java.lang.NoSuchMethodException: 
org.apache.calcite.runtime.SqlFunctions.eq(java.lang.String, int)
        at java.lang.Class.getMethod(Class.java:1786)
        at org.apache.calcite.linq4j.tree.Types.lookupMethod(Types.java:337)
        ... 54 more


Process finished with exit code 255
{noformat}

> Use setObject(int, Object, int) when binding parameters
> -------------------------------------------------------
>
>                 Key: CALCITE-1164
>                 URL: https://issues.apache.org/jira/browse/CALCITE-1164
>             Project: Calcite
>          Issue Type: Improvement
>          Components: avatica
>            Reporter: Josh Elser
>            Priority: Minor
>             Fix For: 1.8.0
>
>
> Trying to capture some discussion from a recent pull request: 
> https://github.com/apache/calcite/pull/209#issuecomment-195025402
> In a few places (such as 
> https://github.com/apache/calcite/blob/master/avatica/server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcMeta.java#L795-L800),
>  we perform:
> {code}
> TypedValue o = parameterValues.get(i);
> preparedStatement.setObject(i + 1, o.toJdbc(calendar));
> {code}
> Vladimir stated that this is ambiguous (stored procedures differing by 
> argument list and differentiating between the actual type when the value is 
> null) and would be remedied by passing along the desired type when setting 
> the object.
> We may also have to invoke setNull explicitly? This is unclear to me.
> h5. Reasons why "explicit sql type" is important
> h6. Calling the proper function
> Consider database has two functions that differ in type of argument only.
> For instance {{compute(varchar)}}, {{compute(numeric)}}, and 
> {{compute(user_defined_struct)}}
> Which one should be executed if calling with just 
> {{preparedStatement.setObject(i, null)}}?
> There is not enough information for the database to choose between varchar 
> and numeric function.
> h6. Performance
> Execution plan depends on the types of bind parameters. For instance, in 
> PostgreSQL, you must tell all the datatypes of the bind variables right in 
> {{PREPARE}} message.
> That basically means, if you flip between datatypes, you have to use 
> different prepared statement IDs.
> If just {{String val = ...; ps.setObject(1, val)}} is used, then for non-null 
> it can result in {{String}} execution plan, while for null it can flip to 
> unknown.
> Same for batched statement execution. PostgreSQL just cannot handle datatype 
> flips right in the middle of the batch. It is handled in the pgjdbc driver, 
> so it cuts batch in several sub batches, so it becomes less efficient.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to