Thread: NOW, I SEND A PATCH ; initdb & general string compares - all Pg 6.5.2,6.5.3,snapshot,RPMS, SRPMS
NOW, I SEND A PATCH ; initdb & general string compares - all Pg 6.5.2,6.5.3,snapshot,RPMS, SRPMS
From
Silvio Macedo
Date:
============================================================================ POSTGRESQL BUG REPORT TEMPLATE ============================================================================ Your name : Silvio Macedo Your email address : smacedo@ic.ac.uk (or smacedo@inescn.pt) System Configuration --------------------- Architecture (example: Intel Pentium) : Sun Ultrasparc 1 (143Mhz, 2.1 Gb disk, 64Mb RAM) Operating System (example: Linux 2.0.26 ELF) : Linux 2.2.12 ELF, (RH6.1) PostgreSQL version (example: PostgreSQL-6.5.3): PostgreSQL-6.5.3/2/SNAP Compiler used (example: gcc 2.8.0) : gcc version egcs-2.91.66 19990314/Linux (egcs-1.1.2 release) (comes with RH6.1) GNUlibc 2.1.2 Please enter a FULL description of your problem: ------------------------------------------------ In 64 bit machines like the Ultraparc, strncmp can return -256. In src/backend/utils/adt/name.c you do: return (bool) strncmp(arg1->data, arg2->data, NAMEDATALEN) == 0; In this way you are casting strncmp to bool, and not the comparison. This is the description of the consequences, that I sent before I discovered the problem: (I am giving a really detailed description to maximize the chances that you find the solution to my problem) I have installed postgres many times in several Linux/Intel systems. Now, I am trying to install Pg 6.5.3 ( or any other version of Pg) in a Linux/(ultra)Sparc system. The system seems stable in any task other than postgres stuff, but when I run initdb, it always dies with and error about : "Attribute 'aggtransfn1' is repeated." I have downloaded source distribution PG 6.5.3, PG Snapshot, PG 6.5.2 and RPM binaries of Pg from RedHat 6.1 distribution and even SRPMS. In all of them, after compiling and/or installing, when I do the initdb -d, the script dies with this message: > <aggname name> <aggowner int4> <aggtransfn1 regproc> <aggtransfn2 regproc> <aggfinalfn regproc> <aggbasetype oid> <aggtranstype1 oid> <aggtranstype2 oid> <aggfinaltype oid> <agginitval1 text> <agginitval2 text> > ERROR: Attribute 'aggtransfn1' is repeated ERROR: Attribute 'aggtransfn1' is repeated initdb: could not create template database initdb: cleaning up by wiping out /usr/local/pgsql/data/base/template1 I have also tried initdb with the full command line, etc.. This happens with all the versions of Pg that I have tested: Pg Snapshot 22 Nov Pg 6.5.3, Pg 6.5.2, Binaries in RPM from RedHat 6.1 Sparc Source SRPM from '' '' Then, I investigated the problem deeper, and deeper. If I remove aggtransfn2 from the local1.????.bki.source, it gives the same error in agginitval2. I replaced the ERROR with a NOTICE on the elog on the file src/backend/catalog/heap.c in the function CheckAttributeNames() and everything went ok until I started regression tests. Lots of 'failed' appeared in the char/string related tests, and those were real problems, because I checked it myself (not just little differences); the backend closed connection in some tests. I then added some lines in the src/backend/catalog/heap.c to see if the strings were read ok and if NAMEDATALEN was ok. Yes, they were. aggtransfn1 was compared to aggransfn2 by a call to nameeq(), and this function returned that they were equal (obviously they differ on the last character). Then, finally I replaced the call to nameeq to a direct strncmp() between both tuple->data's and it worked. The regression tests still failed. Maybe there is a problem in the strncmp libraries in my system ? oh no... [PS: The source of this problem as I wrote above, is in Postgres name.c file, in nameeq() ] Please describe a way to repeat the problem. Please try to provide a concise reproducible example, if at all possible: ---------------------------------------------------------------------- configure --with-x --with-tcl --with-template=linux_sparc make make install cd /usr/local/pgsql initdb If you know how this problem might be fixed, list the solution below: --------------------------------------------------------------------- I send both diff -f and diff -u in attach --- postgresql-6.5.3/src/backend/utils/adt/name.c Mon Aug 2 06:24:55 1999 +++ postgresql-6.5.3.my/src/backend/utils/adt/name.c Thu Nov 25 11:53:39 1999 @@ -87,7 +87,7 @@ if (!arg1 || !arg2) return 0; else - return (bool) strncmp(arg1->data, arg2->data, NAMEDATALEN) == 0; + return (bool) (strncmp(arg1->data, arg2->data, NAMEDATALEN) == 0); } bool ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, `````````````````````````````````````````````````````````````````````````` Silvio Emanuel Nunes Barbosa de Macedo smacedo@ic.ac.uk smacedo@inescn.pt Imperial College, University of London INESC Porto Intelligent and Interactive Systems Telecom. and Multimedia Exhibition Road, Pc da Republica, 93 London SW7 2AZ, England 4050-497 PORTO PORTUGAL Tel:+44 171 5946323 Tel:+351 22 2094220