diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index afc26d4..136e2e6 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -6028,9 +6028,12 @@ get_variable(Var *var, int levelsup, bool istoplevel, deparse_context *context) else if (attnum > 0) { /* Get column name to use from the colinfo struct */ - Assert(attnum <= colinfo->num_cols); + if (attnum > colinfo->num_cols) + elog(ERROR, "incorrect number of arguments: specified %d but found %d", + attnum, colinfo->num_cols); attname = colinfo->colnames[attnum - 1]; - Assert(attname != NULL); + if (attname == NULL) + elog(ERROR, "invalid attribute name"); } else { diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out index 125c31b..d066572 100644 --- a/src/test/regress/expected/rules.out +++ b/src/test/regress/expected/rules.out @@ -3057,3 +3057,25 @@ SELECT * FROM hat_data WHERE hat_name IN ('h8', 'h9', 'h7') ORDER BY hat_name; DROP RULE hat_upsert ON hats; drop table hats; drop table hat_data; +-- tests for pg_get_expr +CREATE TABLE tab_short (a1 int, CHECK(a1 > 0)); +CREATE TABLE tab_long (a2 text, b2 text, CHECK(a2 IS NOT NULL AND b2 IS NOT NULL)); +CREATE TABLE tab_dropped_col (a3 int, b3 int); +ALTER TABLE tab_dropped_col DROP COLUMN b3; +-- contraint definition of tab_short uses column definitions from tab_long. +SELECT pg_get_expr(conbin, 'tab_long'::regclass) FROM pg_constraint + WHERE conrelid = 'tab_short'::regclass; + pg_get_expr +------------- + (a2 > 0) +(1 row) + +-- error, column number mismatch +SELECT pg_get_expr(conbin, 'tab_short'::regclass) FROM pg_constraint + WHERE conrelid = 'tab_long'::regclass; +ERROR: incorrect number of arguments: specified 2 but found 1 +-- error, invalid attribute name +SELECT pg_get_expr(conbin, 'tab_dropped_col'::regclass) FROM pg_constraint + WHERE conrelid = 'tab_long'::regclass; +ERROR: invalid attribute name +DROP TABLE tab_short, tab_long, tab_dropped_col; diff --git a/src/test/regress/sql/rules.sql b/src/test/regress/sql/rules.sql index 4299a5b..360696c 100644 --- a/src/test/regress/sql/rules.sql +++ b/src/test/regress/sql/rules.sql @@ -1144,3 +1144,19 @@ DROP RULE hat_upsert ON hats; drop table hats; drop table hat_data; + +-- tests for pg_get_expr +CREATE TABLE tab_short (a1 int, CHECK(a1 > 0)); +CREATE TABLE tab_long (a2 text, b2 text, CHECK(a2 IS NOT NULL AND b2 IS NOT NULL)); +CREATE TABLE tab_dropped_col (a3 int, b3 int); +ALTER TABLE tab_dropped_col DROP COLUMN b3; +-- contraint definition of tab_short uses column definitions from tab_long. +SELECT pg_get_expr(conbin, 'tab_long'::regclass) FROM pg_constraint + WHERE conrelid = 'tab_short'::regclass; +-- error, column number mismatch +SELECT pg_get_expr(conbin, 'tab_short'::regclass) FROM pg_constraint + WHERE conrelid = 'tab_long'::regclass; +-- error, invalid attribute name +SELECT pg_get_expr(conbin, 'tab_dropped_col'::regclass) FROM pg_constraint + WHERE conrelid = 'tab_long'::regclass; +DROP TABLE tab_short, tab_long, tab_dropped_col;