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