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

Stamatis Zampetakis commented on CALCITE-3243:
----------------------------------------------

Hi [~wangm92],

You are running a different variation of the function which most likely works 
well. In my case the following code:
{code:java}
tester.checkString("json_value(true, 'strict $.foo')", "100", "VARCHAR(2000)");
{code}

leads to the following generated code 


{code:java}
public org.apache.calcite.linq4j.Enumerable bind(final 
org.apache.calcite.DataContext root) {
  final org.apache.calcite.linq4j.Enumerable _inputEnumerable = 
org.apache.calcite.linq4j.Linq4j.asEnumerable(new Integer[] {
    0});
  return new org.apache.calcite.linq4j.AbstractEnumerable(){
      public org.apache.calcite.linq4j.Enumerator enumerator() {
        return new org.apache.calcite.linq4j.Enumerator(){
            public final org.apache.calcite.linq4j.Enumerator inputEnumerator = 
_inputEnumerable.enumerator();
            public void reset() {
              inputEnumerator.reset();
            }

            public boolean moveNext() {
              return inputEnumerator.moveNext();
            }

            public void close() {
              inputEnumerator.close();
            }

            public Object current() {
              final Object v0 = 
org.apache.calcite.runtime.JsonFunctions.jsonValueAny(true, "strict $.foo", 
org.apache.calcite.sql.SqlJsonValueEmptyOrErrorBehavior.NULL, null, 
org.apache.calcite.sql.SqlJsonValueEmptyOrErrorBehavior.NULL, null);
              return 
Boolean.valueOf(org.apache.calcite.runtime.JsonFunctions.jsonValueAny(true, 
"strict $.foo", org.apache.calcite.sql.SqlJsonValueEmptyOrErrorBehavior.NULL, 
null, org.apache.calcite.sql.SqlJsonValueEmptyOrErrorBehavior.NULL, null) == 
null) ? (String) null : org.apache.calcite.runtime.SqlFunctions.truncate(v0 == 
null ? (String) null : v0.toString(), 2000);
            }

          };
      }

    };
}
public Class getElementType() {
  return java.lang.String.class;
}
{code}

with the  stacktrace shown below:

{noformat}
at 
org.apache.calcite.adapter.enumerable.EnumerableInterpretable.toBindable(EnumerableInterpretable.java:128)
        at 
org.apache.calcite.prepare.CalcitePrepareImpl$CalcitePreparingStmt.implement(CalcitePrepareImpl.java:1110)
        at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:332)
        at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:231)
        at 
org.apache.calcite.prepare.CalcitePrepareImpl.prepare2_(CalcitePrepareImpl.java:638)
        at 
org.apache.calcite.prepare.CalcitePrepareImpl.prepare_(CalcitePrepareImpl.java:502)
        at 
org.apache.calcite.prepare.CalcitePrepareImpl.prepareSql(CalcitePrepareImpl.java:472)
        at 
org.apache.calcite.jdbc.CalciteConnectionImpl.parseQuery(CalciteConnectionImpl.java:231)
        at 
org.apache.calcite.jdbc.CalciteMetaImpl.prepareAndExecute(CalciteMetaImpl.java:550)
        at 
org.apache.calcite.avatica.AvaticaConnection.prepareAndExecuteInternal(AvaticaConnection.java:675)
        at 
org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement.java:156)
        ... 28 more
