Обсуждение: Possible bug?
Hello,
I saw this 'bug' reported in the Firebird SourceForge website for the
Firebird 1.0 server. They confirmed it as a bug! I tried it in PostgreSQL
7.2 (I know its an old release but I do not have a newer version installed,
and in any case I am only using the server for reserach purposes).
PostgreSQL returns no rows for either of the queries. Of course this is the
case since the attributes F1 and F2 of Table T1 are of type Char whereas
the select query is making the test with an integer value. Is this the
intended behaviour?
Firebird returns 0 rows for the first query and 1 row (values 3,3) for the
second query. I also tried it in Oracle 8.0.5 which returns 1 row for each
of the two queries. Therefore I have different results being returned from
all three servers.
Reproducible script:
CREATE TABLE T1 (F1 CHAR(4), F2 CHAR(4));
CREATE INDEX T1_F1 ON T1 (F1);
INSERT INTO T1 (F1, F2) VALUES ('001', '001');
INSERT INTO T1 (F1, F2) VALUES ('002', '002');
INSERT INTO T1 (F1, F2) VALUES ('003', '003');
INSERT INTO T1 (F1, F2) VALUES ('004', '004');
SELECT * FROM T1 WHERE F1 = 3;
F1 F2
---- ----
SELECT * FROM T1 WHERE F2 = 3;
F1 F2
---- ----
Best regards,
Ilir
--
____________________________________________
Ilir Gashi
PhD Student
Centre for Software Reliability
City University
Northampton Square, London EC1V 0HB
Tel: +44 20 7040 0273
Fax: +44 20 7040 8585
email: i.gashi@city.ac.uk
website: http://www.csr.city.ac.uk/csr_city/staff/gashi/
____________________________________________
On Thu, 1 Jul 2004, Ilir Gashi wrote: > I saw this 'bug' reported in the Firebird SourceForge website for the > Firebird 1.0 server. They confirmed it as a bug! I tried it in PostgreSQL > 7.2 (I know its an old release but I do not have a newer version installed, > and in any case I am only using the server for reserach purposes). > PostgreSQL returns no rows for either of the queries. Of course this is the > case since the attributes F1 and F2 of Table T1 are of type Char whereas > the select query is making the test with an integer value. Is this the > intended behaviour? Technically speaking, I believe the queries are simply invalid without the presence of casts from the spec's standpoint. Theoretically, I'd either expect both to give 0 rows (convert 3 into a string and compare) or both to give 1 row (convert '003' to an integer and compare) if it didn't error. What does Oracle do if you insert a value like 'XXX' into the column?
Stephan Szabo <sszabo@megazone.bigpanda.com> writes:
> Technically speaking, I believe the queries are simply invalid without the
> presence of casts from the spec's standpoint.
Right. The reason PG doesn't error is that we have an implicit cast
from integer to text. I've opined before that we should mark most
cross-type-category casts as explicit-only ... they are just too prone
to give unexpected answers, as in this case.
It's interesting that Oracle seems to be converting text to integer
instead of vice versa. Or maybe they have some truly bizarre string
comparison operation that ignores leading '0'? Whatever they are
doing, there's no support for it in the spec.
regards, tom lane
On Jul 1 2004, Stephan Szabo wrote:
> Technically speaking, I believe the queries are simply invalid without the
> presence of casts from the spec's standpoint.
>
> Theoretically, I'd either expect both to give 0 rows (convert 3 into a
> string and compare) or both to give 1 row (convert '003' to an integer and
> compare) if it didn't error.
>
> What does Oracle do if you insert a value like 'XXX' into the column?
>
Below is the behaviour of Oracle 8.0.5 for the value 'XXX'
CREATE TABLE T1 (F1 CHAR(4), F2 CHAR(4));
CREATE INDEX T1_F1 ON T1 (F1);
INSERT INTO T1 (F1, F2) VALUES ('001', '001');
INSERT INTO T1 (F1, F2) VALUES ('002', '002');
INSERT INTO T1 (F1, F2) VALUES ('XXX', '003');
INSERT INTO T1 (F1, F2) VALUES ('004', '004');
SELECT * FROM T1 WHERE F1 = 3;
ORA-01722: invalid number
SELECT * FROM T1 WHERE F2 = 3;
F1 F2
---- ----
XXX 003
1 row selected.
So, yes Oracle is doing a char to integer implicit conversion and
performing an integer with integer comparison.
Thanks for the quick response.
(BTW I appologise for my last report being posted twice. I was not a member
of PGSQL-bugs list when I posted the first one, and since it was taking a
while for it to be approved, I decied to join the list and then post it
again.)
Best regards,
Ilir
--
____________________________________________
Ilir Gashi
PhD Student
Centre for Software Reliability
City University
Northampton Square, London EC1V 0HB
email: i.gashi@city.ac.uk
website: http://www.csr.city.ac.uk/csr_city/staff/gashi/
____________________________________________
Am Donnerstag, 1. Juli 2004 23:10 schrieb Tom Lane: > Right. The reason PG doesn't error is that we have an implicit cast > from integer to text. I've opined before that we should mark most > cross-type-category casts as explicit-only ... they are just too prone > to give unexpected answers, as in this case. It seems we're just opining in circles. Why not do it? Is anyone objecting?
Peter Eisentraut <peter_e@gmx.net> writes:
> Am Donnerstag, 1. Juli 2004 23:10 schrieb Tom Lane:
>> Right. The reason PG doesn't error is that we have an implicit cast
>> from integer to text. I've opined before that we should mark most
>> cross-type-category casts as explicit-only ... they are just too prone
>> to give unexpected answers, as in this case.
> It seems we're just opining in circles. Why not do it? Is anyone objecting?
IIRC there were objections the last time it was seriously proposed,
basically of the form "but that will break my application which relies
on writing so-and-so without a cast". We did get as far as removing all
the implicit cross-category coercions except these casts to text:
bigint | text
smallint | text
integer | text
real | text
double precision | text
numeric | text
oid | text
date | text
time without time zone | text
time with time zone | text
timestamp without time zone | text
timestamp with time zone | text
interval | text
but these seem to have a constituency :-(
regards, tom lane
On Fri, Jul 02, 2004 at 10:27:35 -0400, Tom Lane <tgl@sss.pgh.pa.us> wrote: > > IIRC there were objections the last time it was seriously proposed, > basically of the form "but that will break my application which relies > on writing so-and-so without a cast". We did get as far as removing all > the implicit cross-category coercions except these casts to text: > > bigint | text > smallint | text > integer | text > real | text > double precision | text > numeric | text > oid | text > date | text > time without time zone | text > time with time zone | text > timestamp without time zone | text > timestamp with time zone | text > interval | text > > but these seem to have a constituency :-( I think it is reasoable to expect people to use an explicit cast when doing these conversions. These are not conversions that you would normally want to do. And even if you do, you need to be very concerned about how the converted text looks for different ranges of source data values. Allowing these makes it harder to notice mistakes. And I expect that overall the hiding mistakes case occurs a lot more than the I meant to do that but didn't want to type ::text case.
Bruno Wolff III <bruno@wolff.to> writes:
> Tom Lane <tgl@sss.pgh.pa.us> wrote:
>> but these seem to have a constituency :-(
> I think it is reasoable to expect people to use an explicit cast when
> doing these conversions.
That's what I think, but I lost the argument last time round...
I think it would be easier to sell making these changes as part of
a move that creates non-implicit casts to/from text for *all* datatypes
(implemented on top of their I/O routines). So I don't plan on making
the proposal again until I or somebody else have time to write some
infrastructure for that.
regards, tom lane