diff --git a/contrib/shark/expected/rotate-test-part2.out b/contrib/shark/expected/rotate-test-part2.out index 8cc2fd10cd1d1c61d5f6e3a0f6d3d5121d9d3c5f..32fdd3fad5ba6403f6d4ac564b627db641271689 100644 --- a/contrib/shark/expected/rotate-test-part2.out +++ b/contrib/shark/expected/rotate-test-part2.out @@ -12,7 +12,7 @@ SELECT * FROM ( SELECT year, product, amount FROM sales ) AS source_table rotate (count(amount) FOR product IN (A, B, a) ) as pivot; - year | A | B | a + year | a | b | a ------+---+---+--- 2021 | 1 | 1 | 0 2020 | 1 | 1 | 0 @@ -22,7 +22,7 @@ SELECT * FROM ( SELECT year, product, amount FROM sales ) AS source_table rotate (count(amount) FOR product IN ([A], [B], "A", "B", C) ) as pivot; - year | A | B | A | B | C + year | a | b | a | b | c ------+---+---+---+---+--- 2021 | 1 | 1 | 1 | 1 | 0 2020 | 1 | 1 | 1 | 1 | 0 @@ -31,7 +31,7 @@ rotate (count(amount) FOR product IN ([A], [B], "A", "B", C) SELECT * FROM ( SELECT year, product, amount FROM sales) AS source_table rotate ( count(amount) FOR product IN (A, B) ); - year | A | B + year | a | b ------+---+--- 2021 | 1 | 1 2020 | 1 | 1 @@ -40,7 +40,7 @@ rotate ( count(amount) FOR product IN (A, B) ); SELECT * FROM ( SELECT year, product, amount FROM sales) AS source_table rotate ( count(amount) FOR product IN (A, B) ) pivot_table; - year | A | B + year | a | b ------+---+--- 2021 | 1 | 1 2020 | 1 | 1 @@ -50,7 +50,7 @@ SELECT * FROM ( SELECT year, product, amount FROM sales ) AS source_table rotate (count(amount) FOR product IN (A, B, 'A', 'SSS', 1, 2, 2.3, 1011) ) as pivot_table; - year | A | B | A | SSS | 1 | 2 | 2.3 | 1011 + year | a | b | a | sss | 1 | 2 | 2.3 | 1011 ------+---+---+---+-----+---+---+-----+------ 2021 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 2020 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 @@ -60,7 +60,7 @@ SELECT * FROM ( SELECT year, product, amount FROM sales ) AS source_table rotate (count(*) FOR product IN (A, B) ) as pivot; - year | amount | A | B + year | amount | a | b ------+--------+---+--- 2021 | 250.00 | 0 | 1 2021 | 150.00 | 1 | 0 @@ -72,7 +72,7 @@ SELECT * FROM ( SELECT year, product, amount FROM sales ) AS source_table rotate (count(amount) FOR product IN (A, B) ) as pivot order by year; - year | A | B + year | a | b ------+---+--- 2020 | 1 | 1 2021 | 1 | 1 @@ -82,7 +82,7 @@ SELECT * FROM ( SELECT year, product, amount FROM sales ) AS source_table rotate (count(*) FOR product IN (A, B) ) as pivot_table where pivot_table.year > 1; - year | amount | A | B + year | amount | a | b ------+--------+---+--- 2021 | 250.00 | 0 | 1 2021 | 150.00 | 1 | 0 @@ -141,7 +141,7 @@ end; from CategoryTable2 rotate (max(CategoryFieldValue ) for CategoryFieldName in (ItemAssetCategory_Code, ItemCostCategory_Code, ItemCreditCategory_Code, ItemMRPCategory_Code, ItemPriceCategory_Code, ItemProductionCategory_Code, ItemPurchaseCategory_Code, ItemSaleCategory_Code, ItemStockCategory_Code, ItemAssetCategory_Name, ItemCostCategory_Name, ItemCreditCategory_Name, ItemMRPCategory_Name, ItemPriceCategory_Name, ItemProductionCategory_Name, ItemPurchaseCategory_Name, ItemSaleCategory_Name, ItemStockCategory_Name)); - mergedocid | ItemAssetCategory_Code | ItemCostCategory_Code | ItemCreditCategory_Code | ItemMRPCategory_Code | ItemPriceCategory_Code | ItemProductionCategory_Code | ItemPurchaseCategory_Code | ItemSaleCategory_Code | ItemStockCategory_Code | ItemAssetCategory_Name | ItemCostCategory_Name | ItemCreditCategory_Name | ItemMRPCategory_Name | ItemPriceCategory_Name | ItemProductionCategory_Name | ItemPurchaseCategory_Name | ItemSaleCategory_Name | ItemStockCategory_Name + mergedocid | itemassetcategory_code | itemcostcategory_code | itemcreditcategory_code | itemmrpcategory_code | itempricecategory_code | itemproductioncategory_code | itempurchasecategory_code | itemsalecategory_code | itemstockcategory_code | itemassetcategory_name | itemcostcategory_name | itemcreditcategory_name | itemmrpcategory_name | itempricecategory_name | itemproductioncategory_name | itempurchasecategory_name | itemsalecategory_name | itemstockcategory_name ------------+------------------------+-----------------------+-------------------------+----------------------+------------------------+-----------------------------+---------------------------+-----------------------+------------------------+------------------------+-----------------------+-------------------------+----------------------+------------------------+-----------------------------+---------------------------+-----------------------+------------------------ (0 rows) @@ -150,7 +150,7 @@ FROM ( SELECT year, product, amount FROM sales ) AS source_table rotate (count(*) FOR product IN (A, B) ) as pivot_table where pivot_table.year > 1; select * from v1; - year | amount | A | B + year | amount | a | b ------+--------+---+--- 2021 | 250.00 | 0 | 1 2021 | 150.00 | 1 | 0 diff --git a/contrib/shark/expected/rotate-test-part2_ci.out b/contrib/shark/expected/rotate-test-part2_ci.out index 2c764545d399e995ec5054c55eb573c2259a507f..260c80c4bb904c724879c6cf1cf32ac34148f16c 100644 --- a/contrib/shark/expected/rotate-test-part2_ci.out +++ b/contrib/shark/expected/rotate-test-part2_ci.out @@ -15,7 +15,7 @@ SELECT * FROM ( SELECT year, product, amount FROM sales ) AS source_table rotate (count(amount) FOR product IN (A, B, a) ) as pivot; - year | A | B | a + year | a | b | a ------+---+---+--- 2021 | 1 | 1 | 1 2020 | 1 | 1 | 1 @@ -25,7 +25,7 @@ SELECT * FROM ( SELECT year, product, amount FROM sales ) AS source_table rotate (count(amount) FOR product IN ([A], [B], "A", "B", C) ) as pivot; - year | A | B | A | B | C + year | a | b | a | b | c ------+---+---+---+---+--- 2021 | 1 | 1 | 1 | 1 | 0 2020 | 1 | 1 | 1 | 1 | 0 @@ -34,7 +34,7 @@ rotate (count(amount) FOR product IN ([A], [B], "A", "B", C) SELECT * FROM ( SELECT year, product, amount FROM sales) AS source_table rotate ( count(amount) FOR product IN (A, B) ); - year | A | B + year | a | b ------+---+--- 2021 | 1 | 1 2020 | 1 | 1 @@ -43,7 +43,7 @@ rotate ( count(amount) FOR product IN (A, B) ); SELECT * FROM ( SELECT year, product, amount FROM sales) AS source_table rotate ( count(amount) FOR product IN (A, B) ) pivot_table; - year | A | B + year | a | b ------+---+--- 2021 | 1 | 1 2020 | 1 | 1 @@ -53,7 +53,7 @@ SELECT * FROM ( SELECT year, product, amount FROM sales ) AS source_table rotate (count(amount) FOR product IN (A, B, 'A', 'SSS', 1, 2, 2.3, 1011) ) as pivot_table; - year | A | B | A | SSS | 1 | 2 | 2.3 | 1011 + year | a | b | a | sss | 1 | 2 | 2.3 | 1011 ------+---+---+---+-----+---+---+-----+------ 2021 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 2020 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 @@ -63,7 +63,7 @@ SELECT * FROM ( SELECT year, product, amount FROM sales ) AS source_table rotate (count(*) FOR product IN (A, B) ) as pivot; - year | amount | A | B + year | amount | a | b ------+--------+---+--- 2021 | 250.00 | 0 | 1 2021 | 150.00 | 1 | 0 @@ -75,7 +75,7 @@ SELECT * FROM ( SELECT year, product, amount FROM sales ) AS source_table rotate (count(amount) FOR product IN (A, B) ) as pivot order by year; - year | A | B + year | a | b ------+---+--- 2020 | 1 | 1 2021 | 1 | 1 @@ -85,7 +85,7 @@ SELECT * FROM ( SELECT year, product, amount FROM sales ) AS source_table rotate (count(*) FOR product IN (A, B) ) as pivot_table where pivot_table.year > 1; - year | amount | A | B + year | amount | a | b ------+--------+---+--- 2021 | 250.00 | 0 | 1 2021 | 150.00 | 1 | 0 @@ -144,7 +144,7 @@ end; from CategoryTable2 rotate (max(CategoryFieldValue ) for CategoryFieldName in (ItemAssetCategory_Code, ItemCostCategory_Code, ItemCreditCategory_Code, ItemMRPCategory_Code, ItemPriceCategory_Code, ItemProductionCategory_Code, ItemPurchaseCategory_Code, ItemSaleCategory_Code, ItemStockCategory_Code, ItemAssetCategory_Name, ItemCostCategory_Name, ItemCreditCategory_Name, ItemMRPCategory_Name, ItemPriceCategory_Name, ItemProductionCategory_Name, ItemPurchaseCategory_Name, ItemSaleCategory_Name, ItemStockCategory_Name)); - mergedocid | ItemAssetCategory_Code | ItemCostCategory_Code | ItemCreditCategory_Code | ItemMRPCategory_Code | ItemPriceCategory_Code | ItemProductionCategory_Code | ItemPurchaseCategory_Code | ItemSaleCategory_Code | ItemStockCategory_Code | ItemAssetCategory_Name | ItemCostCategory_Name | ItemCreditCategory_Name | ItemMRPCategory_Name | ItemPriceCategory_Name | ItemProductionCategory_Name | ItemPurchaseCategory_Name | ItemSaleCategory_Name | ItemStockCategory_Name + mergedocid | itemassetcategory_code | itemcostcategory_code | itemcreditcategory_code | itemmrpcategory_code | itempricecategory_code | itemproductioncategory_code | itempurchasecategory_code | itemsalecategory_code | itemstockcategory_code | itemassetcategory_name | itemcostcategory_name | itemcreditcategory_name | itemmrpcategory_name | itempricecategory_name | itemproductioncategory_name | itempurchasecategory_name | itemsalecategory_name | itemstockcategory_name ------------+------------------------+-----------------------+-------------------------+----------------------+------------------------+-----------------------------+---------------------------+-----------------------+------------------------+------------------------+-----------------------+-------------------------+----------------------+------------------------+-----------------------------+---------------------------+-----------------------+------------------------ (0 rows) @@ -153,7 +153,7 @@ FROM ( SELECT year, product, amount FROM sales ) AS source_table rotate (count(*) FOR product IN (A, B) ) as pivot_table where pivot_table.year > 1; select * from v1; - year | amount | A | B + year | amount | a | b ------+--------+---+--- 2021 | 250.00 | 0 | 1 2021 | 150.00 | 1 | 0 diff --git a/contrib/shark/output/rotate_part2_dump.source b/contrib/shark/output/rotate_part2_dump.source index bb40b79d8e2416fc1b9a1996654a9e63bc8fd64e..b2b0f1b1b160addaf9a2ebc529bd2312614f4700 100644 --- a/contrib/shark/output/rotate_part2_dump.source +++ b/contrib/shark/output/rotate_part2_dump.source @@ -73,7 +73,7 @@ ALTER VIEW --?.* -- rotate check select * from v1; - year | amount | A | B + year | amount | a | b ------+--------+---+--- 2021 | 250.00 | 0 | 1 2021 | 150.00 | 1 | 0 diff --git a/src/common/backend/parser/parse_clause.cpp b/src/common/backend/parser/parse_clause.cpp index a9ed2fe5a9f2e72c690a0bc38ff0b5bb9e51e104..d2d525353837ab5934d8efb9389488e06a2eabe2 100644 --- a/src/common/backend/parser/parse_clause.cpp +++ b/src/common/backend/parser/parse_clause.cpp @@ -759,8 +759,10 @@ static RangeTblEntry* transformRangeSubselect(ParseState* pstate, RangeSubselect } else if (IsA(resTarget->val, A_Const)) { Value *val = &((A_Const *)resTarget->val)->val; if (val->type == T_String){ - rc = strncat_s(new_col_name, NAMEDATALEN, strVal(val), strlen(strVal(val))); + char* val_dup_temp = pg_strtolower(pstrdup(strVal(val))); + rc = strncat_s(new_col_name, NAMEDATALEN, val_dup_temp, strlen(strVal(val))); securec_check_c(rc, "\0", "\0"); + pfree(val_dup_temp); } else if (val->type == T_Float) { rc = snprintf_s(new_col_name + strlen(new_col_name), NAMEDATALEN - strlen(new_col_name), NAMEDATALEN - strlen(new_col_name) - 1, "%f", floatVal(val)); diff --git a/src/test/regress/expected/gb_ora_rotate_unrotate.out b/src/test/regress/expected/gb_ora_rotate_unrotate.out index c67723ef651b81d2eecdbcacce76f4cf71bbaff4..a859e252cb526a452e6fb39b114264668aaa984e 100644 --- a/src/test/regress/expected/gb_ora_rotate_unrotate.out +++ b/src/test/regress/expected/gb_ora_rotate_unrotate.out @@ -720,3 +720,70 @@ SELECT * FROM sales2 not rotate (sale_all For sale IN ("sale5", "SALE5")) order (10 rows) drop table sales2; +CREATE TABLE t_pivot0001 ( + Product VARCHAR(50), + Quarter CHAR(2), + sales DECIMAL(10,2) +); +INSERT INTO t_pivot0001 VALUES + ('Laptop', 'Q1', 1000.00), + ('Laptop', 'Q2', 1500.00), + ('Phone', 'Q1', 800.00), + ('Phone', 'Q3', 2000.00), + ('Tablet', 'Q4', 500.00); +select * from t_pivot0001; + product | quarter | sales +---------+---------+--------- + Laptop | Q1 | 1000.00 + Laptop | Q2 | 1500.00 + Phone | Q1 | 800.00 + Phone | Q3 | 2000.00 + Tablet | Q4 | 500.00 +(5 rows) + +SELECT Product, Q1, Q2, Q3, Q4 +FROM ( + SELECT Product, Quarter, sales + FROM t_pivot0001 +) AS SourceTable +rotate ( + SUM(sales) + FOR Quarter IN ('Q1', 'Q2', 'Q3', 'Q4') +); + product | q1 | q2 | q3 | q4 +---------+---------+---------+---------+-------- + Tablet | | | | 500.00 + Laptop | 1000.00 | 1500.00 | | + Phone | 800.00 | | 2000.00 | +(3 rows) + +SELECT Product, Q1, Q2, Q3, Q4 +FROM ( + SELECT Product, Quarter, sales + FROM t_pivot0001 +) AS SourceTable +rotate ( + SUM(sales) + FOR Quarter IN ('Q1' as "Q1", 'Q2', 'Q3', 'Q4') +); +ERROR: column "q1" does not exist +LINE 1: SELECT Product, Q1, Q2, Q3, Q4 + ^ +CONTEXT: referenced column: q1 +SELECT Product, "Q1", Q2, Q3, Q4 +FROM ( + SELECT Product, Quarter, sales + FROM t_pivot0001 +) AS SourceTable +rotate ( + SUM(sales) + FOR Quarter IN ('Q1' as "Q1", 'Q2', 'Q3', 'Q4') +); + product | Q1 | q2 | q3 | q4 +---------+---------+---------+---------+-------- + Tablet | | | | 500.00 + Laptop | 1000.00 | 1500.00 | | + Phone | 800.00 | | 2000.00 | +(3 rows) + +drop table t_pivot0001; diff --git a/src/test/regress/sql/gb_ora_rotate_unrotate.sql b/src/test/regress/sql/gb_ora_rotate_unrotate.sql index 8cb15d14c9fbf04ebb261c53a507f3de46319981..2026844ad98275cf63b73ac50f814da35d48fadb 100644 --- a/src/test/regress/sql/gb_ora_rotate_unrotate.sql +++ b/src/test/regress/sql/gb_ora_rotate_unrotate.sql @@ -295,3 +295,50 @@ SELECT * FROM sales2 not rotate (sale_all For sale IN ("sale5", "SALE5")) order drop table sales2; +CREATE TABLE t_pivot0001 ( + Product VARCHAR(50), + Quarter CHAR(2), + sales DECIMAL(10,2) +); + +INSERT INTO t_pivot0001 VALUES + ('Laptop', 'Q1', 1000.00), + ('Laptop', 'Q2', 1500.00), + ('Phone', 'Q1', 800.00), + ('Phone', 'Q3', 2000.00), + ('Tablet', 'Q4', 500.00); +select * from t_pivot0001; + +SELECT Product, Q1, Q2, Q3, Q4 +FROM ( + SELECT Product, Quarter, sales + FROM t_pivot0001 +) AS SourceTable +rotate ( + SUM(sales) + FOR Quarter IN ('Q1', 'Q2', 'Q3', 'Q4') +); + +SELECT Product, Q1, Q2, Q3, Q4 +FROM ( + SELECT Product, Quarter, sales + FROM t_pivot0001 +) AS SourceTable +rotate ( + SUM(sales) + FOR Quarter IN ('Q1' as "Q1", 'Q2', 'Q3', 'Q4') +); + + +SELECT Product, "Q1", Q2, Q3, Q4 +FROM ( + SELECT Product, Quarter, sales + FROM t_pivot0001 +) AS SourceTable +rotate ( + SUM(sales) + FOR Quarter IN ('Q1' as "Q1", 'Q2', 'Q3', 'Q4') +); + +drop table t_pivot0001; +