yugabyte / yugabyte-db

YugabyteDB - the cloud native distributed SQL database for mission-critical applications.
https://www.yugabyte.com
Other
8.84k stars 1.05k forks source link

ysql: amvalidate doesn't work #8949

Open jaki opened 3 years ago

jaki commented 3 years ago

Jira Link: DB-1868 amvalidate errors on all opclasses except lsm:

ERROR:  cannot validate operator family without ordered data

lsm opclasses work trivially because ybcinvalidate returns true (it was never implemented).

select pg_opclass.oid, opcname, amvalidate(pg_opclass.oid) from pg_opclass inner join pg_am on pg_am.oid = pg_opclass.opcmethod where amname = 'btree';
select pg_opclass.oid, opcname, amvalidate(pg_opclass.oid) from pg_opclass inner join pg_am on pg_am.oid = pg_opclass.opcmethod where amname = 'hash';
select pg_opclass.oid, opcname, amvalidate(pg_opclass.oid) from pg_opclass inner join pg_am on pg_am.oid = pg_opclass.opcmethod where amname = 'gin';
select pg_opclass.oid, opcname, amvalidate(pg_opclass.oid) from pg_opclass inner join pg_am on pg_am.oid = pg_opclass.opcmethod where amname = 'gist';
select pg_opclass.oid, opcname, amvalidate(pg_opclass.oid) from pg_opclass inner join pg_am on pg_am.oid = pg_opclass.opcmethod where amname = 'spgist';
jaki commented 3 years ago

Here's a stack trace for gin. Probably only identify_opfamily_groups is relevant to the issue.

ERROR:  cannot validate operator family without ordered data    @     0x7fee7cc8e94f  YBCGetStackTrace (src/yb/common/ybc_util.cc:292)
    @           0x9bdcab  elog_finish (src/postgres/src/backend/utils/error/elog.c:1469)
    @           0x4fefb8  identify_opfamily_groups (src/postgres/src/backend/access/index/amvalidate.c:52)
    @           0x4c2dc5  ginvalidate (src/postgres/src/backend/access/gin/ginvalidate.c:214)
    @           0x4fef2b  amvalidate (src/postgres/src/backend/access/index/amapi.c:138)
    @           0x6cd30a  ExecInterpExpr (src/postgres/src/backend/executor/execExprInterp.c:684)
    @           0x6c9adf  ExecInterpExprStillValid (src/postgres/src/backend/executor/execExprInterp.c:1804)
    @           0x700e27  ExecEvalExprSwitchContext (src/postgres/src/include/executor/executor.h:321)
    @           0x700e27  ExecProject (src/postgres/src/include/executor/executor.h:355)
    @           0x700e27  ExecNestLoop (src/postgres/src/backend/executor/nodeNestloop.c:241)
    @           0x6da979  ExecProcNodeFirst (src/postgres/src/backend/executor/execProcnode.c:446)
    @           0x6d1c02  ExecProcNode (src/postgres/src/include/executor/executor.h:249)
    @           0x6d1c02  ExecutePlan (src/postgres/src/backend/executor/execMain.c:1730)
    @           0x6d1c02  standard_ExecutorRun (src/postgres/src/backend/executor/execMain.c:367)
    @     0x7fee6f7e6003  pgss_ExecutorRun (src/postgres/contrib/pg_stat_statements/pg_stat_statements.c:947)
    @     0x7fee6f5decc9  ybpgm_ExecutorRun (src/postgres/contrib/yb_pg_metrics/yb_pg_metrics.c:492)
    @           0x6d1d81  ExecutorRun (src/postgres/src/backend/executor/execMain.c:308)
    @           0x877565  PortalRunSelect (src/postgres/src/backend/tcop/pquery.c:947)
    @           0x8790ff  PortalRun (src/postgres/src/backend/tcop/pquery.c:784)
    @           0x872c2c  exec_simple_query (src/postgres/src/backend/tcop/postgres.c:1161)
    @           0x872c2c  yb_exec_simple_query (src/postgres/src/backend/tcop/postgres.c:4324)
    @           0x8754e7  PostgresMain (src/postgres/src/backend/tcop/postgres.c:4936)
    @           0x7e119d  BackendRun (src/postgres/src/backend/postmaster/postmaster.c:4429)
    @           0x7e119d  BackendStartup (src/postgres/src/backend/postmaster/postmaster.c:4095)
    @           0x7e119d  ServerLoop (src/postgres/src/backend/postmaster/postmaster.c:1737)
    @           0x7e119d  PostmasterMain (src/postgres/src/backend/postmaster/postmaster.c:1400)
    @           0x737324  PostgresServerProcessMain (src/postgres/src/backend/main/main.c:234)
    @           0x7373c0 
    @     0x7fee7bfe5824  __libc_start_main (csu/libc-start.c:289)
    @           0x494138  (unknown) (sysdeps/x86_64/start.S:118)
    @ 0xffffffffffffffff
jaki commented 3 years ago

It seems it's because CatCList *oprlist is not ordered. Not sure why.

Both gistvalidate and ginvalidate do oprlist = SearchSysCacheList1(AMOPSTRATEGY, ObjectIdGetDatum(opfamilyoid));