apache / apache/cloudberry

[Bug] orca incorrectly executes functions on QD

Open
#1,660 1 comment 0 reactions 1 assignee Claimed by @aviralgarg05 View on GitHub
type: Bug
Dominant language
C
Stars
1.4k
Forks
247
Avg merge
4d 3h
Merged PRs (30d)
39

Description

### Apache Cloudberry version

main

### What happened

```
-- change /home/gpadmin/cloudberry/src/test/regress/regress.so to your local path
CREATE FUNCTION test_enc_conversion(bytea, name, name, bool, validlen OUT int, result OUT bytea)
AS '**/home/gpadmin/cloudberry/src/test/regress/regress.so**', 'test_enc_conversion'
LANGUAGE C STRICT;

create or replace function test_conv(
input IN bytea,
src_encoding IN text,
dst_encoding IN text,
result OUT bytea,
errorat OUT bytea,
error OUT text)
language plpgsql as
$$
declare
validlen int;
begin
-- First try to perform the conversion with noError = false. If that errors out,
-- capture the error message, and try again with noError = true. The second call
-- should succeed and return the position of the error, return that too.
begin
select * into validlen, result from test_enc_conversion(input, src_encoding, dst_encoding, false);
errorat = NULL;
error := NULL;
exception when others then
error := sqlerrm;
select * into validlen, result from test_enc_conversion(input, src_encoding, dst_encoding, true);
errorat = substr(input, validlen + 1);
end;
return;
end;
$$;

CREATE TABLE utf8_verification_inputs (inbytes bytea, description text PRIMARY KEY);
insert into utf8_verification_inputs values
('\x66006f', 'NUL byte'),
('\xaf', 'bare continuation'),
('\xc5', 'missing second byte in 2-byte char'),
('\xc080', 'smallest 2-byte overlong'),
('\xc1bf', 'largest 2-byte overlong'),
('\xc280', 'next 2-byte after overlongs'),
('\xdfbf', 'largest 2-byte'),
('\xe9af', 'missing third byte in 3-byte char'),
('\xe08080', 'smallest 3-byte overlong'),
('\xe09fbf', 'largest 3-byte overlong'),
('\xe0a080', 'next 3-byte after overlong'),
('\xed9fbf', 'last before surrogates'),
('\xeda080', 'smallest surrogate'),
('\xedbfbf', 'largest surrogate'),
('\xee8080', 'next after surrogates'),
('\xefbfbf', 'largest 3-byte'),
('\xf1afbf', 'missing fourth byte in 4-byte char'),
('\xf0808080', 'smallest 4-byte overlong'),
('\xf08fbfbf', 'largest 4-byte overlong'),
('\xf0908080', 'next 4-byte after overlong'),
('\xf48fbfbf', 'largest 4-byte'),
('\xf4908080', 'smallest too large'),
('\xfa9a9a8a8a', '5-byte');
-- Test UTF-8 verification slow path
select description, (test_conv(inbytes, 'utf8', 'utf8')).* from utf8_verification_inputs;

ERROR: query plan with multiple segworker groups is not supported
HINT: likely caused by a function that reads or modifies data in a distributed table
CONTEXT: PL/pgSQL function test_conv(bytea,text,text) line 8 during statement block entry

postgres=# explain select description, (test_conv(inbytes, 'utf8', 'utf8')).* from utf8_verification_inputs;
QUERY PLAN
---------------------------------------------------------------------------------------
Result (cost=0.00..431.00 rows=1 width=32)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=16)
-> Seq Scan on utf8_verification_inputs (cost=0.00..431.00 rows=1 width=16)
Optimizer: GPORCA
(4 rows)

postgres=# set optimizer = off;
SET
postgres=# explain select description, (test_conv(inbytes, 'utf8', 'utf8')).* from utf8_verification_inputs;
QUERY PLAN
---------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..9314.00 rows=34800 width=128)
-> Seq Scan on utf8_verification_inputs (cost=0.00..8850.00 rows=11600 width=128)
Optimizer: Postgres query optimizer
(3 rows)

```
It seems that ORCA executes functions on QD, but PG executes them directly on QE.

### What you think should happen instead

_No response_

### How to reproduce

see before

### Operating System

rockylinux

### Anything else

_No response_

### Are you willing to submit PR?

- [ ] Yes, I am willing to submit a PR!

### Code of Conduct

- [x] I agree to follow this project's [Code of Conduct](https://github.com/apache/cloudberry/blob/main/CODE_OF_CONDUCT.md).

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.