Matevž Bradač created DRILL-7722:
------------------------------------

             Summary: CREATE VIEW with LATERAL UNNEST creates an invalid view
                 Key: DRILL-7722
                 URL: https://issues.apache.org/jira/browse/DRILL-7722
             Project: Apache Drill
          Issue Type: Bug
          Components: SQL Parser
    Affects Versions: 1.17.0
            Reporter: Matevž Bradač


Creating a view from a query containing LATERAL UNNEST results in a view that 
cannot be parsed by the engine. The generated view contains superfluous 
parentheses, thus the failed parsing.

{code:bash|title=a simple JSON database}
$ cat /tmp/t.json
[{"name": "item_1", "related": ["id1"]}, {"name": "item_2", "related": ["id1", 
"id2"]}, {"name": "item_3", "related": ["id2"]}]
{code}

{code:SQL|title=drill query, working}
SELECT
  item.name,
  relations.*
FROM dfs.tmp.`t.json` item
JOIN LATERAL(
  SELECT * FROM UNNEST(item.related) i(rels)
) relations
ON TRUE

     name rels
0  item_1  id1
1  item_2  id1
2  item_2  id2
3  item_3  id2
{code}

{code:SQL|title=create a drill view from the above query}
CREATE VIEW dfs.tmp.unnested_view AS
SELECT
  item.name,
  relations.*
FROM dfs.tmp.`t.json` item
JOIN LATERAL(
  SELECT * FROM UNNEST(item.related) i(rels)
) relations
ON TRUE
{code}


{code:bash|title=contents of view file}
# note the extra parentheses near LATERAL and FROM
$ cat /tmp/unnested_view.view.drill
{
  "name" : "unnested_view",
  "sql" : "SELECT `item`.`name`, `relations`.*\nFROM `dfs`.`tmp`.`t.json` AS 
`item`\nINNER JOIN LATERAL((SELECT *\nFROM (UNNEST(`item`.`related`)) AS `i` 
(`rels`))) AS `relations` ON TRUE",
  "fields" : [ {
    "name" : "name",
    "type" : "ANY",
    "isNullable" : true
  }, {
    "name" : "rels",
    "type" : "ANY",
    "isNullable" : true
  } ],
  "workspaceSchemaPath" : [ ]
}
{code}

{code:SQL|title=query the view}
SELECT * FROM dfs.tmp.unnested_view

PARSE ERROR: Failure parsing a view your query is dependent upon.

SQL Query: SELECT `item`.`name`, `relations`.*
FROM `dfs`.`tmp`.`t.json` AS `item`
INNER JOIN LATERAL((SELECT *
FROM (UNNEST(`item`.`related`)) AS `i` (`rels`))) AS `relations` ON TRUE
     ^

[Error Id: fd816a27-c2c5-4c2a-b6bf-173ab37eb693 ]
{code}


If the view is "fixed" by editing the generated JSON and removing the extra 
parentheses, e.g.
{code:bash|title=fixed view}
$ cat /tmp/fixed_unnested_view.view.drill
{
  "name" : "fixed_unnested_view",
  "sql" : "SELECT `item`.`name`, `relations`.*\nFROM `dfs`.`tmp`.`t.json` AS 
`item`\nINNER JOIN LATERAL(SELECT *\nFROM UNNEST(`item`.`related`) AS `i` 
(`rels`)) AS `relations` ON TRUE",
  "fields" : [ {
    "name" : "name",
    "type" : "ANY",
    "isNullable" : true
  }, {
    "name" : "rels",
    "type" : "ANY",
    "isNullable" : true
  } ],
  "workspaceSchemaPath" : [ ]
}
{code}

then querying works as expected:
{code:sql|title=fixed view query}
SELECT * FROM dfs.tmp.unnested_view

     name rels
0  item_1  id1
1  item_2  id1
2  item_2  id2
3  item_3  id2
{code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to