google / zetasql

ZetaSQL - Analyzer Framework for SQL
Apache License 2.0
2.28k stars 214 forks source link

Building ResolvedJoinScan receive "joinExpr must not be null" #62

Closed serebro closed 3 years ago

serebro commented 3 years ago

Trying to rebuild ResolvedJoinScan from the query SELECT * FROM (SELECT 1 AS a), (SELECT 2 AS b) I receive the error `joinExpr must not be null", similar to #61.

A simplified example to reproduce:

String sql1 = "SELECT * FROM (SELECT 1 AS a), (SELECT 2 AS b)";
ResolvedQueryStmt analyzedStatement = (ResolvedQueryStmt) Analyzer.analyzeStatement(sql1, new AnalyzerOptions(), new SimpleCatalog(""));
ResolvedProjectScan query = (ResolvedProjectScan) analyzedStatement.getQuery();
ResolvedJoinScan inputScan = (ResolvedJoinScan) query.getInputScan();
ResolvedNodes.ResolvedJoinScan.Builder builder = inputScan.toBuilder();
builder.setJoinExpr(inputScan.getJoinExpr()); // will be failed with message "joinExpr must not be null"
builder.build();
matthewcbrown commented 3 years ago

try the new version, see if that fixes it

serebro commented 3 years ago

The last update 2021-02-1 unfortunately does not solve the problem, same error.

matthewcbrown commented 3 years ago

I didn't look closely enough at your problem. This is actually working as intended, inputScan.getJoinExpr is nullptr (because it is not specifed in the query):

bazel build //zetasql/tools/execute_query:execute_query
bazel-bin/zetasql/tools/execute_query/execute_query "SELECT * FROM (SELECT 1 AS a), (SELECT 2 AS b)" --mode=resolve
QueryStmt
+-output_column_list=
| +-$subquery1.a#1 AS a [INT64]
| +-$subquery2.b#2 AS b [INT64]
+-query=
  +-ProjectScan
    +-column_list=[$subquery1.a#1, $subquery2.b#2]
    +-input_scan=
      +-JoinScan
        +-column_list=[$subquery1.a#1, $subquery2.b#2]
        +-left_scan=
        | +-ProjectScan
        |   +-column_list=[$subquery1.a#1]
        |   +-expr_list=
        |   | +-a#1 := Literal(type=INT64, value=1)
        |   +-input_scan=
        |     +-SingleRowScan
        +-right_scan=
          +-ProjectScan
            +-column_list=[$subquery2.b#2]
            +-expr_list=
            | +-b#2 := Literal(type=INT64, value=2)
            +-input_scan=
              +-SingleRowScan

If we modify it to include a join...on clause, we can see the join_expr is now specified:
```bazel-bin/zetasql/tools/execute_query/execute_query "SELECT * FROM (SELECT 1 AS a) join (SELECT 2 AS b) on true" --mode=resolve
QueryStmt
+-output_column_list=
| +-$subquery1.a#1 AS a [INT64]
| +-$subquery2.b#2 AS b [INT64]
+-query=
  +-ProjectScan
    +-column_list=[$subquery1.a#1, $subquery2.b#2]
    +-input_scan=
      +-JoinScan
        +-column_list=[$subquery1.a#1, $subquery2.b#2]
        +-left_scan=
        | +-ProjectScan
        |   +-column_list=[$subquery1.a#1]
        |   +-expr_list=
        |   | +-a#1 := Literal(type=INT64, value=1)
        |   +-input_scan=
        |     +-SingleRowScan
        +-right_scan=
        | +-ProjectScan
        |   +-column_list=[$subquery2.b#2]
        |   +-expr_list=
        |   | +-b#2 := Literal(type=INT64, value=2)
        |   +-input_scan=
        |     +-SingleRowScan
        +-join_expr=
          +-Literal(type=BOOL, value=true)
serebro commented 3 years ago

@matthewcbrown thank you very much. I have checked it again, it works.