Caused by: org.codehaus.commons.compiler.CompileException: Line 21, Column 87: 
No applicable constructor/method found for actual parameters "boolean, 
java.lang.String, org.apache.calcite.sql.SqlJsonValueEmptyOrErrorBehavior, 
void, org.apache.calcite.sql.SqlJsonValueEmptyOrErrorBehavior, void"; 
candidates are: "public static java.lang.Object 
org.apache.calcite.runtime.JsonFunctions.jsonValueAny(org.apache.calcite.runtime.JsonFunctions$JsonPathContext,
 org.apache.calcite.sql.SqlJsonValueEmptyOrErrorBehavior, java.lang.Object, 
org.apache.calcite.sql.SqlJsonValueEmptyOrErrorBehavior, java.lang.Object)", 
"public static java.lang.Object 
org.apache.calcite.runtime.JsonFunctions.jsonValueAny(org.apache.calcite.runtime.JsonFunctions$JsonValueContext,
 java.lang.String, org.apache.calcite.sql.SqlJsonValueEmptyOrErrorBehavior, 
java.lang.Object, org.apache.calcite.sql.SqlJsonValueEmptyOrErrorBehavior, 
java.lang.Object)", "public static java.lang.Object 
org.apache.calcite.runtime.JsonFunctions.jsonValueAny(java.lang.String, 
java.lang.String, org.apache.calcite.sql.SqlJsonValueEmptyOrErrorBehavior, 
java.lang.Object, org.apache.calcite.sql.SqlJsonValueEmptyOrErrorBehavior, 
java.lang.Object)"
        at 
org.codehaus.janino.UnitCompiler.compileError(UnitCompiler.java:12211)
        at 
org.codehaus.janino.UnitCompiler.findMostSpecificIInvocable(UnitCompiler.java:9263)
        at org.codehaus.janino.UnitCompiler.findIMethod(UnitCompiler.java:9123)
        at org.codehaus.janino.UnitCompiler.findIMethod(UnitCompiler.java:9025)
        at org.codehaus.janino.UnitCompiler.compileGet2(UnitCompiler.java:5062)
        at org.codehaus.janino.UnitCompiler.access$9100(UnitCompiler.java:215)
        at 
org.codehaus.janino.UnitCompiler$16.visitMethodInvocation(UnitCompiler.java:4423)
        at 
org.codehaus.janino.UnitCompiler$16.visitMethodInvocation(UnitCompiler.java:4396)
        at org.codehaus.janino.Java$MethodInvocation.accept(Java.java:5073)
        at org.codehaus.janino.UnitCompiler.compileGet(UnitCompiler.java:4396)
        at 
org.codehaus.janino.UnitCompiler.compileGetValue(UnitCompiler.java:5662)
        at org.codehaus.janino.UnitCompiler.compile2(UnitCompiler.java:2580)
        at org.codehaus.janino.UnitCompiler.access$2700(UnitCompiler.java:215)
        at 
org.codehaus.janino.UnitCompiler$6.visitLocalVariableDeclarationStatement(UnitCompiler.java:1503)
        at 
org.codehaus.janino.UnitCompiler$6.visitLocalVariableDeclarationStatement(UnitCompiler.java:1487)
        at 
org.codehaus.janino.Java$LocalVariableDeclarationStatement.accept(Java.java:3522)
        at org.codehaus.janino.UnitCompiler.compile(UnitCompiler.java:1487)
        at 
org.codehaus.janino.UnitCompiler.compileStatements(UnitCompiler.java:1567)
        at org.codehaus.janino.UnitCompiler.compile(UnitCompiler.java:3388)
        at 
org.codehaus.janino.UnitCompiler.compileDeclaredMethods(UnitCompiler.java:1357)
        at 
org.codehaus.janino.UnitCompiler.compileDeclaredMethods(UnitCompiler.java:1330)
        at org.codehaus.janino.UnitCompiler.compile2(UnitCompiler.java:822)
        at org.codehaus.janino.UnitCompiler.compile2(UnitCompiler.java:981)
        at org.codehaus.janino.UnitCompiler.compile2(UnitCompiler.java:951)
        at org.codehaus.janino.UnitCompiler.access$200(UnitCompiler.java:215)
        at 
org.codehaus.janino.UnitCompiler$2.visitAnonymousClassDeclaration(UnitCompiler.java:409)
        at 
org.codehaus.janino.UnitCompiler$2.visitAnonymousClassDeclaration(UnitCompiler.java:406)
        at 
