Skip to content

[Bug] Derived table aliased catalog cannot be referenced: TPC-DS Q49 fails with Column 'catalog.return_rank' cannot be resolved #79807

Description

@djouallah

I found this while running TPC-DS on StarRocks in an open benchmark (djouallah/lakehouse_benchmark, run 36230441153). TPC-DS Q49 aliases three derived tables web, catalog and store. The web references resolve, but catalog.return_rank does not, apparently because catalog.x is read as a catalog-qualified name rather than as a column of the derived table aliased catalog. DuckDB, Spark and Spark + Gluten run the query unchanged.

Steps to reproduce

Iceberg external catalog (REST), TPC-DS SF=10 tables. Run TPC-DS Q49:

SELECT channel,
       item,
       return_ratio,
       return_rank,
       currency_rank
FROM
  (SELECT 'web' AS channel,
          web.item,
          web.return_ratio,
          web.return_rank,
          web.currency_rank
   FROM
     (SELECT item,
             return_ratio,
             currency_ratio,
             rank() OVER (
                          ORDER BY return_ratio) AS return_rank,
                         rank() OVER (
                                      ORDER BY currency_ratio) AS currency_rank
      FROM
        (SELECT ws.ws_item_sk AS item,
                (cast(sum(coalesce(wr.wr_return_quantity,0)) AS decimal(15,4))/ cast(sum(coalesce(ws.ws_quantity,0)) AS decimal(15,4))) AS return_ratio,
                (cast(sum(coalesce(wr.wr_return_amt,0)) AS decimal(15,4))/ cast(sum(coalesce(ws.ws_net_paid,0)) AS decimal(15,4))) AS currency_ratio
         FROM web_sales ws
         LEFT OUTER JOIN web_returns wr ON (ws.ws_order_number = wr.wr_order_number
                                            AND ws.ws_item_sk = wr.wr_item_sk) ,date_dim AS date_dim
         WHERE wr.wr_return_amt > 10000
           AND ws.ws_net_profit > 1
           AND ws.ws_net_paid > 0
           AND ws.ws_quantity > 0
           AND ws_sold_date_sk = d_date_sk
           AND d_year = 2001
           AND d_moy = 12
         GROUP BY ws.ws_item_sk) in_web) web
   WHERE (web.return_rank <= 10
          OR web.currency_rank <= 10)
   UNION SELECT 'catalog' AS channel,
                catalog.item,
                catalog.return_ratio,
                catalog.return_rank,
                catalog.currency_rank
   FROM
     (SELECT item,
             return_ratio,
             currency_ratio,
             rank() OVER (
                          ORDER BY return_ratio) AS return_rank,
                         rank() OVER (
                                      ORDER BY currency_ratio) AS currency_rank
      FROM
        (SELECT cs.cs_item_sk AS item,
                (cast(sum(coalesce(cr.cr_return_quantity,0)) AS decimal(15,4))/ cast(sum(coalesce(cs.cs_quantity,0)) AS decimal(15,4))) AS return_ratio,
                (cast(sum(coalesce(cr.cr_return_amount,0)) AS decimal(15,4))/ cast(sum(coalesce(cs.cs_net_paid,0)) AS decimal(15,4))) AS currency_ratio
         FROM catalog_sales cs
         LEFT OUTER JOIN catalog_returns cr ON (cs.cs_order_number = cr.cr_order_number
                                                AND cs.cs_item_sk = cr.cr_item_sk) ,date_dim AS date_dim
         WHERE cr.cr_return_amount > 10000
           AND cs.cs_net_profit > 1
           AND cs.cs_net_paid > 0
           AND cs.cs_quantity > 0
           AND cs_sold_date_sk = d_date_sk
           AND d_year = 2001
           AND d_moy = 12
         GROUP BY cs.cs_item_sk) in_cat) CATALOG
   WHERE (catalog.return_rank <= 10
          OR catalog.currency_rank <=10)
   UNION SELECT 'store' AS channel,
                store.item,
                store.return_ratio,
                store.return_rank,
                store.currency_rank
   FROM
     (SELECT item,
             return_ratio,
             currency_ratio,
             rank() OVER (
                          ORDER BY return_ratio) AS return_rank,
                         rank() OVER (
                                      ORDER BY currency_ratio) AS currency_rank
      FROM
        (SELECT sts.ss_item_sk AS item,
                (cast(sum(coalesce(sr.sr_return_quantity,0)) AS decimal(15,4))/cast(sum(coalesce(sts.ss_quantity,0)) AS decimal(15,4))) AS return_ratio,
                (cast(sum(coalesce(sr.sr_return_amt,0)) AS decimal(15,4))/cast(sum(coalesce(sts.ss_net_paid,0)) AS decimal(15,4))) AS currency_ratio
         FROM store_sales sts
         LEFT OUTER JOIN store_returns sr ON (sts.ss_ticket_number = sr.sr_ticket_number
                                              AND sts.ss_item_sk = sr.sr_item_sk) ,date_dim AS date_dim
         WHERE sr.sr_return_amt > 10000
           AND sts.ss_net_profit > 1
           AND sts.ss_net_paid > 0
           AND sts.ss_quantity > 0
           AND ss_sold_date_sk = d_date_sk
           AND d_year = 2001
           AND d_moy = 12
         GROUP BY sts.ss_item_sk) in_store) store
   WHERE (store.return_rank <= 10
          OR store.currency_rank <= 10) ) sq1
ORDER BY 1 NULLS FIRST,
         4 NULLS FIRST,
         5 NULLS FIRST,
         2 NULLS FIRST
LIMIT 100;

Expected behavior

catalog.item, catalog.return_rank and so on resolve to the columns of the derived table aliased catalog, as web.return_rank does.

Real behavior

ERROR 1064: Getting analyzing error. Detail message: Column '`catalog`.`return_rank`' cannot be resolved.

StarRocks version

4.1.4-4a9848e (starrocks/allin1-ubuntu:4.1-latest)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions