Skip to content

Commit 43e9b3a

Browse files
authored
Use duckdb column aliases for all top level duckdb subscripts (#856)
We were using the nicer duckdb aliases for top level subscripts for `duckdb.row` subscripts, but now that we have other types it makes sense to include it there too. We only do it for Postgres types so queries using `duckdb.force_execution` still return the same column names.
1 parent b60890f commit 43e9b3a

File tree

8 files changed

+39
-17
lines changed

8 files changed

+39
-17
lines changed

include/pgduckdb/pgduckdb_ruleutils.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ bool pgduckdb_is_unresolved_type(Oid type_oid);
2222
bool pgduckdb_is_fake_type(Oid type_oid);
2323
bool pgduckdb_var_is_duckdb_row(Var *var);
2424
bool pgduckdb_func_returns_duckdb_row(RangeTblFunction *rtfunc);
25-
Var *pgduckdb_duckdb_row_subscript_var(Expr *expr);
25+
Var *pgduckdb_duckdb_subscript_var(Expr *expr);
2626
bool pgduckdb_reconstruct_star_step(StarReconstructionContext *ctx, ListCell *tle_cell);
2727
bool pgduckdb_replace_subquery_with_view(Query *query, StringInfo buf);
2828
int pgduckdb_show_type(Const *constval, int original_showtype);

src/pgduckdb_ruleutils.cpp

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,27 @@ pgduckdb_is_fake_type(Oid type_oid) {
9898
return false;
9999
}
100100

101+
bool
102+
pgduckdb_is_duckdb_subscript_type(Oid type_oid) {
103+
if (pgduckdb_is_unresolved_type(type_oid)) {
104+
return true;
105+
}
106+
107+
if (pgduckdb_is_duckdb_row(type_oid)) {
108+
return true;
109+
}
110+
111+
if (pgduckdb::DuckdbStructOid() == type_oid) {
112+
return true;
113+
}
114+
115+
if (pgduckdb::DuckdbMapOid() == type_oid) {
116+
return true;
117+
}
118+
119+
return false;
120+
}
121+
101122
bool
102123
pgduckdb_var_is_duckdb_row(Var *var) {
103124
if (!var) {
@@ -122,11 +143,11 @@ pgduckdb_func_returns_duckdb_row(RangeTblFunction *rtfunc) {
122143
}
123144

124145
/*
125-
* Returns NULL if the expression is not a subscript on a duckdb row. Returns
126-
* the Var of the duckdb row if it is.
146+
* Returns NULL if the expression is a subscript on a duckdb specific type.
147+
* Returns the Var of the duckdb row if it is.
127148
*/
128149
Var *
129-
pgduckdb_duckdb_row_subscript_var(Expr *expr) {
150+
pgduckdb_duckdb_subscript_var(Expr *expr) {
130151
if (!expr) {
131152
return NULL;
132153
}
@@ -143,9 +164,10 @@ pgduckdb_duckdb_row_subscript_var(Expr *expr) {
143164

144165
Var *refexpr = (Var *)subscript->refexpr;
145166

146-
if (!pgduckdb_var_is_duckdb_row(refexpr)) {
167+
if (!pgduckdb_is_duckdb_subscript_type(refexpr->vartype)) {
147168
return NULL;
148169
}
170+
149171
return refexpr;
150172
}
151173

src/vendor/pg_ruleutils_14.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6075,7 +6075,7 @@ get_target_list(List *targetList, deparse_context *context,
60756075
* to the column name are still valid.
60766076
*/
60776077
if (!duckdb_skip_as && outermost_targetlist) {
6078-
Var *subscript_var = pgduckdb_duckdb_row_subscript_var(tle->expr);
6078+
Var *subscript_var = pgduckdb_duckdb_subscript_var(tle->expr);
60796079
if (subscript_var) {
60806080
/*
60816081
* This cannot be moved to pgduckdb_ruleutils, because of

src/vendor/pg_ruleutils_15.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6156,7 +6156,7 @@ get_target_list(List *targetList, deparse_context *context,
61566156
* to the column name are still valid.
61576157
*/
61586158
if (!duckdb_skip_as && outermost_targetlist) {
6159-
Var *subscript_var = pgduckdb_duckdb_row_subscript_var(tle->expr);
6159+
Var *subscript_var = pgduckdb_duckdb_subscript_var(tle->expr);
61606160
if (subscript_var) {
61616161
/*
61626162
* This cannot be moved to pgduckdb_ruleutils, because of

src/vendor/pg_ruleutils_16.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6115,7 +6115,7 @@ get_target_list(List *targetList, deparse_context *context,
61156115
* to the column name are still valid.
61166116
*/
61176117
if (!duckdb_skip_as && outermost_targetlist) {
6118-
Var *subscript_var = pgduckdb_duckdb_row_subscript_var(tle->expr);
6118+
Var *subscript_var = pgduckdb_duckdb_subscript_var(tle->expr);
61196119
if (subscript_var) {
61206120
/*
61216121
* This cannot be moved to pgduckdb_ruleutils, because of

src/vendor/pg_ruleutils_17.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6129,7 +6129,7 @@ get_target_list(List *targetList, deparse_context *context,
61296129
* to the column name are still valid.
61306130
*/
61316131
if (!duckdb_skip_as && outermost_targetlist) {
6132-
Var *subscript_var = pgduckdb_duckdb_row_subscript_var(tle->expr);
6132+
Var *subscript_var = pgduckdb_duckdb_subscript_var(tle->expr);
61336133
if (subscript_var) {
61346134
/*
61356135
* This cannot be moved to pgduckdb_ruleutils, because of

src/vendor/pg_ruleutils_18.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6333,7 +6333,7 @@ get_target_list(List *targetList, deparse_context *context)
63336333
* to the column name are still valid.
63346334
*/
63356335
if (!duckdb_skip_as && outermost_targetlist) {
6336-
Var *subscript_var = pgduckdb_duckdb_row_subscript_var(tle->expr);
6336+
Var *subscript_var = pgduckdb_duckdb_subscript_var(tle->expr);
63376337
if (subscript_var) {
63386338
/*
63396339
* This cannot be moved to pgduckdb_ruleutils, because of

test/regression/expected/read_functions.out

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,9 @@ SELECT jsoncol[1], arraycol[2] FROM (
4141
SELECT r['jsoncol'] jsoncol, r['arraycol'] arraycol
4242
FROM read_parquet('../../data/indexable.parquet') r
4343
) q;
44-
jsoncol | arraycol
45-
---------+----------
46-
"d" | 22
44+
jsoncol[1] | arraycol[2]
45+
------------+-------------
46+
"d" | 22
4747
(1 row)
4848

4949
-- And the same for slice subscripts
@@ -57,8 +57,8 @@ SELECT arraycol[1:2] FROM (
5757
SELECT r['arraycol'] arraycol
5858
FROM read_parquet('../../data/indexable.parquet') r
5959
) q;
60-
arraycol
61-
----------
60+
arraycol[1:2]
61+
---------------
6262
{11,22}
6363
(1 row)
6464

@@ -72,8 +72,8 @@ SELECT arraycol[:] FROM (
7272
SELECT r['arraycol'] arraycol
7373
FROM read_parquet('../../data/indexable.parquet') r
7474
) q;
75-
arraycol
76-
------------
75+
arraycol[:]
76+
-------------
7777
{11,22,33}
7878
(1 row)
7979

0 commit comments

Comments
 (0)