Skip to content

Commit 4226886

Browse files
skip building transform if external table spec field is from old schema
Signed-off-by: Aykut Bozkurt <[email protected]>
1 parent 8d23445 commit 4226886

File tree

3 files changed

+32
-15
lines changed

3 files changed

+32
-15
lines changed

pg_lake_table/include/pg_lake/fdw/schema_operations/field_id_mapping_catalog.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ extern PGDLLEXPORT DataFileSchema * GetDataFileSchemaForInternalIcebergTable(Oid
3131
extern PGDLLEXPORT List *GetLeafFieldsForInternalIcebergTable(Oid relationId);
3232
extern PGDLLEXPORT List *GetRegisteredFieldForAttributes(Oid relationId, List *attrNos);
3333
extern PGDLLEXPORT DataFileSchemaField * GetRegisteredFieldForAttribute(Oid relationId, AttrNumber attrNo);
34-
extern PGDLLEXPORT AttrNumber GetAttributeForFieldId(Oid relationId, int fieldId);
34+
extern PGDLLEXPORT AttrNumber GetAttributeForFieldId(Oid relationId, int fieldId, bool *attributeExists);
3535
extern PGDLLEXPORT void UpdateRegisteredFieldWriteDefaultForAttribute(Oid relationId, AttrNumber attNum, const char *writeDefault);
3636
extern PGDLLEXPORT int GetLargestRegisteredFieldId(Oid relationId);
3737
extern PGDLLEXPORT void RegisterIcebergColumnMapping(Oid relationId, Field * field,

pg_lake_table/src/fdw/partition_transform.c

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -198,8 +198,8 @@ GetPartitionTransformsFromSpecFields(Oid relationId, List *specFields)
198198

199199
IcebergPartitionTransform *transform = GetPartitionTransformFromSpecField(relationId, specField);
200200

201-
Assert(transform != NULL);
202-
transformList = lappend(transformList, transform);
201+
if (transform != NULL)
202+
transformList = lappend(transformList, transform);
203203
}
204204

205205
return transformList;
@@ -221,19 +221,32 @@ GetPartitionTransformFromSpecField(Oid relationId, IcebergPartitionSpecField * s
221221
transform->partitionFieldName = pstrdup(specField->name);
222222
transform->transformName = pstrdup(specField->transform);
223223

224+
bool attributeExists = false;
225+
224226
transform->attnum =
225-
GetAttributeForFieldId(relationId, specField->source_id);
227+
GetAttributeForFieldId(relationId, specField->source_id, &attributeExists);
228+
229+
if (!attributeExists)
230+
{
231+
/*
232+
* skip this transform. Pruning wont apply anyway because postgres
233+
* schema (current iceberg schema) misses it.
234+
*/
235+
Assert(IsAnyExternalIcebergTable(relationId));
236+
return NULL;
237+
}
238+
226239
transform->columnName = get_attname(relationId, transform->attnum, false);
227240
transform->pgType = GetAttributePGType(relationId, transform->attnum);
228241

229-
Assert(IsAnyIcebergTable(relationId));
230-
231242
if (IsAnyInternalIcebergTable(relationId))
232243
{
233244
transform->sourceField = GetRegisteredFieldForAttribute(relationId, transform->attnum);
234245
}
235246
else
236247
{
248+
Assert(IsAnyExternalIcebergTable(relationId));
249+
237250
DataFileSchema *schema = GetDataFileSchemaForTable(relationId);
238251

239252
transform->sourceField = GetDataFileSchemaFieldById(schema, specField->source_id);

pg_lake_table/src/fdw/schema_operations/field_id_mapping_catalog.c

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ static void InsertFieldMapping(Oid relationId, int attrIcebergFieldId,
5757
const char *writeDefault, const char *initialDefault,
5858
int parentFieldId);
5959
static AttrNumber GetAttributeForFieldIdForInternalIcebergTable(Oid relationId, int fieldId);
60-
static AttrNumber GetAttributeForFieldIdForExternalIcebergTable(char *metadataPath, Oid relationId, int fieldId);
60+
static AttrNumber GetAttributeForFieldIdForExternalIcebergTable(char *metadataPath, Oid relationId, int fieldId, bool *attributeExists);
6161

6262
#ifdef USE_ASSERT_CHECKING
6363
static List *GetAllRegisteredAttnumsForTopLevelColumns(Oid relationId);
@@ -244,20 +244,25 @@ GetRegisteredFieldForAttribute(Oid relationId, AttrNumber attrNo)
244244
}
245245

246246
/*
247-
* GetAttributeForFieldId gets the attribute number for a given field ID.
248-
*/
247+
* GetAttributeForFieldId gets the attribute number for a given field ID.
248+
* It sets attributeExists if there is no attribute which corresponds to
249+
* given field id.
250+
*/
249251
AttrNumber
250-
GetAttributeForFieldId(Oid relationId, int fieldId)
252+
GetAttributeForFieldId(Oid relationId, int fieldId, bool *attributeExists)
251253
{
252254
Assert(IsAnyIcebergTable(relationId));
253255

254256
if (IsAnyInternalIcebergTable(relationId))
257+
{
258+
*attributeExists = true;
255259
return GetAttributeForFieldIdForInternalIcebergTable(relationId, fieldId);
260+
}
256261
else
257262
{
258263
char *currentMetadataPath = GetIcebergMetadataLocation(relationId, false);
259264

260-
return GetAttributeForFieldIdForExternalIcebergTable(currentMetadataPath, relationId, fieldId);
265+
return GetAttributeForFieldIdForExternalIcebergTable(currentMetadataPath, relationId, fieldId, attributeExists);
261266
}
262267
}
263268

@@ -309,7 +314,7 @@ GetAttributeForFieldIdForInternalIcebergTable(Oid relationId, int fieldId)
309314
* for external Iceberg tables from iceberg metadata.
310315
*/
311316
static AttrNumber
312-
GetAttributeForFieldIdForExternalIcebergTable(char *metadataPath, Oid relationId, int fieldId)
317+
GetAttributeForFieldIdForExternalIcebergTable(char *metadataPath, Oid relationId, int fieldId, bool *attributeExists)
313318
{
314319
DataFileSchema *schema = GetDataFileSchemaForExternalIcebergTable(metadataPath);
315320

@@ -342,10 +347,9 @@ GetAttributeForFieldIdForExternalIcebergTable(char *metadataPath, Oid relationId
342347
/* there is a primary key on these filters */
343348
Assert(SPI_processed == 1);
344349

345-
bool isNull = false;
346-
AttrNumber attrNo = GET_SPI_VALUE(INT2OID, 0, 1, &isNull);
350+
AttrNumber attrNo = GET_SPI_VALUE(INT2OID, 0, 1, attributeExists);
347351

348-
Assert(!isNull);
352+
Assert(attributeExists || IsAnyExternalIcebergTable(relationId));
349353

350354
SPI_END();
351355

0 commit comments

Comments
 (0)