On Wed, Mar 28, 2007 at 07:05:24AM -0000, Andrew - Supernews wrote:
> On 2007-03-27, David Fetter <[EMAIL PROTECTED]> wrote:
> > Per further discussion with Andrew of Supernews and Merlin
> > Moncure, I've added a check for compound types and moved the
> > creation of the array type from DefineRelation in
> > backend/commands/tablecmds.c to heap_create_with_catalog in
> > backend/catalog/heap.c.
> 
> You've still got the usage of the relation OID and the relation
> _type_ OID reversed.
> 
> The array element type that you pass to TypeCreate must be the
> _type_ OID.

The attached patch takes it down to two regression test failures, also
attached: 

The first is in type_sanity, which basically doesn't understand that
complex types now have array types associated with them and thinks
they're orphan array types, so it's actually the test that's not
right.

The second is in alter_table where ALTER TABLE ... SET SCHEMA doesn't
pick up the array types associated with the tables.

Andrew at Supernews also noticed that in general, the array type
doesn't change schemas when its base type does.  Is this the intended
behavior?  If not, should we change it globally?

Cheers,
D
-- 
David Fetter <[EMAIL PROTECTED]> http://fetter.org/
phone: +1 415 235 3778        AIM: dfetter666
                              Skype: davidfetter