org.codehaus.janino.Java$AnonymousClassDeclaration.accept(Java.java:1149)
        at org.codehaus.janino.UnitCompiler.compile(UnitCompiler.java:406)
        at org.codehaus.janino.UnitCompiler.compileGet2(UnitCompiler.java:5509)
        at org.codehaus.janino.UnitCompiler.access$9500(UnitCompiler.java:215)
        at 
org.codehaus.janino.UnitCompiler$16.visitNewAnonymousClassInstance(UnitCompiler.java:4432)
        at 
org.codehaus.janino.UnitCompiler$16.visitNewAnonymousClassInstance(UnitCompiler.java:4396)
        at 
org.codehaus.janino.Java$NewAnonymousClassInstance.accept(Java.java:5238)
        at org.codehaus.janino.UnitCompiler.compileGet(UnitCompiler.java:4396)
        at 
org.codehaus.janino.UnitCompiler.compileGetValue(UnitCompiler.java:5662)
        at org.codehaus.janino.UnitCompiler.compile2(UnitCompiler.java:2649)
        at org.codehaus.janino.UnitCompiler.access$2800(UnitCompiler.java:215)
        at 
org.codehaus.janino.UnitCompiler$6.visitReturnStatement(UnitCompiler.java:1504)
        at 
org.codehaus.janino.UnitCompiler$6.visitReturnStatement(UnitCompiler.java:1487)
        at org.codehaus.janino.Java$ReturnStatement.accept(Java.java:3563)
        at org.codehaus.janino.UnitCompiler.compile(UnitCompiler.java:1487)
        at 
org.codehaus.janino.UnitCompiler.compileStatements(UnitCompiler.java:1567)
        at org.codehaus.janino.UnitCompiler.compile(UnitCompiler.java:3388)
        at 
org.codehaus.janino.UnitCompiler.compileDeclaredMethods(UnitCompiler.java:1357)
        at 
org.codehaus.janino.UnitCompiler.compileDeclaredMethods(UnitCompiler.java:1330)
        at org.codehaus.janino.UnitCompiler.compile2(UnitCompiler.java:822)
        at org.codehaus.janino.UnitCompiler.compile2(UnitCompiler.java:981)
        at org.codehaus.janino.UnitCompiler.compile2(UnitCompiler.java:951)
        at org.codehaus.janino.UnitCompiler.access$200(UnitCompiler.java:215)
        at 
org.codehaus.janino.UnitCompiler$2.visitAnonymousClassDeclaration(UnitCompiler.java:409)
        at 
org.codehaus.janino.UnitCompiler$2.visitAnonymousClassDeclaration(UnitCompiler.java:406)
        at 
org.codehaus.janino.Java$AnonymousClassDeclaration.accept(Java.java:1149)
        at org.codehaus.janino.UnitCompiler.compile(UnitCompiler.java:406)
        at org.codehaus.janino.UnitCompiler.compileGet2(UnitCompiler.java:5509)
        at org.codehaus.janino.UnitCompiler.access$9500(UnitCompiler.java:215)
        at 
org.codehaus.janino.UnitCompiler$16.visitNewAnonymousClassInstance(UnitCompiler.java:4432)
        at 
org.codehaus.janino.UnitCompiler$16.visitNewAnonymousClassInstance(UnitCompiler.java:4396)
        at 
org.codehaus.janino.Java$NewAnonymousClassInstance.accept(Java.java:5238)
        at org.codehaus.janino.UnitCompiler.compileGet(UnitCompiler.java:4396)
        at 
org.codehaus.janino.UnitCompiler.compileGetValue(UnitCompiler.java:5662)
        at org.codehaus.janino.UnitCompiler.compile2(UnitCompiler.java:2649)
        at org.codehaus.janino.UnitCompiler.access$2800(UnitCompiler.java:215)
        at 
org.codehaus.janino.UnitCompiler$6.visitReturnStatement(UnitCompiler.java:1504)
        at 
