Thread: Re: [SQL] Wierd stuff

Re: [SQL] Wierd stuff

From
Mario Jorge Nunes Filipe
Date:
Mario Jorge Nunes Filipe wrote:
> 
> Hi
> 
> I'm developing a system with a large number of tables.
> 
> One of the tables has (among others) the following fields:
> Table    = aluno
> +----------------------------------+---------------------------------
> |              Field               |              Type
> +----------------------------------+---------------------------------
> | numero_aluno                     | int4
> | freguesia_naturalidade           | int2
> | concelho_naturalidade            | int2
> | nacionalidade                    | int2
> 
> another is like this:
> 
> -- Table    = concelho
> +----------------------------------+---------------------------------
> |              Field               |              Type
> +----------------------------------+---------------------------------
> | codigo                           | int4
> | nome                             | text
> 
> The field "concelho_naturalidade" on the first table has values taken
> from the "codigo" field from the second.
> 
> Now comes the problem:
> 
> When i do :
> sac=> select a.numero_aluno, a.concelho_naturalidade from aluno a where
> a.numero_aluno=13792;
> 
> i get:
> 
> numero_aluno|concelho_naturalidade
> ------------+---------------------
>        13792|                 1006
> (1 row)
> 
> and whith:
> sac=> select * from concelho where codigo=1006;
> 
> i get:
> 
> codigo|nome
> ------+----------------
>   1006|CALDAS DA RAINHA
> (1 row)
> 
> but with:
> sac=> select c.nome from aluno a, concelho c where
> a.concelho_naturalidade=c.codigo and a.numero_aluno=13792;
> 
> i get:
> 
> nome
> ----
> (0 rows)
> 
> If my SQL is worth anything I thought it would reply "Caldas da Rainha".
> What is wrong here?
And now... even wierder (?):

sac=> select a.numero_aluno, a.concelho_naturalidade from aluno a
sac-> where
sac-> a.numero_aluno=15897;
numero_aluno|concelho_naturalidade
------------+---------------------      15897|                    0
(1 row)

sac=> select * from concelho where codigo=0;  
codigo|nome       
------+-----------    0|A Preencher
(1 row)

sac=> select c.nome from aluno a, concelho c where
sac-> a.concelho_naturalidade=c.codigo and a.numero_aluno=15897;
nome       
-----------
A Preencher
(1 row)
this is the expected output... the first one isn't. So does anyone have
a clue on what's going on?
This is not particularly critical has i can change the third query fro
the first two, only it becomes very inneficient.
Thanks
--        Mario Filipe        mjnf@uevora.pt       http://neptuno.sc.uevora.pt/~mjnf


Re: [SQL] Wierd stuff

From
wieck@debis.com (Jan Wieck)
Date:
Mario Filipe wrote:

> > I'm developing a system with a large number of tables.
> >
> > One of the tables has (among others) the following fields:
> > Table    = aluno
> > +----------------------------------+---------------------------------
> > |              Field               |              Type
> > +----------------------------------+---------------------------------
> > | numero_aluno                     | int4
> > | freguesia_naturalidade           | int2
> > | concelho_naturalidade            | int2
> > | nacionalidade                    | int2
> >
> > another is like this:
> >
> > -- Table    = concelho
> > +----------------------------------+---------------------------------
> > |              Field               |              Type
> > +----------------------------------+---------------------------------
> > | codigo                           | int4
> > | nome                             | text
> >
> > The field "concelho_naturalidade" on the first table has values taken
> > from the "codigo" field from the second.


    First  of  all,  why  aren't  the two fields of the same data
    type? Shouldn't cause your problem,  but  it's  bad  database
    design anyway IMHO.

> > Now comes the problem:
> > [...]
>
>    And now... even wierder (?):
> [...]
>
>    this is the expected output... the first one isn't. So does anyone have
> a clue on what's going on?

    IIRC,  corrupted indices can cause this type of misbehaviour.
    If you have any indices defined on the  two  tables,  try  to
    drop and recreate them.


Jan

--

#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me.                                  #
#========================================= wieck@debis.com (Jan Wieck) #

Re: [SQL] Wierd stuff

From
Mario Jorge Nunes Filipe
Date:
Jan Wieck wrote:
> 
> Mario Filipe wrote:
> 
> > > I'm developing a system with a large number of tables.
> > >
> > > One of the tables has (among others) the following fields:
> > > Table    = aluno
> > > +----------------------------------+---------------------------------
> > > |              Field               |              Type
> > > +----------------------------------+---------------------------------
> > > | numero_aluno                     | int4
> > > | freguesia_naturalidade           | int2
> > > | concelho_naturalidade            | int2
> > > | nacionalidade                    | int2
> > >
> > > another is like this:
> > >
> > > -- Table    = concelho
> > > +----------------------------------+---------------------------------
> > > |              Field               |              Type
> > > +----------------------------------+---------------------------------
> > > | codigo                           | int4
> > > | nome                             | text
> > >
> > > The field "concelho_naturalidade" on the first table has values taken
> > > from the "codigo" field from the second.
> 
>     First  of  all,  why  aren't  the two fields of the same data
>     type? Shouldn't cause your problem,  but  it's  bad  database
>     design anyway IMHO.
Uhmmm! I could try a reasonable reason here but i can't find one... It
will be fixed!
> > > Now comes the problem:
> > > [...]
> >
> >    And now... even wierder (?):
> > [...]
> >
> >    this is the expected output... the first one isn't. So does anyone have
> > a clue on what's going on?
> 
>     IIRC,  corrupted indices can cause this type of misbehaviour.
>     If you have any indices defined on the  two  tables,  try  to
>     drop and recreate them.
I'll try this one out. Thanks