Remember to vote!
Consider donating to PostgreSQL: http://www.postgresql.org/about/donate
? GNUmakefile
? array_of_complex.diff
? config.log
? config.status
? contrib/spi/.deps
? src/Makefile.global
? src/backend/postgres
? src/backend/access/common/.deps
? src/backend/access/gin/.deps
? src/backend/access/gist/.deps
? src/backend/access/hash/.deps
? src/backend/access/heap/.deps
? src/backend/access/index/.deps
? src/backend/access/nbtree/.deps
? src/backend/access/transam/.deps
? src/backend/bootstrap/.deps
? src/backend/catalog/.deps
? src/backend/catalog/postgres.bki
? src/backend/catalog/postgres.description
? src/backend/catalog/postgres.shdescription
? src/backend/commands/.deps
? src/backend/executor/.deps
? src/backend/lib/.deps
? src/backend/libpq/.deps
? src/backend/main/.deps
? src/backend/nodes/.deps
? src/backend/optimizer/geqo/.deps
? src/backend/optimizer/path/.deps
? src/backend/optimizer/plan/.deps
? src/backend/optimizer/prep/.deps
? src/backend/optimizer/util/.deps
? src/backend/parser/.deps
? src/backend/port/.deps
? src/backend/postmaster/.deps
? src/backend/regex/.deps
? src/backend/rewrite/.deps
? src/backend/storage/buffer/.deps
? src/backend/storage/file/.deps
? src/backend/storage/freespace/.deps
? src/backend/storage/ipc/.deps
? src/backend/storage/large_object/.deps
? src/backend/storage/lmgr/.deps
? src/backend/storage/page/.deps
? src/backend/storage/smgr/.deps
? src/backend/tcop/.deps
? src/backend/utils/.deps
? src/backend/utils/adt/.deps
? src/backend/utils/cache/.deps
? src/backend/utils/error/.deps
? src/backend/utils/fmgr/.deps
? src/backend/utils/hash/.deps
? src/backend/utils/init/.deps
? src/backend/utils/mb/.deps
? src/backend/utils/mb/conversion_procs/conversion_create.sql
? src/backend/utils/mb/conversion_procs/ascii_and_mic/.deps
? src/backend/utils/mb/conversion_procs/ascii_and_mic/libascii_and_mic.so.0.0
? src/backend/utils/mb/conversion_procs/cyrillic_and_mic/.deps
? 
src/backend/utils/mb/conversion_procs/cyrillic_and_mic/libcyrillic_and_mic.so.0.0
? src/backend/utils/mb/conversion_procs/euc_cn_and_mic/.deps
? src/backend/utils/mb/conversion_procs/euc_cn_and_mic/libeuc_cn_and_mic.so.0.0
? src/backend/utils/mb/conversion_procs/euc_jis_2004_and_shift_jis_2004/.deps
? 
src/backend/utils/mb/conversion_procs/euc_jis_2004_and_shift_jis_2004/libeuc_jis_2004_and_shift_jis_2004.so.0.0
? src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/.deps
? 
src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/libeuc_jp_and_sjis.so.0.0
? src/backend/utils/mb/conversion_procs/euc_kr_and_mic/.deps
? src/backend/utils/mb/conversion_procs/euc_kr_and_mic/libeuc_kr_and_mic.so.0.0
? src/backend/utils/mb/conversion_procs/euc_tw_and_big5/.deps
? 
src/backend/utils/mb/conversion_procs/euc_tw_and_big5/libeuc_tw_and_big5.so.0.0
? src/backend/utils/mb/conversion_procs/latin2_and_win1250/.deps
? 
src/backend/utils/mb/conversion_procs/latin2_and_win1250/liblatin2_and_win1250.so.0.0
? src/backend/utils/mb/conversion_procs/latin_and_mic/.deps
? src/backend/utils/mb/conversion_procs/latin_and_mic/liblatin_and_mic.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_ascii/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_ascii/libutf8_and_ascii.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_big5/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_big5/libutf8_and_big5.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/.deps
? 
src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/libutf8_and_cyrillic.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_euc_cn/.deps
? 
src/backend/utils/mb/conversion_procs/utf8_and_euc_cn/libutf8_and_euc_cn.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_euc_jis_2004/.deps
? 
src/backend/utils/mb/conversion_procs/utf8_and_euc_jis_2004/libutf8_and_euc_jis_2004.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_euc_jp/.deps
? 
src/backend/utils/mb/conversion_procs/utf8_and_euc_jp/libutf8_and_euc_jp.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_euc_kr/.deps
? 
src/backend/utils/mb/conversion_procs/utf8_and_euc_kr/libutf8_and_euc_kr.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_euc_tw/.deps
? 
src/backend/utils/mb/conversion_procs/utf8_and_euc_tw/libutf8_and_euc_tw.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_gb18030/.deps
? 
src/backend/utils/mb/conversion_procs/utf8_and_gb18030/libutf8_and_gb18030.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_gbk/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_gbk/libutf8_and_gbk.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_iso8859/.deps
? 
src/backend/utils/mb/conversion_procs/utf8_and_iso8859/libutf8_and_iso8859.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_iso8859_1/.deps
? 
src/backend/utils/mb/conversion_procs/utf8_and_iso8859_1/libutf8_and_iso8859_1.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_johab/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_johab/libutf8_and_johab.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_shift_jis_2004/.deps
? 
src/backend/utils/mb/conversion_procs/utf8_and_shift_jis_2004/libutf8_and_shift_jis_2004.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_sjis/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_sjis/libutf8_and_sjis.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_uhc/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_uhc/libutf8_and_uhc.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_win/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_win/libutf8_and_win.so.0.0
? src/backend/utils/misc/.deps
? src/backend/utils/mmgr/.deps
? src/backend/utils/resowner/.deps
? src/backend/utils/sort/.deps
? src/backend/utils/time/.deps
? src/bin/initdb/.deps
? src/bin/initdb/initdb
? src/bin/ipcclean/ipcclean
? src/bin/pg_config/.deps
? src/bin/pg_config/pg_config
? src/bin/pg_controldata/.deps
? src/bin/pg_controldata/pg_controldata
? src/bin/pg_ctl/.deps
? src/bin/pg_ctl/pg_ctl
? src/bin/pg_dump/.deps
? src/bin/pg_dump/pg_dump
? src/bin/pg_dump/pg_dumpall
? src/bin/pg_dump/pg_restore
? src/bin/pg_resetxlog/.deps
? src/bin/pg_resetxlog/pg_resetxlog
? src/bin/psql/.deps
? src/bin/psql/psql
? src/bin/scripts/.deps
? src/bin/scripts/clusterdb
? src/bin/scripts/createdb
? src/bin/scripts/createlang
? src/bin/scripts/createuser
? src/bin/scripts/dropdb
? src/bin/scripts/droplang
? src/bin/scripts/dropuser
? src/bin/scripts/reindexdb
? src/bin/scripts/vacuumdb
? src/include/pg_config.h
? src/include/stamp-h
? src/interfaces/ecpg/compatlib/.deps
? src/interfaces/ecpg/compatlib/libecpg_compat.so.2.3
? src/interfaces/ecpg/ecpglib/.deps
? src/interfaces/ecpg/ecpglib/libecpg.so.5.3
? src/interfaces/ecpg/include/ecpg_config.h
? src/interfaces/ecpg/pgtypeslib/.deps
? src/interfaces/ecpg/pgtypeslib/libpgtypes.so.2.3
? src/interfaces/ecpg/preproc/.deps
? src/interfaces/ecpg/preproc/ecpg
? src/interfaces/libpq/.deps
? src/interfaces/libpq/exports.list
? src/interfaces/libpq/libpq.so.5.1
? src/pl/plpgsql/src/.deps
? src/pl/plpgsql/src/libplpgsql.so.1.0
? src/port/.deps
? src/port/pg_config_paths.h
? src/test/regress/.deps
? src/test/regress/libregress.so.0.0
? src/test/regress/log
? src/test/regress/pg_regress
? src/test/regress/regression.diffs
? src/test/regress/regression.out
? src/test/regress/results
? src/test/regress/testtablespace
? src/test/regress/tmp_check
? src/test/regress/expected/constraints.out
? src/test/regress/expected/copy.out
? src/test/regress/expected/create_function_1.out
? src/test/regress/expected/create_function_2.out
? src/test/regress/expected/largeobject.out
? src/test/regress/expected/largeobject_1.out
? src/test/regress/expected/misc.out
? src/test/regress/expected/tablespace.out
? src/test/regress/sql/constraints.sql
? src/test/regress/sql/copy.sql
? src/test/regress/sql/create_function_1.sql
? src/test/regress/sql/create_function_2.sql
? src/test/regress/sql/largeobject.sql
? src/test/regress/sql/misc.sql
? src/test/regress/sql/tablespace.sql
? src/timezone/.deps
? src/timezone/zic
Index: src/backend/catalog/heap.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/catalog/heap.c,v
retrieving revision 1.317
diff -c -r1.317 heap.c
*** src/backend/catalog/heap.c  14 Feb 2007 01:58:56 -0000      1.317
--- src/backend/catalog/heap.c  28 Mar 2007 16:22:27 -0000
***************
*** 45,50 ****
--- 45,51 ----
  #include "catalog/pg_statistic.h"
  #include "catalog/pg_type.h"
  #include "commands/tablecmds.h"
