@@ -62,9 +62,11 @@ def compile_sql(
62
62
if ordered :
63
63
node , limit = rewrites .pullup_limit_from_slice (node )
64
64
node = nodes .bottom_up (node , rewrites .rewrite_slice )
65
+ # TODO: Extract out CTEs
65
66
node , ordering = rewrites .pull_up_order (
66
67
node , order_root = True , ordered_joins = self .strict
67
68
)
69
+ node = rewrites .column_pruning (node )
68
70
ir = self .compile_node (node )
69
71
return ir .to_sql (
70
72
order_by = ordering .all_ordering_columns ,
@@ -76,6 +78,7 @@ def compile_sql(
76
78
node , _ = rewrites .pull_up_order (
77
79
node , order_root = False , ordered_joins = self .strict
78
80
)
81
+ node = rewrites .column_pruning (node )
79
82
ir = self .compile_node (node )
80
83
return ir .to_sql (selections = output_ids )
81
84
@@ -86,6 +89,7 @@ def compile_peek_sql(self, node: nodes.BigFrameNode, n_rows: int) -> str:
86
89
node , _ = rewrites .pull_up_order (
87
90
node , order_root = False , ordered_joins = self .strict
88
91
)
92
+ node = rewrites .column_pruning (node )
89
93
return self .compile_node (node ).to_sql (limit = n_rows , selections = ids )
90
94
91
95
def compile_raw (
@@ -97,6 +101,7 @@ def compile_raw(
97
101
node = nodes .bottom_up (node , rewrites .rewrite_slice )
98
102
node = nodes .top_down (node , rewrites .rewrite_timedelta_ops )
99
103
node , ordering = rewrites .pull_up_order (node , ordered_joins = self .strict )
104
+ node = rewrites .column_pruning (node )
100
105
ir = self .compile_node (node )
101
106
sql = ir .to_sql ()
102
107
return sql , node .schema .to_bigquery (), ordering
@@ -192,31 +197,34 @@ def compile_readtable(self, node: nodes.ReadTableNode):
192
197
return self .compile_read_table_unordered (node .source , node .scan_list )
193
198
194
199
def read_table_as_unordered_ibis (
195
- self , source : nodes .BigqueryDataSource
200
+ self ,
201
+ source : nodes .BigqueryDataSource ,
202
+ scan_cols : typing .Sequence [str ],
196
203
) -> ibis_types .Table :
197
204
full_table_name = f"{ source .table .project_id } .{ source .table .dataset_id } .{ source .table .table_id } "
198
- used_columns = tuple (col .name for col in source .table .physical_schema )
199
205
# Physical schema might include unused columns, unsupported datatypes like JSON
200
206
physical_schema = ibis_bigquery .BigQuerySchema .to_ibis (
201
- list (i for i in source .table .physical_schema if i . name in used_columns )
207
+ list (source .table .physical_schema )
202
208
)
203
209
if source .at_time is not None or source .sql_predicate is not None :
204
210
import bigframes .session ._io .bigquery
205
211
206
212
sql = bigframes .session ._io .bigquery .to_query (
207
213
full_table_name ,
208
- columns = used_columns ,
214
+ columns = scan_cols ,
209
215
sql_predicate = source .sql_predicate ,
210
216
time_travel_timestamp = source .at_time ,
211
217
)
212
218
return ibis_bigquery .Backend ().sql (schema = physical_schema , query = sql )
213
219
else :
214
- return ibis_api .table (physical_schema , full_table_name )
220
+ return ibis_api .table (physical_schema , full_table_name ). select ( scan_cols )
215
221
216
222
def compile_read_table_unordered (
217
223
self , source : nodes .BigqueryDataSource , scan : nodes .ScanList
218
224
):
219
- ibis_table = self .read_table_as_unordered_ibis (source )
225
+ ibis_table = self .read_table_as_unordered_ibis (
226
+ source , scan_cols = [col .source_id for col in scan .items ]
227
+ )
220
228
return compiled .UnorderedIR (
221
229
ibis_table ,
222
230
tuple (
@@ -291,7 +299,7 @@ def set_output_names(
291
299
return nodes .SelectionNode (
292
300
node ,
293
301
tuple (
294
- (ex .DerefOp (old_id ), ids .ColumnId (out_id ))
302
+ bigframes . core . nodes . AliasedRef (ex .DerefOp (old_id ), ids .ColumnId (out_id ))
295
303
for old_id , out_id in zip (node .ids , output_ids )
296
304
),
297
305
)
0 commit comments