--        Mario Filipe        mjnf@uevora.pt       http://neptuno.sc.uevora.pt/~mjnf


Re: [SQL] Wierd stuff

From
Mario Jorge Nunes Filipe
Date:
Jan Wieck wrote:
>     IIRC,  corrupted indices can cause this type of misbehaviour.
>     If you have any indices defined on the  two  tables,  try  to
>     drop and recreate them.
It didn't sove the problem... any more hints are welcomed...


--        Mario Filipe        mjnf@uevora.pt       http://neptuno.sc.uevora.pt/~mjnf


Re: [SQL] Wierd stuff

From
Tom Lane
Date:
wieck@debis.com (Jan Wieck) writes:
> Mario Filipe wrote:
>>>> | concelho_naturalidade            | int2
>>>> ...
>>>> | codigo                           | int4
>>>> 
>>>> The field "concelho_naturalidade" on the first table has values taken
>>>> from the "codigo" field from the second.

>     First  of  all,  why  aren't  the two fields of the same data
>     type? Shouldn't cause your problem,  but  it's  bad  database
>     design anyway IMHO.

Actually, I think that this may indeed be the root of the problem.
I killed several bugs in cross-data-type joins a while back ... for
example, IIRC pre-6.5 Postgres thought it could use hash joins for
cross-data-type equality operators, but that doesn't work properly in
general.  Mario, what does EXPLAIN show about how the join query is
being done?

If I'm right about this, then upgrading to 6.5.* should fix the problem.
        regards, tom lane


Re: [SQL] Wierd stuff

From
Mario Jorge Nunes Filipe
Date:
Tom Lane wrote:
> Actually, I think that this may indeed be the root of the problem.
> I killed several bugs in cross-data-type joins a while back ... for
> example, IIRC pre-6.5 Postgres thought it could use hash joins for
> cross-data-type equality operators, but that doesn't work properly in
> general.  Mario, what does EXPLAIN show about how the join query is
> being done?
First of all: sorry for the late reply, but with the weekend and all...
To awnser your question... EXPLAIN shows this:
sac=> explain select c.nome from aluno a, concelho c where
sac-> a.concelho_naturalidade=c.codigo and a.numero_aluno=13792;
NOTICE:  QUERY PLAN:

Hash Join  (cost=27.44 size=164 width=18) ->  Seq Scan on c  (cost=13.16 size=308 width=16) ->  Hash  (cost=0.00 size=0
width=0)      ->  Index Scan on a  (cost=2.05 size=2 width=2)
 

EXPLAIN
Upgrading at this point might be complicated, but sooner or later i
will have to upgrade...

--        Mario Filipe        mjnf@uevora.pt       http://neptuno.sc.uevora.pt/~mjnf


Re: [SQL] Wierd stuff

From
Tom Lane
Date:
Mario Jorge Nunes Filipe <mjnf@neptuno.sc.uevora.pt> writes:
> Tom Lane wrote:
>> Actually, I think that this may indeed be the root of the problem.
>> I killed several bugs in cross-data-type joins a while back ... for
>> example, IIRC pre-6.5 Postgres thought it could use hash joins for
>> cross-data-type equality operators, but that doesn't work properly in
>> general.  Mario, what does EXPLAIN show about how the join query is
>> being done?

>     To awnser your question... EXPLAIN shows this:
> sac=> explain select c.nome from aluno a, concelho c where
> sac-> a.concelho_naturalidade=c.codigo and a.numero_aluno=13792;
> NOTICE:  QUERY PLAN:

> Hash Join  (cost=27.44 size=164 width=18)
>  -> Seq Scan on c  (cost=13.16 size=308 width=16)
>    -> Hash  (cost=0.00 size=0 width=0)
>      -> Index Scan on a  (cost=2.05 size=2 width=2)

Yup, that's what I suspected.  Hashing 2-byte and 4-byte integers
doesn't deliver the same result --- at least not all the time, there
are special cases such as zero.  So this explains all your observed
misbehaviors.

You can work around it for now by remaking the tables with consistent
data types.
        regards, tom lane


Re: [SQL] Wierd stuff

From
Mario Jorge Nunes Filipe
Date:
Tom Lane wrote:
> Yup, that's what I suspected.  Hashing 2-byte and 4-byte integers
> doesn't deliver the same result --- at least not all the time, there
> are special cases such as zero.  So this explains all your observed
> misbehaviors.
> 
> You can work around it for now by remaking the tables with consistent
> data types.
OK! Thanks...
--        Mario Filipe        mjnf@uevora.pt       http://neptuno.sc.uevora.pt/~mjnf