+ #include "commands/typecmds.h"
  #include "miscadmin.h"
  #include "optimizer/clauses.h"
  #include "optimizer/var.h"
***************
*** 763,768 ****
--- 764,770 ----
        Relation        pg_class_desc;
        Relation        new_rel_desc;
        Oid                     new_type_oid;
+       char       *relarrayname;
  
        pg_class_desc = heap_open(RelationRelationId, RowExclusiveLock);
  
***************
*** 815,820 ****
--- 817,854 ----
                                                                          
relnamespace,
                                                                          relid,
                                                                          
relkind);
+       /*
+        * Add in the corresponding array types if appropriate.
+        */
+       if (relkind == 'r' || relkind == 'v' || relkind == 'c')
+       {
+               relarrayname = makeArrayTypeName(relname);
+               TypeCreate(relarrayname,                /* Array type name */
+                                  relnamespace,                /* Same 
namespace as parent */
+                                  InvalidOid,                  /* relation's 
type oid, set here to InvalidOid to make dependency work right */
+                                  0,                                   /* 
relkind, also N/A here */
+                                  -1,                                  /* 
Internal size, unlimited */
+                                  'c',                                 /* It's 
a complex type */
+                                  DEFAULT_TYPDELIM,    /* Use the default */
+                                  F_ARRAY_IN,                  /* Macro for 
array input procedure */
+                                  F_ARRAY_OUT,                 /* Macro for 
array output procedure */
+                                  F_ARRAY_RECV,                /* Macro for 
array receive (binary input) procedure */
+                                  F_ARRAY_SEND,                /* Macro for 
array send (binary output) procedure */
+                                  InvalidOid,                  /* No input 
typmod */
+                                  InvalidOid,                  /* No output 
typmod */
+                                  InvalidOid,                  /* Default 
ANALYZE procedure */
+                                  new_type_oid,                /* The OID just 
created */
+                                  InvalidOid,                  /* No base 
type--this isn't a DOMAIN */
+                                  NULL,                                /* No 
default type value */
+                                  NULL,                                /* 
Don't send binary */
+                                  false,                               /* 
Never passed by value */
+                                  'd',                                 /* Type 
alignment.  Should this be something else? */
+                                  'x',                                 /* 
Always TOASTable */
+                                  -1,                                  /* No 
typMod for regular composite types.  When we have domains over these, we should 
revisit. */
+                                  0,                                   /* 
Array diminsions of typbasetype */
+                                  false);                              /* Type 
NOT NULL */
+               pfree(relarrayname);    /* Seems like the right thing to do 
here. */
+       }
  
        /*
         * now create an entry in pg_class for the relation.
Index: src/backend/commands/tablecmds.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/commands/tablecmds.c,v
retrieving revision 1.218
diff -c -r1.218 tablecmds.c
*** src/backend/commands/tablecmds.c    19 Mar 2007 23:38:29 -0000      1.218
--- src/backend/commands/tablecmds.c    28 Mar 2007 16:22:28 -0000
***************
*** 287,298 ****
        Datum           reloptions;
        ListCell   *listptr;
        AttrNumber      attnum;
  
        /*
!        * Truncate relname to appropriate length (probably a waste of time, as
!        * parser should have done this already).
         */
