mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Reject attempts to alter composite types used in indexes.
find_composite_type_dependencies() ignored indexes, which is a poor decision because an expression index could have a stored column of a composite (or other container) type even when the underlying table does not. Teach it to detect such cases and error out. We have to work a bit harder than for other relations because the pg_depend entry won't identify the specific index column of concern, but it's not much new code. This does not address bug #17872's original complaint that dropping a column in such a type might lead to violations of the uniqueness property that a unique index is supposed to ensure. That seems of much less concern to me because it won't lead to crashes. Per bug #17872 from Alexander Lakhin. Back-patch to all supported branches. Discussion: https://postgr.es/m/17872-d0fbb799dc3fd85d@postgresql.org
This commit is contained in:
		@@ -1983,6 +1983,14 @@ CREATE TYPE test_type1 AS (a int, b text);
 | 
			
		||||
CREATE TABLE test_tbl1 (x int, y test_type1);
 | 
			
		||||
ALTER TYPE test_type1 ALTER ATTRIBUTE b TYPE varchar; -- fails
 | 
			
		||||
 | 
			
		||||
DROP TABLE test_tbl1;
 | 
			
		||||
CREATE TABLE test_tbl1 (x int, y text);
 | 
			
		||||
CREATE INDEX test_tbl1_idx ON test_tbl1((row(x,y)::test_type1));
 | 
			
		||||
ALTER TYPE test_type1 ALTER ATTRIBUTE b TYPE varchar; -- fails
 | 
			
		||||
 | 
			
		||||
DROP TABLE test_tbl1;
 | 
			
		||||
DROP TYPE test_type1;
 | 
			
		||||
 | 
			
		||||
CREATE TYPE test_type2 AS (a int, b text);
 | 
			
		||||
CREATE TABLE test_tbl2 OF test_type2;
 | 
			
		||||
CREATE TABLE test_tbl2_subclass () INHERITS (test_tbl2);
 | 
			
		||||
@@ -2010,7 +2018,8 @@ ALTER TYPE test_type2 RENAME ATTRIBUTE a TO aa CASCADE;
 | 
			
		||||
\d test_tbl2
 | 
			
		||||
\d test_tbl2_subclass
 | 
			
		||||
 | 
			
		||||
DROP TABLE test_tbl2_subclass;
 | 
			
		||||
DROP TABLE test_tbl2_subclass, test_tbl2;
 | 
			
		||||
DROP TYPE test_type2;
 | 
			
		||||
 | 
			
		||||
CREATE TYPE test_typex AS (a int, b text);
 | 
			
		||||
CREATE TABLE test_tblx (x int, y test_typex check ((y).a > 0));
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user