Thread: pg_upgrade
I'm testing pg_upgrade out and ran into a couple of problems. First when I did pg_upgrade --check I got the tsearch2 tablespreventing the upgrade from happening: Database: testdatabase public.pg_ts_dict.dict_init public.pg_ts_dict.dict_lexize public.pg_ts_parser.prs_start public.pg_ts_parser.prs_nexttoken public.pg_ts_parser.prs_end public.pg_ts_parser.prs_headline public.pg_ts_parser.prs_lextype For testing, at this point I really didn't care about tsearch, so I simply dropped those tables so I could revisit them later-- however, I'm confused about these tables in general, both pg_catalog.pg_ts_parser and public.pg_ts_parser exist withdifferent, albeit similar, schemas. I think that the table in public is no longer used and was a remnant from pre-8.3when tsearch2 wasn't part of the distribution, can anyone confirm this? Anyway, after removing the tsearch tables, I did pg_upgrade --check again and it said the clusters were compatible. I proceededto run the upgrade command and it bombed out in the "Restoring user relation files" section. I've included someoutput below, any advice on what is going on? It seems something is messed up in either the check logic or actual migrationcode. root@ubuntu:~# /usr/pg-8.4/bin/oid2name All databases: Oid Database Name Tablespace ------------------------------------------- ... 11564 postgres pg_default ... root@ubuntu:~# /usr/pg-8.4/bin/oid2name -o 2683 From database "postgres": Filenode Table Name ---------------------------------------- 2683 pg_largeobject_loid_pn_index postgres@ubuntu:~$ /usr/pg-9.0/bin/pg_upgrade Performing Consistency Checks ----------------------------- Checking old data directory (/moby/pgdb-8.4) ok Checking old bin directory (/usr/pg-8.4/bin) ok Checking new data directory (/moby/pgdb-9.0) ok Checking new bin directory (/usr/pg-9.0/bin) ok Checking for reg* system oid user data types ok Checking for /contrib/isn with bigint-passing mismatch ok Checking for large objects ok Creating catalog dump ok Checking for presence of required libraries ok | If pg_upgrade fails after this point, you must | re-initdb the new cluster before continuing. | You will also need to remove the ".old" suffix | from /moby/pgdb-8.4/global/pg_control.old. Performing Migration -------------------- Adding ".old" suffix to old global/pg_control ok Analyzing all rows in the new cluster ok Freezing all rows on the new cluster ok Deleting new commit clogs ok Copying old commit clogs to new server ok Setting next transaction id for new cluster ok Resetting WAL archives ok Setting frozenxid counters in new cluster ok Creating databases in the new cluster ok Adding support functions to new cluster ok Restoring database schema to new cluster ok Removing support functions from new cluster ok Restoring user relation files /moby/pgdb-8.4/base/11564/2683 Could not find pg_toast.pg_toast_2147483647 in new cluster
Brian Hirt <bhirt@me.com> writes: > I'm testing pg_upgrade out and ran into a couple of problems. First when I did pg_upgrade --check I got the tsearch2tables preventing the upgrade from happening: > Database: testdatabase > public.pg_ts_dict.dict_init > public.pg_ts_dict.dict_lexize > public.pg_ts_parser.prs_start > public.pg_ts_parser.prs_nexttoken > public.pg_ts_parser.prs_end > public.pg_ts_parser.prs_headline > public.pg_ts_parser.prs_lextype > For testing, at this point I really didn't care about tsearch, so I simply dropped those tables so I could revisit themlater -- however, I'm confused about these tables in general, both pg_catalog.pg_ts_parser and public.pg_ts_parser existwith different, albeit similar, schemas. I think that the table in public is no longer used and was a remnant frompre-8.3 when tsearch2 wasn't part of the distribution, can anyone confirm this? Correct, you should just drop the ones that aren't in pg_catalog. > Anyway, after removing the tsearch tables, I did pg_upgrade --check again and it said the clusters were compatible. I proceededto run the upgrade command and it bombed out in the "Restoring user relation files" section. That sure looks like a bug, but there's not enough info here to diagnose. Is there actually a pg_toast.pg_toast_2147483647 table in the 8.4 cluster? (I'm betting not.) Could you try extracting a test case? I wonder whether "pg_dump -s" from the 8.4 database, loaded into a fresh 8.4 database, would be enough to reproduce. regards, tom lane
Looks like pg_upgrade is using 32bit oids. 2147483647 is the max signed 32 bit int, but the oids for my tables are clearlylarger than that. == output from pg_upgrade == Database: basement84_dev relname: mit.company: reloid: 2147483647 reltblspace: relname: mit.company_history: reloid: 2147483647 reltblspace: == output from catalog query == basement84_dev=# select c.oid,c.relname from pg_catalog.pg_namespace n, pg_catalog.pg_class c where n.oid = c.relnamespaceand n.nspname = 'mit'; oid | relname ------------+-------------------- 3000767630 | company 3000767633 | company_history (22 rows) On Sep 28, 2010, at 10:51 AM, Tom Lane wrote: > Brian Hirt <bhirt@me.com> writes: >> I'm testing pg_upgrade out and ran into a couple of problems. First when I did pg_upgrade --check I got the tsearch2tables preventing the upgrade from happening: >> Database: testdatabase >> public.pg_ts_dict.dict_init >> public.pg_ts_dict.dict_lexize >> public.pg_ts_parser.prs_start >> public.pg_ts_parser.prs_nexttoken >> public.pg_ts_parser.prs_end >> public.pg_ts_parser.prs_headline >> public.pg_ts_parser.prs_lextype > >> For testing, at this point I really didn't care about tsearch, so I simply dropped those tables so I could revisit themlater -- however, I'm confused about these tables in general, both pg_catalog.pg_ts_parser and public.pg_ts_parser existwith different, albeit similar, schemas. I think that the table in public is no longer used and was a remnant frompre-8.3 when tsearch2 wasn't part of the distribution, can anyone confirm this? > > Correct, you should just drop the ones that aren't in pg_catalog. > > >> Anyway, after removing the tsearch tables, I did pg_upgrade --check again and it said the clusters were compatible. Iproceeded to run the upgrade command and it bombed out in the "Restoring user relation files" section. > > That sure looks like a bug, but there's not enough info here to > diagnose. Is there actually a pg_toast.pg_toast_2147483647 table > in the 8.4 cluster? (I'm betting not.) Could you try extracting > a test case? I wonder whether "pg_dump -s" from the 8.4 database, > loaded into a fresh 8.4 database, would be enough to reproduce. > > regards, tom lane > > -- > Sent via pgsql-general mailing list (pgsql-general@postgresql.org) > To make changes to your subscription: > http://www.postgresql.org/mailpref/pgsql-general
Brian Hirt wrote: > Looks like pg_upgrade is using 32bit oids. 2147483647 is the max signed 32 bit int, but the oids for my tables are clearlylarger than that. > > == output from pg_upgrade == > Database: basement84_dev > relname: mit.company: reloid: 2147483647 reltblspace: > relname: mit.company_history: reloid: 2147483647 reltblspace: > > == output from catalog query == > basement84_dev=# select c.oid,c.relname from pg_catalog.pg_namespace n, pg_catalog.pg_class c where n.oid = c.relnamespaceand n.nspname = 'mit'; > oid | relname > ------------+-------------------- > 3000767630 | company > 3000767633 | company_history > (22 rows) > Interesting. Odd it would report the max 32-bit signed int. I wonder if it somehow is getting set to -1. I looked briefly at the pg_upgrade code and it appears to put all oids in unsigned ints. -- Bruce Momjian <bruce@momjian.us> http://momjian.us EnterpriseDB http://enterprisedb.com + It's impossible for everything to be true. +
Bruce Momjian <bruce@momjian.us> writes: > Interesting. Odd it would report the max 32-bit signed int. I wonder > if it somehow is getting set to -1. I looked briefly at the pg_upgrade > code and it appears to put all oids in unsigned ints. On some platforms, that's what you'll get if you feed a value larger than 2^31 to atoi() and related functions. I will bet lunch that this behavior reflects an attempt to use signed-integer input functions on OID values. You need to check the string conversion code itself, not just the declared type of the result variables. regards, tom lane
It looks like it's related to atol $ cat test-atol.c #include <stdlib.h> #include <stdio.h> int main(int argc, char **argv) { unsigned int test1; long test2; long long test3; unsigned int test4; test1 = (unsigned int)atol("3000767169"); test2 = (long)atol("3000767169"); test3 = atoll("3000767169"); test4 = (unsigned int)atoll("3000767169"); fprintf(stderr,"%u %ld %lld %u\n",test1,test2,test3,test4); } $ make test-atol cc test-atol.c -o test-atol $ ./test-atol 2147483647 2147483647 3000767169 3000767169 I think C90 and C99 specify different behaviors with atol Is there some standard way postgresql parses integer strings? Maybe that method should be used instead of duplicating thefunctionality so at least the two behave consistently. --brian On Sep 28, 2010, at 2:00 PM, Bruce Momjian wrote: > Brian Hirt wrote: >> Looks like pg_upgrade is using 32bit oids. 2147483647 is the max signed 32 bit int, but the oids for my tables are clearlylarger than that. >> >> == output from pg_upgrade == >> Database: basement84_dev >> relname: mit.company: reloid: 2147483647 reltblspace: >> relname: mit.company_history: reloid: 2147483647 reltblspace: >> >> == output from catalog query == >> basement84_dev=# select c.oid,c.relname from pg_catalog.pg_namespace n, pg_catalog.pg_class c where n.oid = c.relnamespaceand n.nspname = 'mit'; >> oid | relname >> ------------+-------------------- >> 3000767630 | company >> 3000767633 | company_history >> (22 rows) >> > > Interesting. Odd it would report the max 32-bit signed int. I wonder > if it somehow is getting set to -1. I looked briefly at the pg_upgrade > code and it appears to put all oids in unsigned ints. > > -- > Bruce Momjian <bruce@momjian.us> http://momjian.us > EnterpriseDB http://enterprisedb.com > > + It's impossible for everything to be true. + > > -- > Sent via pgsql-general mailing list (pgsql-general@postgresql.org) > To make changes to your subscription: > http://www.postgresql.org/mailpref/pgsql-general
Brian Hirt wrote: > It looks like it's related to atol Yep, I found the use of atol in the pg_upgrade code too. Working on a patch now. --------------------------------------------------------------------------- > $ cat test-atol.c > #include <stdlib.h> > #include <stdio.h> > > int > main(int argc, char **argv) > { > unsigned int test1; > long test2; > long long test3; > unsigned int test4; > > test1 = (unsigned int)atol("3000767169"); > test2 = (long)atol("3000767169"); > test3 = atoll("3000767169"); > test4 = (unsigned int)atoll("3000767169"); > > fprintf(stderr,"%u %ld %lld %u\n",test1,test2,test3,test4); > } > > $ make test-atol > cc test-atol.c -o test-atol > $ ./test-atol > 2147483647 2147483647 3000767169 3000767169 > > > I think C90 and C99 specify different behaviors with atol > > Is there some standard way postgresql parses integer strings? Maybe that method should be used instead of duplicatingthe functionality so at least the two behave consistently. > > --brian > > On Sep 28, 2010, at 2:00 PM, Bruce Momjian wrote: > > > Brian Hirt wrote: > >> Looks like pg_upgrade is using 32bit oids. 2147483647 is the max signed 32 bit int, but the oids for my tables areclearly larger than that. > >> > >> == output from pg_upgrade == > >> Database: basement84_dev > >> relname: mit.company: reloid: 2147483647 reltblspace: > >> relname: mit.company_history: reloid: 2147483647 reltblspace: > >> > >> == output from catalog query == > >> basement84_dev=# select c.oid,c.relname from pg_catalog.pg_namespace n, pg_catalog.pg_class c where n.oid = c.relnamespaceand n.nspname = 'mit'; > >> oid | relname > >> ------------+-------------------- > >> 3000767630 | company > >> 3000767633 | company_history > >> (22 rows) > >> > > > > Interesting. Odd it would report the max 32-bit signed int. I wonder > > if it somehow is getting set to -1. I looked briefly at the pg_upgrade > > code and it appears to put all oids in unsigned ints. > > > > -- > > Bruce Momjian <bruce@momjian.us> http://momjian.us > > EnterpriseDB http://enterprisedb.com > > > > + It's impossible for everything to be true. + > > > > -- > > Sent via pgsql-general mailing list (pgsql-general@postgresql.org) > > To make changes to your subscription: > > http://www.postgresql.org/mailpref/pgsql-general -- Bruce Momjian <bruce@momjian.us> http://momjian.us EnterpriseDB http://enterprisedb.com + It's impossible for everything to be true. +
Bruce Momjian wrote: > Brian Hirt wrote: > > It looks like it's related to atol > > Yep, I found the use of atol in the pg_upgrade code too. Working on a > patch now. I have applied the attached patch to HEAD and 9.0.X. Odd I had never received a bug report about this before. Good thing it didn't silently fail, but it is designed to be very picky. This patch will appear in the next 9.0.X release. Thanks for the report. -- Bruce Momjian <bruce@momjian.us> http://momjian.us EnterpriseDB http://enterprisedb.com + It's impossible for everything to be true. + diff --git a/contrib/pg_upgrade/controldata.c b/contrib/pg_upgrade/controldata.c index f36c2c1..c0fe821 100644 --- a/contrib/pg_upgrade/controldata.c +++ b/contrib/pg_upgrade/controldata.c @@ -155,7 +155,7 @@ get_control_data(migratorContext *ctx, ClusterInfo *cluster, bool live_check) pg_log(ctx, PG_FATAL, "%d: pg_resetxlog problem\n", __LINE__); p++; /* removing ':' char */ - cluster->controldata.ctrl_ver = (uint32) atol(p); + cluster->controldata.ctrl_ver = str2uint(p); } else if ((p = strstr(bufin, "Catalog version number:")) != NULL) { @@ -165,7 +165,7 @@ get_control_data(migratorContext *ctx, ClusterInfo *cluster, bool live_check) pg_log(ctx, PG_FATAL, "%d: controldata retrieval problem\n", __LINE__); p++; /* removing ':' char */ - cluster->controldata.cat_ver = (uint32) atol(p); + cluster->controldata.cat_ver = str2uint(p); } else if ((p = strstr(bufin, "First log file ID after reset:")) != NULL) { @@ -175,7 +175,7 @@ get_control_data(migratorContext *ctx, ClusterInfo *cluster, bool live_check) pg_log(ctx, PG_FATAL, "%d: controldata retrieval problem\n", __LINE__); p++; /* removing ':' char */ - cluster->controldata.logid = (uint32) atol(p); + cluster->controldata.logid = str2uint(p); got_log_id = true; } else if ((p = strstr(bufin, "First log file segment after reset:")) != NULL) @@ -186,7 +186,7 @@ get_control_data(migratorContext *ctx, ClusterInfo *cluster, bool live_check) pg_log(ctx, PG_FATAL, "%d: controldata retrieval problem\n", __LINE__); p++; /* removing ':' char */ - cluster->controldata.nxtlogseg = (uint32) atol(p); + cluster->controldata.nxtlogseg = str2uint(p); got_log_seg = true; } else if ((p = strstr(bufin, "Latest checkpoint's TimeLineID:")) != NULL) @@ -197,7 +197,7 @@ get_control_data(migratorContext *ctx, ClusterInfo *cluster, bool live_check) pg_log(ctx, PG_FATAL, "%d: controldata retrieval problem\n", __LINE__); p++; /* removing ':' char */ - cluster->controldata.chkpnt_tli = (uint32) atol(p); + cluster->controldata.chkpnt_tli = str2uint(p); got_tli = true; } else if ((p = strstr(bufin, "Latest checkpoint's NextXID:")) != NULL) @@ -211,7 +211,7 @@ get_control_data(migratorContext *ctx, ClusterInfo *cluster, bool live_check) pg_log(ctx, PG_FATAL, "%d: controldata retrieval problem\n", __LINE__); op++; /* removing ':' char */ - cluster->controldata.chkpnt_nxtxid = (uint32) atol(op); + cluster->controldata.chkpnt_nxtxid = str2uint(op); got_xid = true; } else if ((p = strstr(bufin, "Latest checkpoint's NextOID:")) != NULL) @@ -222,7 +222,7 @@ get_control_data(migratorContext *ctx, ClusterInfo *cluster, bool live_check) pg_log(ctx, PG_FATAL, "%d: controldata retrieval problem\n", __LINE__); p++; /* removing ':' char */ - cluster->controldata.chkpnt_nxtoid = (uint32) atol(p); + cluster->controldata.chkpnt_nxtoid = str2uint(p); got_oid = true; } else if ((p = strstr(bufin, "Maximum data alignment:")) != NULL) @@ -233,7 +233,7 @@ get_control_data(migratorContext *ctx, ClusterInfo *cluster, bool live_check) pg_log(ctx, PG_FATAL, "%d: controldata retrieval problem\n", __LINE__); p++; /* removing ':' char */ - cluster->controldata.align = (uint32) atol(p); + cluster->controldata.align = str2uint(p); got_align = true; } else if ((p = strstr(bufin, "Database block size:")) != NULL) @@ -244,7 +244,7 @@ get_control_data(migratorContext *ctx, ClusterInfo *cluster, bool live_check) pg_log(ctx, PG_FATAL, "%d: controldata retrieval problem\n", __LINE__); p++; /* removing ':' char */ - cluster->controldata.blocksz = (uint32) atol(p); + cluster->controldata.blocksz = str2uint(p); got_blocksz = true; } else if ((p = strstr(bufin, "Blocks per segment of large relation:")) != NULL) @@ -255,7 +255,7 @@ get_control_data(migratorContext *ctx, ClusterInfo *cluster, bool live_check) pg_log(ctx, PG_FATAL, "%d: controldata retrieval problem\n", __LINE__); p++; /* removing ':' char */ - cluster->controldata.largesz = (uint32) atol(p); + cluster->controldata.largesz = str2uint(p); got_largesz = true; } else if ((p = strstr(bufin, "WAL block size:")) != NULL) @@ -266,7 +266,7 @@ get_control_data(migratorContext *ctx, ClusterInfo *cluster, bool live_check) pg_log(ctx, PG_FATAL, "%d: controldata retrieval problem\n", __LINE__); p++; /* removing ':' char */ - cluster->controldata.walsz = (uint32) atol(p); + cluster->controldata.walsz = str2uint(p); got_walsz = true; } else if ((p = strstr(bufin, "Bytes per WAL segment:")) != NULL) @@ -277,7 +277,7 @@ get_control_data(migratorContext *ctx, ClusterInfo *cluster, bool live_check) pg_log(ctx, PG_FATAL, "%d: controldata retrieval problem\n", __LINE__); p++; /* removing ':' char */ - cluster->controldata.walseg = (uint32) atol(p); + cluster->controldata.walseg = str2uint(p); got_walseg = true; } else if ((p = strstr(bufin, "Maximum length of identifiers:")) != NULL) @@ -288,7 +288,7 @@ get_control_data(migratorContext *ctx, ClusterInfo *cluster, bool live_check) pg_log(ctx, PG_FATAL, "%d: controldata retrieval problem\n", __LINE__); p++; /* removing ':' char */ - cluster->controldata.ident = (uint32) atol(p); + cluster->controldata.ident = str2uint(p); got_ident = true; } else if ((p = strstr(bufin, "Maximum columns in an index:")) != NULL) @@ -299,7 +299,7 @@ get_control_data(migratorContext *ctx, ClusterInfo *cluster, bool live_check) pg_log(ctx, PG_FATAL, "%d: controldata retrieval problem\n", __LINE__); p++; /* removing ':' char */ - cluster->controldata.index = (uint32) atol(p); + cluster->controldata.index = str2uint(p); got_index = true; } else if ((p = strstr(bufin, "Maximum size of a TOAST chunk:")) != NULL) @@ -310,7 +310,7 @@ get_control_data(migratorContext *ctx, ClusterInfo *cluster, bool live_check) pg_log(ctx, PG_FATAL, "%d: controldata retrieval problem\n", __LINE__); p++; /* removing ':' char */ - cluster->controldata.toast = (uint32) atol(p); + cluster->controldata.toast = str2uint(p); got_toast = true; } else if ((p = strstr(bufin, "Date/time type storage:")) != NULL) diff --git a/contrib/pg_upgrade/info.c b/contrib/pg_upgrade/info.c index 1601d56..55489ac 100644 --- a/contrib/pg_upgrade/info.c +++ b/contrib/pg_upgrade/info.c @@ -242,7 +242,7 @@ get_db_infos(migratorContext *ctx, DbInfoArr *dbinfs_arr, Cluster whichCluster) for (tupnum = 0; tupnum < ntups; tupnum++) { - dbinfos[tupnum].db_oid = atol(PQgetvalue(res, tupnum, i_oid)); + dbinfos[tupnum].db_oid = str2uint(PQgetvalue(res, tupnum, i_oid)); snprintf(dbinfos[tupnum].db_name, sizeof(dbinfos[tupnum].db_name), "%s", PQgetvalue(res, tupnum, i_datname)); @@ -360,7 +360,7 @@ get_rel_infos(migratorContext *ctx, const DbInfo *dbinfo, RelInfo *curr = &relinfos[num_rels++]; const char *tblspace; - curr->reloid = atol(PQgetvalue(res, relnum, i_oid)); + curr->reloid = str2uint(PQgetvalue(res, relnum, i_oid)); nspname = PQgetvalue(res, relnum, i_nspname); strlcpy(curr->nspname, nspname, sizeof(curr->nspname)); @@ -368,8 +368,8 @@ get_rel_infos(migratorContext *ctx, const DbInfo *dbinfo, relname = PQgetvalue(res, relnum, i_relname); strlcpy(curr->relname, relname, sizeof(curr->relname)); - curr->relfilenode = atol(PQgetvalue(res, relnum, i_relfilenode)); - curr->toastrelid = atol(PQgetvalue(res, relnum, i_reltoastrelid)); + curr->relfilenode = str2uint(PQgetvalue(res, relnum, i_relfilenode)); + curr->toastrelid = str2uint(PQgetvalue(res, relnum, i_reltoastrelid)); tblspace = PQgetvalue(res, relnum, i_spclocation); /* if no table tablespace, use the database tablespace */ diff --git a/contrib/pg_upgrade/pg_upgrade.h b/contrib/pg_upgrade/pg_upgrade.h index a7d46cf..296b80f 100644 --- a/contrib/pg_upgrade/pg_upgrade.h +++ b/contrib/pg_upgrade/pg_upgrade.h @@ -376,6 +376,8 @@ char *pg_strdup(migratorContext *ctx, const char *s); void *pg_malloc(migratorContext *ctx, int size); void pg_free(void *ptr); const char *getErrorText(int errNum); +unsigned int str2uint(const char *str); + /* version.c */ diff --git a/contrib/pg_upgrade/relfilenode.c b/contrib/pg_upgrade/relfilenode.c index a69548b..dd605bb 100644 --- a/contrib/pg_upgrade/relfilenode.c +++ b/contrib/pg_upgrade/relfilenode.c @@ -94,9 +94,9 @@ get_pg_database_relfilenode(migratorContext *ctx, Cluster whichCluster) i_relfile = PQfnumber(res, "relfilenode"); if (whichCluster == CLUSTER_OLD) - ctx->old.pg_database_oid = atol(PQgetvalue(res, 0, i_relfile)); + ctx->old.pg_database_oid = str2uint(PQgetvalue(res, 0, i_relfile)); else - ctx->new.pg_database_oid = atol(PQgetvalue(res, 0, i_relfile)); + ctx->new.pg_database_oid = str2uint(PQgetvalue(res, 0, i_relfile)); PQclear(res); PQfinish(conn); diff --git a/contrib/pg_upgrade/util.c b/contrib/pg_upgrade/util.c index b9968e9..3f3a4c7 100644 --- a/contrib/pg_upgrade/util.c +++ b/contrib/pg_upgrade/util.c @@ -259,3 +259,15 @@ getErrorText(int errNum) #endif return strdup(strerror(errNum)); } + + +/* + * str2uint() + * + * convert string to oid + */ +unsigned int +str2uint(const char *str) +{ + return strtol(str, NULL, 10); +}
Bruce, The applied patch has the same behavior on i686 Ubuntu 10.04. It looks like atol() is just a macro for strtol() in stdio.h. I think you want strtoul() instead of strtol() when i change str2uint() to use strtoul() pg_upgrade completes without a problem (I still haven't tested the upgrade database,but I expect that will be just fine). I think it's pretty uncommon for the OID to be that big which is why nobody stumbled onto this. This particular installationhas pretty much been reloading development databases non stop for the last year. Also, people tend to initdba lot when testing and doing development which will keep resetting the oid low. Thanks for getting this one fixed --brian On Sep 28, 2010, at 3:49 PM, Bruce Momjian wrote: > I have applied the attached patch to HEAD and 9.0.X. Odd I had never > received a bug report about this before. Good thing it didn't silently > fail, but it is designed to be very picky. >
Brian Hirt wrote: > Bruce, > > The applied patch has the same behavior on i686 Ubuntu 10.04. It > looks like atol() is just a macro for strtol() in stdio.h. I think > you want strtoul() instead of strtol() Yes, thanks. I have now applied that fix in HEAD and 9.0.X. > when i change str2uint() to use strtoul() pg_upgrade completes without > a problem (I still haven't tested the upgrade database, but I expect > that will be just fine). Yep. > I think it's pretty uncommon for the OID to be that big which is why > nobody stumbled onto this. This particular installation has pretty > much been reloading development databases non stop for the last year. > Also, people tend to initdb a lot when testing and doing development > which will keep resetting the oid low. Yes, seems > 2^31 oids are rarer than I thought. -- Bruce Momjian <bruce@momjian.us> http://momjian.us EnterpriseDB http://enterprisedb.com + It's impossible for everything to be true. +