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