diff --git a/src/backend/distributed/worker/worker_partition_protocol.c b/src/backend/distributed/worker/worker_partition_protocol.c index 962e4ea7c..d22ffe1d7 100644 --- a/src/backend/distributed/worker/worker_partition_protocol.c +++ b/src/backend/distributed/worker/worker_partition_protocol.c @@ -917,8 +917,13 @@ FilterAndPartitionTable(const char *filterQuery, if (SPI_processed > 0) { TupleDesc rowDescriptor = SPI_tuptable->tupdesc; - partitionColumnIndex = ColumnIndex(rowDescriptor, partitionColumnName); + if (fileCount == 0) + { + ereport(ERROR, (errmsg("no partition to read into"))); + } + + partitionColumnIndex = ColumnIndex(rowDescriptor, partitionColumnName); partitionColumnTypeId = SPI_gettypeid(rowDescriptor, partitionColumnIndex); if (partitionColumnType != partitionColumnTypeId) { @@ -942,6 +947,7 @@ FilterAndPartitionTable(const char *filterQuery, while (SPI_processed > 0) { int rowIndex = 0; + for (rowIndex = 0; rowIndex < SPI_processed; rowIndex++) { HeapTuple row = SPI_tuptable->vals[rowIndex]; @@ -964,6 +970,10 @@ FilterAndPartitionTable(const char *filterQuery, if (!partitionKeyNull) { partitionId = (*PartitionIdFunction)(partitionKey, partitionIdContext); + if (partitionId == INVALID_SHARD_INDEX) + { + ereport(ERROR, (errmsg("invalid distribution column value"))); + } } else { diff --git a/src/test/regress/expected/intermediate_results.out b/src/test/regress/expected/intermediate_results.out index d0dc1a6c3..bb4a7671a 100644 --- a/src/test/regress/expected/intermediate_results.out +++ b/src/test/regress/expected/intermediate_results.out @@ -256,6 +256,9 @@ SELECT * FROM squares ORDER BY x; 5 | 25 (5 rows) +-- empty shard interval array should raise error +SELECT worker_hash_partition_table(42,1,'SELECT a FROM generate_series(1,100) AS a', 'a', 23, ARRAY[0]); +ERROR: invalid distribution column value DROP SCHEMA intermediate_results CASCADE; NOTICE: drop cascades to 5 other objects DETAIL: drop cascades to table interesting_squares diff --git a/src/test/regress/sql/intermediate_results.sql b/src/test/regress/sql/intermediate_results.sql index 512fcd4cb..3c2f27eef 100644 --- a/src/test/regress/sql/intermediate_results.sql +++ b/src/test/regress/sql/intermediate_results.sql @@ -141,4 +141,7 @@ WITH (FORMAT text); SELECT * FROM squares ORDER BY x; +-- empty shard interval array should raise error +SELECT worker_hash_partition_table(42,1,'SELECT a FROM generate_series(1,100) AS a', 'a', 23, ARRAY[0]); + DROP SCHEMA intermediate_results CASCADE;