Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

[Bug] GPORCA: ERROR "btree index keys must be ordered by attribute" when a qual references an INCLUDE column

Open
#2,026 1 comment 1 reaction 0 assignees View on GitHub

Maintainers usually reply within 3 days

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
52/100
Issue type
Bug
Clarity
Mostly clear
Activity status
Active
Tech stack
c, postgresql, sql
Domain
databases

Research direction

Start by reproducing the SQL examples with GPORCA enabled, then compare the plans and results with the optimizer disabled. Trace how the btree INCLUDE column reaches the Index Cond; done means INCLUDE columns are not used as scan keys and the queries complete without the runtime error.

Written by the indexing model from the issue text.

Description

type: Bug
Apache Cloudberry version

No response

What happened

With GPORCA (optimizer = on), a qual on a btree index's INCLUDE (non-key) column can be pushed into the Index Cond. INCLUDE columns are payload only and are not searchable, so the executor
rejects the scan keys at runtime:

ERROR:  btree index keys must be ordered by attribute (nbtutils.c:799)

The Postgres planner (optimizer = off) is not affected. The table does not need to contain any rows.

What you think should happen instead

No response

How to reproduce
CREATE TABLE c2t(a int, b int) DISTRIBUTED BY (a);
CREATE INDEX ci1 ON c2t USING btree (a) INCLUDE (b);

SET optimizer = on;
SELECT a, b FROM c2t WHERE b IS NULL;
-- ERROR:  btree index keys must be ordered by attribute (nbtutils.c:799)  (seg2 slice1 ...)

The plan puts the INCLUDE column b into the Index Cond:

EXPLAIN (COSTS OFF) SELECT a, b FROM c2t WHERE b IS NULL;

 Gather Motion 3:1  (slice1; segments: 3)
   ->  Index Scan using ci1 on c2t
         Index Cond: (b IS NULL)
 Optimizer: GPORCA

Same error with GROUP BY and with an index whose INCLUDE list repeats a key column:

CREATE TABLE c1t(a int, b int) DISTRIBUTED BY (a);
CREATE INDEX ci0 ON c1t USING btree (a) INCLUDE (a, b);
SET optimizer = on;
SELECT a, b FROM c1t WHERE b IS NULL GROUP BY a, b;
-- ERROR:  btree index keys must be ordered by attribute (nbtutils.c:799)

With SET optimizer = off; all of the above return the correct rows.

Operating System

any

Anything else

No response

Are you willing to submit PR?
  • Yes, I am willing to submit a PR!
Code of Conduct
Dominant language
C
Stars
1.4k
Forks
256
Avg merge
4d 10h
Merged PRs (30d)
46

Getting set up

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from apache/cloudberry

All issues in apache/cloudberry

Similar issues

More C issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.