Index: src/backend/catalog/catalog.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/catalog/catalog.c,v retrieving revision 1.89 diff -c -r1.89 catalog.c *** src/backend/catalog/catalog.c 26 Feb 2010 02:00:36 -0000 1.89 --- src/backend/catalog/catalog.c 20 Apr 2010 21:28:40 -0000 *************** *** 327,335 **** relationId == DbRoleSettingDatidRolidIndexId) return true; /* These are their toast tables and toast indexes (see toasting.h) */ ! if (relationId == PgAuthidToastTable || ! relationId == PgAuthidToastIndex || ! relationId == PgDatabaseToastTable || relationId == PgDatabaseToastIndex || relationId == PgShdescriptionToastTable || relationId == PgShdescriptionToastIndex || --- 327,333 ---- relationId == DbRoleSettingDatidRolidIndexId) return true; /* These are their toast tables and toast indexes (see toasting.h) */ ! if (relationId == PgDatabaseToastTable || relationId == PgDatabaseToastIndex || relationId == PgShdescriptionToastTable || relationId == PgShdescriptionToastIndex || Index: src/backend/catalog/genbki.pl =================================================================== RCS file: /cvsroot/pgsql/src/backend/catalog/genbki.pl,v retrieving revision 1.7 diff -c -r1.7 genbki.pl *** src/backend/catalog/genbki.pl 22 Jan 2010 16:40:18 -0000 1.7 --- src/backend/catalog/genbki.pl 20 Apr 2010 21:28:40 -0000 *************** *** 183,195 **** # Generate entries for user attributes. my $attnum = 0; my @user_attrs = @{ $table->{columns} }; foreach my $attr (@user_attrs) { $attnum++; ! my $row = emit_pgattr_row($table_name, $attr); $row->{attnum} = $attnum; $row->{attstattarget} = '-1'; # If it's bootstrapped, put an entry in postgres.bki. if ($is_bootstrap eq ' bootstrap') --- 183,197 ---- # Generate entries for user attributes. my $attnum = 0; + my $priornotnull = 1; my @user_attrs = @{ $table->{columns} }; foreach my $attr (@user_attrs) { $attnum++; ! my $row = emit_pgattr_row($table_name, $attr, $priornotnull); $row->{attnum} = $attnum; $row->{attstattarget} = '-1'; + $priornotnull &= ($row->{attnotnull} eq 't'); # If it's bootstrapped, put an entry in postgres.bki. if ($is_bootstrap eq ' bootstrap') *************** *** 221,227 **** foreach my $attr (@SYS_ATTRS) { $attnum--; ! my $row = emit_pgattr_row($table_name, $attr); $row->{attnum} = $attnum; $row->{attstattarget} = '0'; --- 223,229 ---- foreach my $attr (@SYS_ATTRS) { $attnum--; ! my $row = emit_pgattr_row($table_name, $attr, 1); $row->{attnum} = $attnum; $row->{attstattarget} = '0'; *************** *** 308,317 **** # Given a system catalog name and a reference to a key-value pair corresponding # to the name and type of a column, generate a reference to a hash that ! # represents a pg_attribute entry sub emit_pgattr_row { ! my ($table_name, $attr) = @_; my ($attname, $atttype) = %$attr; my %row; --- 310,320 ---- # Given a system catalog name and a reference to a key-value pair corresponding # to the name and type of a column, generate a reference to a hash that ! # represents a pg_attribute entry. We must also be told whether preceding ! # columns were all not-null. sub emit_pgattr_row { ! my ($table_name, $attr, $priornotnull) = @_; my ($attname, $atttype) = %$attr; my %row; *************** *** 337,351 **** $row{attalign} = $type->{typalign}; # set attndims if it's an array type $row{attndims} = $type->{typcategory} eq 'A' ? '1' : '0'; ! # This approach to attnotnull is not really good enough; ! # we need to know about prior column types too. Look at ! # DefineAttr in bootstrap.c. For the moment it's okay for ! # the column orders appearing in bootstrapped catalogs. ! $row{attnotnull} = ! $type->{typname} eq 'oidvector' ? 't' ! : $type->{typname} eq 'int2vector' ? 't' ! : $type->{typlen} eq 'NAMEDATALEN' ? 't' ! : $type->{typlen} > 0 ? 't' : 'f'; last; } } --- 340,360 ---- $row{attalign} = $type->{typalign}; # set attndims if it's an array type $row{attndims} = $type->{typcategory} eq 'A' ? '1' : '0'; ! # attnotnull must be set true if the type is fixed-width and ! # prior columns are too --- compare DefineAttr in bootstrap.c. ! # oidvector and int2vector are also treated as not-nullable. ! if ($priornotnull) ! { ! $row{attnotnull} = ! $type->{typname} eq 'oidvector' ? 't' ! : $type->{typname} eq 'int2vector' ? 't' ! : $type->{typlen} eq 'NAMEDATALEN' ? 't' ! : $type->{typlen} > 0 ? 't' : 'f'; ! } ! else ! { ! $row{attnotnull} = 'f'; ! } last; } } Index: src/backend/utils/cache/catcache.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/utils/cache/catcache.c,v retrieving revision 1.151 diff -c -r1.151 catcache.c *** src/backend/utils/cache/catcache.c 14 Feb 2010 18:42:17 -0000 1.151 --- src/backend/utils/cache/catcache.c 20 Apr 2010 21:28:40 -0000 *************** *** 981,1014 **** * certain system indexes that support critical syscaches. * We can't use an indexscan to fetch these, else we'll get into * infinite recursion. A plain heap scan will work, however. - * * Once we have completed relcache initialization (signaled by * criticalRelcachesBuilt), we don't have to worry anymore. */ static bool IndexScanOK(CatCache *cache, ScanKey cur_skey) { ! if (cache->id == INDEXRELID) { ! /* ! * Rather than tracking exactly which indexes have to be loaded before ! * we can use indexscans (which changes from time to time), just force ! * all pg_index searches to be heap scans until we've built the ! * critical relcaches. ! */ ! if (!criticalRelcachesBuilt) return false; ! } ! else if (cache->id == AMOID || ! cache->id == AMNAME) ! { ! /* ! * Always do heap scans in pg_am, because it's so small there's not ! * much point in an indexscan anyway. We *must* do this when ! * initially building critical relcache entries, but we might as well ! * just always do it. ! */ ! return false; } /* Normal case, allow index scan */ --- 981,1032 ---- * certain system indexes that support critical syscaches. * We can't use an indexscan to fetch these, else we'll get into * infinite recursion. A plain heap scan will work, however. * Once we have completed relcache initialization (signaled by * criticalRelcachesBuilt), we don't have to worry anymore. + * + * Similarly, during backend startup we have to be able to use the + * pg_authid and pg_auth_members syscaches for authentication even if + * we don't yet have relcache entries for those catalogs' indexes. */ static bool IndexScanOK(CatCache *cache, ScanKey cur_skey) { ! switch (cache->id) { ! case INDEXRELID: ! /* ! * Rather than tracking exactly which indexes have to be loaded ! * before we can use indexscans (which changes from time to time), ! * just force all pg_index searches to be heap scans until we've ! * built the critical relcaches. ! */ ! if (!criticalRelcachesBuilt) ! return false; ! break; ! ! case AMOID: ! case AMNAME: ! /* ! * Always do heap scans in pg_am, because it's so small there's ! * not much point in an indexscan anyway. We *must* do this when ! * initially building critical relcache entries, but we might as ! * well just always do it. ! */ return false; ! ! case AUTHNAME: ! case AUTHOID: ! case AUTHMEMMEMROLE: ! /* ! * Protect authentication lookups occurring before relcache has ! * collected entries for shared indexes. ! */ ! if (!criticalSharedRelcachesBuilt) ! return false; ! break; ! ! default: ! break; } /* Normal case, allow index scan */ *************** *** 1397,1403 **** scandesc = systable_beginscan(relation, cache->cc_indexoid, ! true, SnapshotNow, nkeys, cur_skey); --- 1415,1421 ---- scandesc = systable_beginscan(relation, cache->cc_indexoid, ! IndexScanOK(cache, cur_skey), SnapshotNow, nkeys, cur_skey); Index: src/backend/utils/cache/relcache.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v retrieving revision 1.309 diff -c -r1.309 relcache.c *** src/backend/utils/cache/relcache.c 14 Apr 2010 21:31:11 -0000 1.309 --- src/backend/utils/cache/relcache.c 20 Apr 2010 21:28:40 -0000 *************** *** 43,48 **** --- 43,49 ---- #include "catalog/pg_amproc.h" #include "catalog/pg_attrdef.h" #include "catalog/pg_authid.h" + #include "catalog/pg_auth_members.h" #include "catalog/pg_constraint.h" #include "catalog/pg_database.h" #include "catalog/pg_namespace.h" *************** *** 87,99 **** #define RELCACHE_INIT_FILEMAGIC 0x573265 /* version ID value */ /* ! * hardcoded tuple descriptors. see include/catalog/pg_attribute.h */ static const FormData_pg_attribute Desc_pg_class[Natts_pg_class] = {Schema_pg_class}; static const FormData_pg_attribute Desc_pg_attribute[Natts_pg_attribute] = {Schema_pg_attribute}; static const FormData_pg_attribute Desc_pg_proc[Natts_pg_proc] = {Schema_pg_proc}; static const FormData_pg_attribute Desc_pg_type[Natts_pg_type] = {Schema_pg_type}; static const FormData_pg_attribute Desc_pg_database[Natts_pg_database] = {Schema_pg_database}; static const FormData_pg_attribute Desc_pg_index[Natts_pg_index] = {Schema_pg_index}; /* --- 88,102 ---- #define RELCACHE_INIT_FILEMAGIC 0x573265 /* version ID value */ /* ! * hardcoded tuple descriptors, generated by genbki.pl */ static const FormData_pg_attribute Desc_pg_class[Natts_pg_class] = {Schema_pg_class}; static const FormData_pg_attribute Desc_pg_attribute[Natts_pg_attribute] = {Schema_pg_attribute}; static const FormData_pg_attribute Desc_pg_proc[Natts_pg_proc] = {Schema_pg_proc}; static const FormData_pg_attribute Desc_pg_type[Natts_pg_type] = {Schema_pg_type}; static const FormData_pg_attribute Desc_pg_database[Natts_pg_database] = {Schema_pg_database}; + static const FormData_pg_attribute Desc_pg_authid[Natts_pg_authid] = {Schema_pg_authid}; + static const FormData_pg_attribute Desc_pg_auth_members[Natts_pg_auth_members] = {Schema_pg_auth_members}; static const FormData_pg_attribute Desc_pg_index[Natts_pg_index] = {Schema_pg_index}; /* *************** *** 118,124 **** /* * This flag is false until we have prepared the critical relcache entries ! * for shared catalogs (specifically, pg_database and its indexes). */ bool criticalSharedRelcachesBuilt = false; --- 121,127 ---- /* * This flag is false until we have prepared the critical relcache entries ! * for shared catalogs (which are the tables needed for login). */ bool criticalSharedRelcachesBuilt = false; *************** *** 1379,1386 **** * quite a lot since we only need to work for a few basic system * catalogs. * ! * formrdesc is currently used for: pg_database, pg_class, pg_attribute, ! * pg_proc, and pg_type (see RelationCacheInitializePhase2/3). * * Note that these catalogs can't have constraints (except attnotnull), * default values, rules, or triggers, since we don't cope with any of that. --- 1382,1390 ---- * quite a lot since we only need to work for a few basic system * catalogs. * ! * formrdesc is currently used for: pg_database, pg_authid, pg_auth_members, ! * pg_class, pg_attribute, pg_proc, and pg_type ! * (see RelationCacheInitializePhase2/3). * * Note that these catalogs can't have constraints (except attnotnull), * default values, rules, or triggers, since we don't cope with any of that. *************** *** 1461,1468 **** * initialize attribute tuple form * * Unlike the case with the relation tuple, this data had better be right ! * because it will never be replaced. The input values must be correctly ! * defined by macros in src/include/catalog/ headers. */ relation->rd_att = CreateTemplateTupleDesc(natts, hasoids); relation->rd_att->tdrefcount = 1; /* mark as refcounted */ --- 1465,1472 ---- * initialize attribute tuple form * * Unlike the case with the relation tuple, this data had better be right ! * because it will never be replaced. The data comes from ! * src/include/catalog/ headers via genbki.pl. */ relation->rd_att = CreateTemplateTupleDesc(natts, hasoids); relation->rd_att->tdrefcount = 1; /* mark as refcounted */ *************** *** 2455,2460 **** --- 2459,2466 ---- switch (relid) { case DatabaseRelationId: + case AuthIdRelationId: + case AuthMemRelationId: case RelationRelationId: case AttributeRelationId: case ProcedureRelationId: *************** *** 2750,2761 **** /* * RelationCacheInitializePhase2 * ! * This is called to prepare for access to pg_database during startup. ! * We must at least set up a nailed reldesc for pg_database. Ideally ! * we'd like to have reldescs for its indexes, too. We attempt to ! * load this information from the shared relcache init file. If that's ! * missing or broken, just make a phony entry for pg_database. ! * RelationCacheInitializePhase3 will clean up as needed. */ void RelationCacheInitializePhase2(void) --- 2756,2768 ---- /* * RelationCacheInitializePhase2 * ! * This is called to prepare for access to shared catalogs during startup. ! * We must at least set up nailed reldescs for pg_database, pg_authid, ! * and pg_auth_members. Ideally we'd like to have reldescs for their ! * indexes, too. We attempt to load this information from the shared ! * relcache init file. If that's missing or broken, just make phony ! * entries for the catalogs themselves. RelationCacheInitializePhase3 ! * will clean up as needed. */ void RelationCacheInitializePhase2(void) *************** *** 2768,2774 **** RelationMapInitializePhase2(); /* ! * In bootstrap mode, pg_database isn't there yet anyway, so do nothing. */ if (IsBootstrapProcessingMode()) return; --- 2775,2782 ---- RelationMapInitializePhase2(); /* ! * In bootstrap mode, the shared catalogs aren't there yet anyway, ! * so do nothing. */ if (IsBootstrapProcessingMode()) return; *************** *** 2780,2793 **** /* * Try to load the shared relcache cache file. If unsuccessful, bootstrap ! * the cache with a pre-made descriptor for pg_database. */ if (!load_relcache_init_file(true)) { formrdesc("pg_database", DatabaseRelation_Rowtype_Id, true, true, Natts_pg_database, Desc_pg_database); ! #define NUM_CRITICAL_SHARED_RELS 1 /* fix if you change list above */ } MemoryContextSwitchTo(oldcxt); --- 2788,2805 ---- /* * Try to load the shared relcache cache file. If unsuccessful, bootstrap ! * the cache with pre-made descriptors for the critical shared catalogs. */ if (!load_relcache_init_file(true)) { formrdesc("pg_database", DatabaseRelation_Rowtype_Id, true, true, Natts_pg_database, Desc_pg_database); + formrdesc("pg_authid", AuthIdRelation_Rowtype_Id, true, + true, Natts_pg_authid, Desc_pg_authid); + formrdesc("pg_auth_members", AuthMemRelation_Rowtype_Id, true, + false, Natts_pg_auth_members, Desc_pg_auth_members); ! #define NUM_CRITICAL_SHARED_RELS 3 /* fix if you change list above */ } MemoryContextSwitchTo(oldcxt); *************** *** 2910,2916 **** * DatabaseNameIndexId isn't critical for relcache loading, but rather for * initial lookup of MyDatabaseId, without which we'll never find any * non-shared catalogs at all. Autovacuum calls InitPostgres with a ! * database OID, so it instead depends on DatabaseOidIndexId. */ if (!criticalSharedRelcachesBuilt) { --- 2922,2930 ---- * DatabaseNameIndexId isn't critical for relcache loading, but rather for * initial lookup of MyDatabaseId, without which we'll never find any * non-shared catalogs at all. Autovacuum calls InitPostgres with a ! * database OID, so it instead depends on DatabaseOidIndexId. We also ! * need to nail up some indexes on pg_authid and pg_auth_members for use ! * during client authentication. */ if (!criticalSharedRelcachesBuilt) { *************** *** 2918,2925 **** DatabaseRelationId); load_critical_index(DatabaseOidIndexId, DatabaseRelationId); ! #define NUM_CRITICAL_SHARED_INDEXES 2 /* fix if you change list above */ criticalSharedRelcachesBuilt = true; } --- 2932,2945 ---- DatabaseRelationId); load_critical_index(DatabaseOidIndexId, DatabaseRelationId); + load_critical_index(AuthIdRolnameIndexId, + AuthIdRelationId); + load_critical_index(AuthIdOidIndexId, + AuthIdRelationId); + load_critical_index(AuthMemMemRoleIndexId, + AuthMemRelationId); ! #define NUM_CRITICAL_SHARED_INDEXES 5 /* fix if you change list above */ criticalSharedRelcachesBuilt = true; } Index: src/backend/utils/init/miscinit.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/utils/init/miscinit.c,v retrieving revision 1.183 diff -c -r1.183 miscinit.c *** src/backend/utils/init/miscinit.c 26 Feb 2010 02:01:13 -0000 1.183 --- src/backend/utils/init/miscinit.c 20 Apr 2010 21:28:40 -0000 *************** *** 429,438 **** * These next checks are not enforced when in standalone mode, so that * there is a way to recover from sillinesses like "UPDATE pg_authid SET * rolcanlogin = false;". - * - * We do not enforce them for the autovacuum process either. */ ! if (IsUnderPostmaster && !IsAutoVacuumWorkerProcess()) { /* * Is role allowed to login at all? --- 429,436 ---- * These next checks are not enforced when in standalone mode, so that * there is a way to recover from sillinesses like "UPDATE pg_authid SET * rolcanlogin = false;". */ ! if (IsUnderPostmaster) { /* * Is role allowed to login at all? *************** *** 479,485 **** void InitializeSessionUserIdStandalone(void) { ! /* This function should only be called in a single-user backend. */ AssertState(!IsUnderPostmaster || IsAutoVacuumWorkerProcess()); /* call only once */ --- 477,486 ---- void InitializeSessionUserIdStandalone(void) { ! /* ! * This function should only be called in single-user mode and in ! * autovacuum workers. ! */ AssertState(!IsUnderPostmaster || IsAutoVacuumWorkerProcess()); /* call only once */ Index: src/backend/utils/init/postinit.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/utils/init/postinit.c,v retrieving revision 1.209 diff -c -r1.209 postinit.c *** src/backend/utils/init/postinit.c 20 Apr 2010 01:38:52 -0000 1.209 --- src/backend/utils/init/postinit.c 20 Apr 2010 21:28:40 -0000 *************** *** 552,558 **** /* * Load relcache entries for the shared system catalogs. This must create ! * at least an entry for pg_database. */ RelationCacheInitializePhase2(); --- 552,558 ---- /* * Load relcache entries for the shared system catalogs. This must create ! * at least entries for pg_database and catalogs used for authentication. */ RelationCacheInitializePhase2(); *************** *** 586,598 **** } /* * Set up the global variables holding database id and default tablespace. * But note we won't actually try to touch the database just yet. * ! * We take a shortcut in the bootstrap and walsender case, otherwise we ! * have to look up the db's entry in pg_database. */ ! if (bootstrap || am_walsender) { MyDatabaseId = TemplateDbOid; MyDatabaseTableSpace = DEFAULTTABLESPACE_OID; --- 586,644 ---- } /* + * Perform client authentication if necessary, then figure out our + * postgres user ID, and see if we are a superuser. + * + * In standalone mode and in autovacuum worker processes, we use a fixed + * ID, otherwise we figure it out from the authenticated user name. + */ + if (bootstrap || IsAutoVacuumWorkerProcess()) + { + InitializeSessionUserIdStandalone(); + am_superuser = true; + } + else if (!IsUnderPostmaster) + { + InitializeSessionUserIdStandalone(); + am_superuser = true; + if (!ThereIsAtLeastOneRole()) + ereport(WARNING, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("no roles are defined in this database system"), + errhint("You should immediately run CREATE USER \"%s\" SUPERUSER;.", + username))); + } + else + { + /* normal multiuser case */ + Assert(MyProcPort != NULL); + PerformAuthentication(MyProcPort); + InitializeSessionUserId(username); + am_superuser = superuser(); + } + + /* + * If walsender, we're done here --- we don't want to connect to any + * particular database. + */ + if (am_walsender) + { + Assert(!bootstrap); + /* report this backend in the PgBackendStatus array */ + pgstat_bestart(); + /* close the transaction we started above */ + CommitTransactionCommand(); + return; + } + + /* * Set up the global variables holding database id and default tablespace. * But note we won't actually try to touch the database just yet. * ! * We take a shortcut in the bootstrap case, otherwise we have to look up ! * the db's entry in pg_database. */ ! if (bootstrap) { MyDatabaseId = TemplateDbOid; MyDatabaseTableSpace = DEFAULTTABLESPACE_OID; *************** *** 655,661 **** * AccessShareLock for such sessions and thereby not conflict against * CREATE DATABASE. */ ! if (!bootstrap && !am_walsender) LockSharedObject(DatabaseRelationId, MyDatabaseId, 0, RowExclusiveLock); --- 701,707 ---- * AccessShareLock for such sessions and thereby not conflict against * CREATE DATABASE. */ ! if (!bootstrap) LockSharedObject(DatabaseRelationId, MyDatabaseId, 0, RowExclusiveLock); *************** *** 664,670 **** * If there was a concurrent DROP DATABASE, this ensures we will die * cleanly without creating a mess. */ ! if (!bootstrap && !am_walsender) { HeapTuple tuple; --- 710,716 ---- * If there was a concurrent DROP DATABASE, this ensures we will die * cleanly without creating a mess. */ ! if (!bootstrap) { HeapTuple tuple; *************** *** 684,690 **** */ fullpath = GetDatabasePath(MyDatabaseId, MyDatabaseTableSpace); ! if (!bootstrap && !am_walsender) { if (access(fullpath, F_OK) == -1) { --- 730,736 ---- */ fullpath = GetDatabasePath(MyDatabaseId, MyDatabaseTableSpace); ! if (!bootstrap) { if (access(fullpath, F_OK) == -1) { *************** *** 715,765 **** */ RelationCacheInitializePhase3(); - /* - * Perform client authentication if necessary, then figure out our - * postgres user ID, and see if we are a superuser. - * - * In standalone mode and in autovacuum worker processes, we use a fixed - * ID, otherwise we figure it out from the authenticated user name. - */ - if (bootstrap || IsAutoVacuumWorkerProcess()) - { - InitializeSessionUserIdStandalone(); - am_superuser = true; - } - else if (!IsUnderPostmaster) - { - InitializeSessionUserIdStandalone(); - am_superuser = true; - if (!ThereIsAtLeastOneRole()) - ereport(WARNING, - (errcode(ERRCODE_UNDEFINED_OBJECT), - errmsg("no roles are defined in this database system"), - errhint("You should immediately run CREATE USER \"%s\" SUPERUSER;.", - username))); - } - else - { - /* normal multiuser case */ - Assert(MyProcPort != NULL); - PerformAuthentication(MyProcPort); - InitializeSessionUserId(username); - am_superuser = superuser(); - } - /* set up ACL framework (so CheckMyDatabase can check permissions) */ initialize_acl(); - /* Process pg_db_role_setting options */ - process_settings(MyDatabaseId, GetSessionUserId()); - /* * Re-read the pg_database row for our database, check permissions and set * up database-specific GUC settings. We can't do this until all the * database-access infrastructure is up. (Also, it wants to know if the * user is a superuser, so the above stuff has to happen first.) */ ! if (!bootstrap && !am_walsender) CheckMyDatabase(dbname, am_superuser); /* --- 761,776 ---- */ RelationCacheInitializePhase3(); /* set up ACL framework (so CheckMyDatabase can check permissions) */ initialize_acl(); /* * Re-read the pg_database row for our database, check permissions and set * up database-specific GUC settings. We can't do this until all the * database-access infrastructure is up. (Also, it wants to know if the * user is a superuser, so the above stuff has to happen first.) */ ! if (!bootstrap) CheckMyDatabase(dbname, am_superuser); /* *************** *** 841,846 **** --- 852,860 ---- } } + /* Process pg_db_role_setting options */ + process_settings(MyDatabaseId, GetSessionUserId()); + /* Apply PostAuthDelay as soon as we've read all options */ if (PostAuthDelay > 0) pg_usleep(PostAuthDelay * 1000000L); *************** *** 856,865 **** /* initialize client encoding */ InitializeClientEncoding(); - /* reset the database for walsender */ - if (am_walsender) - MyProc->databaseId = MyDatabaseId = InvalidOid; - /* report this backend in the PgBackendStatus array */ if (!bootstrap) pgstat_bestart(); --- 870,875 ---- Index: src/include/catalog/catversion.h =================================================================== RCS file: /cvsroot/pgsql/src/include/catalog/catversion.h,v retrieving revision 1.585 diff -c -r1.585 catversion.h *** src/include/catalog/catversion.h 16 Feb 2010 22:34:54 -0000 1.585 --- src/include/catalog/catversion.h 20 Apr 2010 21:28:40 -0000 *************** *** 53,58 **** */ /* yyyymmddN */ ! #define CATALOG_VERSION_NO 201002161 #endif --- 53,58 ---- */ /* yyyymmddN */ ! #define CATALOG_VERSION_NO 201004201 #endif Index: src/include/catalog/pg_auth_members.h =================================================================== RCS file: /cvsroot/pgsql/src/include/catalog/pg_auth_members.h,v retrieving revision 1.8 diff -c -r1.8 pg_auth_members.h *** src/include/catalog/pg_auth_members.h 5 Jan 2010 01:06:56 -0000 1.8 --- src/include/catalog/pg_auth_members.h 20 Apr 2010 21:28:40 -0000 *************** *** 27,34 **** * ---------------- */ #define AuthMemRelationId 1261 ! CATALOG(pg_auth_members,1261) BKI_SHARED_RELATION BKI_WITHOUT_OIDS { Oid roleid; /* ID of a role */ Oid member; /* ID of a member of that role */ --- 27,35 ---- * ---------------- */ #define AuthMemRelationId 1261 + #define AuthMemRelation_Rowtype_Id 2843 ! CATALOG(pg_auth_members,1261) BKI_SHARED_RELATION BKI_WITHOUT_OIDS BKI_ROWTYPE_OID(2843) BKI_SCHEMA_MACRO { Oid roleid; /* ID of a role */ Oid member; /* ID of a member of that role */ Index: src/include/catalog/pg_authid.h =================================================================== RCS file: /cvsroot/pgsql/src/include/catalog/pg_authid.h,v retrieving revision 1.12 diff -c -r1.12 pg_authid.h *** src/include/catalog/pg_authid.h 5 Jan 2010 01:06:56 -0000 1.12 --- src/include/catalog/pg_authid.h 20 Apr 2010 21:28:40 -0000 *************** *** 40,47 **** * ---------------- */ #define AuthIdRelationId 1260 ! CATALOG(pg_authid,1260) BKI_SHARED_RELATION { NameData rolname; /* name of role */ bool rolsuper; /* read this field via superuser() only! */ --- 40,48 ---- * ---------------- */ #define AuthIdRelationId 1260 + #define AuthIdRelation_Rowtype_Id 2842 ! CATALOG(pg_authid,1260) BKI_SHARED_RELATION BKI_ROWTYPE_OID(2842) BKI_SCHEMA_MACRO { NameData rolname; /* name of role */ bool rolsuper; /* read this field via superuser() only! */ *************** *** 71,77 **** * compiler constants for pg_authid * ---------------- */ ! #define Natts_pg_authid 11 #define Anum_pg_authid_rolname 1 #define Anum_pg_authid_rolsuper 2 #define Anum_pg_authid_rolinherit 3 --- 72,78 ---- * compiler constants for pg_authid * ---------------- */ ! #define Natts_pg_authid 10 #define Anum_pg_authid_rolname 1 #define Anum_pg_authid_rolsuper 2 #define Anum_pg_authid_rolinherit 3 Index: src/include/catalog/toasting.h =================================================================== RCS file: /cvsroot/pgsql/src/include/catalog/toasting.h,v retrieving revision 1.13 diff -c -r1.13 toasting.h *** src/include/catalog/toasting.h 6 Jan 2010 03:04:03 -0000 1.13 --- src/include/catalog/toasting.h 20 Apr 2010 21:28:40 -0000 *************** *** 49,57 **** DECLARE_TOAST(pg_trigger, 2336, 2337); /* shared catalogs */ - DECLARE_TOAST(pg_authid, 2842, 2843); - #define PgAuthidToastTable 2842 - #define PgAuthidToastIndex 2843 DECLARE_TOAST(pg_database, 2844, 2845); #define PgDatabaseToastTable 2844 #define PgDatabaseToastIndex 2845 --- 49,54 ----