!       StrNCpy(relname, stmt->relation->relname, NAMEDATALEN);
  
        /*
         * Check consistency of arguments
--- 287,307 ----
        Datum           reloptions;
        ListCell   *listptr;
        AttrNumber      attnum;
+       char       *relarrayname;
  
        /*
!        * Truncate relname to appropriate length (probably a waste of time, as 
*
!        * parser should have done this already).  Because tables and views now 
get
!        * an array type, this depends on the relkind.
         */
!       if (relkind == 'r' || relkind == 'v' || relkind == 'c')
!       {
!               StrNCpy(relname, stmt->relation->relname, NAMEDATALEN-2);
!       }
!       else
!       {
!               StrNCpy(relname, stmt->relation->relname, NAMEDATALEN);
!       }
  
        /*
         * Check consistency of arguments
*** ./expected/type_sanity.out  Thu Jan  4 10:52:38 2007
--- ./results/type_sanity.out   Wed Mar 28 09:21:35 2007
***************
*** 52,59 ****
  WHERE (p1.typtype = 'c' AND p1.typrelid = 0) OR
      (p1.typtype != 'c' AND p1.typrelid != 0);
   oid | typname 
! -----+---------
! (0 rows)
  
  -- Look for basic types that don't have an array type.
  -- NOTE: as of 8.0, this check finds smgr and unknown.
--- 52,201 ----
  WHERE (p1.typtype = 'c' AND p1.typrelid = 0) OR
      (p1.typtype != 'c' AND p1.typrelid != 0);
    oid  |              typname               
! -------+------------------------------------
!  10001 | _pg_autovacuum
!  10003 | _pg_attrdef
!  10005 | _pg_constraint
!  10007 | _pg_inherits
!  10009 | _pg_index
!  10011 | _pg_operator
!  10013 | _pg_opfamily
!  10015 | _pg_opclass
!  10118 | _pg_am
!  10120 | _pg_amop
!  10447 | _pg_amproc
!  10661 | _pg_language
!  10663 | _pg_largeobject
!  10665 | _pg_aggregate
!  10667 | _pg_statistic
!  10669 | _pg_rewrite
!  10671 | _pg_trigger
!  10673 | _pg_listener
!  10675 | _pg_description
!  10677 | _pg_cast
!  10944 | _pg_namespace
!  10946 | _pg_conversion
!  10948 | _pg_depend
!  10950 | _pg_database
!  10952 | _pg_tablespace
!  10954 | _pg_pltemplate
!  10956 | _pg_authid
!  10958 | _pg_auth_members
!  10960 | _pg_shdepend
!  10962 | _pg_shdescription
!  10977 | _pg_roles
!  10981 | _pg_shadow
!  10985 | _pg_group
!  10989 | _pg_user
!  10993 | _pg_rules
!  10998 | _pg_views
!  11002 | _pg_tables
!  11007 | _pg_indexes
!  11012 | _pg_stats
!  11017 | _pg_locks
!  11021 | _pg_cursors
!  11025 | _pg_prepared_xacts
!  11029 | _pg_prepared_statements
!  11033 | _pg_settings
!  11039 | _pg_timezone_abbrevs
!  11043 | _pg_timezone_names
!  11047 | _pg_stat_all_tables
!  11052 | _pg_stat_sys_tables
!  11056 | _pg_stat_user_tables
!  11060 | _pg_statio_all_tables
!  11065 | _pg_statio_sys_tables
!  11069 | _pg_statio_user_tables
!  11073 | _pg_stat_all_indexes
!  11078 | _pg_stat_sys_indexes
!  11082 | _pg_stat_user_indexes
!  11086 | _pg_statio_all_indexes
!  11091 | _pg_statio_sys_indexes
!  11095 | _pg_statio_user_indexes
!  11099 | _pg_statio_all_sequences
!  11103 | _pg_statio_sys_sequences
!  11107 | _pg_statio_user_sequences
!  11111 | _pg_stat_activity
!  11115 | _pg_stat_database
!  11521 | _sql_sizing
!  11527 | _sql_sizing_profiles
!  11366 | _information_schema_catalog_name
!  11371 | _applicable_roles
!  11375 | _administrable_role_authorizations
!  11379 | _attributes
!  11384 | _check_constraint_routine_usage
!  11388 | _check_constraints
!  11393 | _column_domain_usage
!  11398 | _column_privileges
!  11403 | _column_udt_usage
!  11408 | _columns
!  11413 | _constraint_column_usage
!  11418 | _constraint_table_usage
!  11422 | _domain_constraints
!  11426 | _domain_udt_usage
!  11430 | _domains
!  11435 | _enabled_roles
!  11439 | _key_column_usage
!  11444 | _parameters
!  11449 | _referential_constraints
!  11454 | _role_column_grants
!  11459 | _role_routine_grants
!  11464 | _role_table_grants
!  11469 | _role_usage_grants
!  11473 | _routine_privileges
!  11478 | _routines
!  11483 | _schemata
!  11487 | _sequences
!  11491 | _sql_features
!  11497 | _sql_implementation_info
!  11503 | _sql_languages
!  11509 | _sql_packages
!  11515 | _sql_parts
!  11533 | _table_constraints
!  11538 | _table_privileges
!  11543 | _tables
!  11548 | _triggered_update_columns
!  11552 | _triggers
!  11557 | _usage_privileges
!  11561 | _view_column_usage
!  11566 | _view_routine_usage
!  11571 | _view_table_usage
!  11576 | _views
!  11581 | _data_type_privileges
!  11586 | _element_types
!  16402 | _char_tbl
!  16411 | _float4_tbl
!  16414 | _float8_tbl
!  16417 | _int2_tbl
!  16420 | _varchar_tbl
!  16423 | _text_tbl
!  16429 | _int4_tbl
!  16434 | _int8_tbl
!  16470 | _num_data
!  16473 | _num_exp_add
!  16476 | _num_exp_sub
!  16479 | _num_exp_div
!  16482 | _num_exp_mul
!  16485 | _num_exp_sqrt
!  16488 | _num_exp_ln
!  16491 | _num_exp_log10
!  16494 | _num_exp_power_10_ln
!  16497 | _num_result
!  16523 | _num_input_test
!  16557 | _point_tbl
!  16560 | _lseg_tbl
!  16563 | _box_tbl
!  16566 | _path_tbl
!  16572 | _circle_tbl
!  16575 | _date_tbl
!  16578 | _time_tbl
!  16581 | _timetz_tbl
!  16584 | _polygon_tbl
!  16590 | _interval_tbl
!  16593 | _inet_tbl
!  16596 | _timestamptz_tbl
!  16599 | _reltime_tbl
!  16602 | _abstime_tbl
! (142 rows)
  
  -- Look for basic types that don't have an array type.
  -- NOTE: as of 8.0, this check finds smgr and unknown.

======================================================================

*** ./expected/alter_table.out  Wed Feb 14 09:36:34 2007
--- ./results/alter_table.out   Wed Mar 28 09:22:06 2007
***************
*** 1428,1433 ****
--- 1428,1438 ----
  alter type alter1.ctype set schema alter2;
  -- this should succeed because nothing is left in alter1
  drop schema alter1;
+ NOTICE:  type alter2.ctype[] depends on schema alter1
+ NOTICE:  type alter2.v1[] depends on schema alter1
+ NOTICE:  type alter2.t1[] depends on schema alter1
+ ERROR:  cannot drop schema alter1 because other objects depend on it
+ HINT:  Use DROP ... CASCADE to drop the dependent objects too.
  insert into alter2.t1(f2) values(13);
  insert into alter2.t1(f2) values(14);
  select * from alter2.t1;

======================================================================

---------------------------(end of broadcast)---------------------------
TIP 3: Have you checked our extensive FAQ?

               http://www.postgresql.org/docs/faq

Reply via email to