org.codehaus.janino.UnitCompiler$6.visitReturnStatement(UnitCompiler.java:1487)
        at org.codehaus.janino.Java$ReturnStatement.accept(Java.java:3563)
        at org.codehaus.janino.UnitCompiler.compile(UnitCompiler.java:1487)
        at 
org.codehaus.janino.UnitCompiler.compileStatements(UnitCompiler.java:1567)
        at org.codehaus.janino.UnitCompiler.compile(UnitCompiler.java:3388)
        at 
org.codehaus.janino.UnitCompiler.compileDeclaredMethods(UnitCompiler.java:1357)
        at 
org.codehaus.janino.UnitCompiler.compileDeclaredMethods(UnitCompiler.java:1330)
        at org.codehaus.janino.UnitCompiler.compile2(UnitCompiler.java:822)
        at org.codehaus.janino.UnitCompiler.compile2(UnitCompiler.java:432)
        at org.codehaus.janino.UnitCompiler.access$400(UnitCompiler.java:215)
        at 
org.codehaus.janino.UnitCompiler$2.visitPackageMemberClassDeclaration(UnitCompiler.java:411)
        at 
org.codehaus.janino.UnitCompiler$2.visitPackageMemberClassDeclaration(UnitCompiler.java:406)
        at 
org.codehaus.janino.Java$PackageMemberClassDeclaration.accept(Java.java:1414)
        at org.codehaus.janino.UnitCompiler.compile(UnitCompiler.java:406)
        at org.codehaus.janino.UnitCompiler.compileUnit(UnitCompiler.java:378)
        at org.codehaus.janino.SimpleCompiler.cook(SimpleCompiler.java:237)
        at 
org.codehaus.janino.SimpleCompiler.compileToClassLoader(SimpleCompiler.java:465)
        at 
org.codehaus.janino.ClassBodyEvaluator.compileToClass(ClassBodyEvaluator.java:313)
        at 
org.codehaus.janino.ClassBodyEvaluator.cook(ClassBodyEvaluator.java:235)
        at org.codehaus.janino.SimpleCompiler.cook(SimpleCompiler.java:207)
        at org.codehaus.commons.compiler.Cookable.cook(Cookable.java:50)
        at 
org.codehaus.janino.ClassBodyEvaluator.createInstance(ClassBodyEvaluator.java:347)
        at 
org.apache.calcite.adapter.enumerable.EnumerableInterpretable.getBindable(EnumerableInterpretable.java:162)
        at 
org.apache.calcite.adapter.enumerable.EnumerableInterpretable.toBindable(EnumerableInterpretable.java:125)
{noformat}




> Incomplete validation of operands in JSON functions  
> -----------------------------------------------------
>
>                 Key: CALCITE-3243
>                 URL: https://issues.apache.org/jira/browse/CALCITE-3243
>             Project: Calcite
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 1.20.0
>            Reporter: Stamatis Zampetakis
>            Priority: Major
>
> The operands of various JSON functions are not validated correctly. 
> Consider for instance the {{JSON_VALUE}} function and the following calls:
> {code:sql}
> json_value('{\"foo\":100}', 'strict $.foo')"
> json_value(1, 'strict $.foo')"
> json_value(TRUE, 'strict $.foo')"
> {code}
> The first call is legal but the next are not; if I am not wrong the operands 
> should be always CHAR or VARCHAR literals which is not the case above.
> Queries involving such calls fail at runtime when compiling generated code. I 
> guess that such kind of problems should be captured by the validator and we 
> should not even arrive at the code generation step.
> The problems can be easily reproduced by adding such calls in the 
> {{SqlOperatorBaseTest}}.
> The problem does not only affect {{JSON_VALUE}} but other JSON functions 
> (such as {{JSON_QUERY}} etc.) as well. 



--
This message was sent by Atlassian JIRA
(v7.6.14#76016)

Reply via email to