[GENERAL] upgrade 8.1.4 - latest, sort order subquery

2007-06-26 Thread jef peeraer

i decide this weekend to upgrade to the latest stable version from an
8.1.4 . Upgrade went smootly, as usual, but today, i've got some
phonecalls of something weird. The query is as follows :


registratie=# select * from module_info where type_module_id = 1;
  naam  | korte_beschrijving |  kolom_naam   |   xul_opties|
type_veld_id | lengte | is_verplicht | type_module_id
++---+-+--++--+
 alg_02 | naam   | naam  | | 


3 |  0 | f|  1
 alg_03 | voornaam   | voornamen | | 


3 |  0 | f|  1
 alg_01 | anoniem| anoniem   | | 


2 |  0 | f|  1
 cl_01  | geslacht   | geslacht  | | 


1 |  0 | t|  1
 cl_19  | geboortedatum  | geboortedatum | hide_clock,true | 


7 |  0 | f|  1
 cl_02  | leeftijd   | leeftijd  | | 


1 |  0 | t|  1
 cl_15  | origine| origine   | | 


1 |  0 | f|  1
(7 rows)


i combine this with the next query in a subquery

registratie=# select * from get_parent_type_modules(1);
NOTICE:   first query
 get_parent_type_modules
-
   1
(1 row)


The resulting query , which should return the same result as the first one

registratie=# select * from module_info where type_module_id in
(select * from get_parent_type_modules(1));
NOTICE:   first query
  naam  | korte_beschrijving |  kolom_naam   |   xul_opties|
type_veld_id | lengte | is_verplicht | type_module_id
++---+-+--++--+
 cl_15  | origine| origine   | | 


1 |  0 | f|  1
 cl_02  | leeftijd   | leeftijd  | | 


1 |  0 | t|  1
 cl_19  | geboortedatum  | geboortedatum | hide_clock,true | 


7 |  0 | f|  1
 cl_01  | geslacht   | geslacht  | | 


1 |  0 | t|  1
 alg_01 | anoniem| anoniem   | | 


2 |  0 | f|  1
 alg_03 | voornaam   | voornamen | | 


3 |  0 | f|  1
 alg_02 | naam   | naam  | | 


3 |  0 | f|  1
(7 rows)


The order is completely ignored, although there is an order by in the view
'module_info'



jef peeraer

---(end of broadcast)---
TIP 5: don't forget to increase your free space map settings


Re: [GENERAL] upgrade 8.1.4 - latest, sort order subquery

2007-06-26 Thread Richard Huxton

jef peeraer wrote:

i decide this weekend to upgrade to the latest stable version from an
8.1.4 . Upgrade went smootly, as usual, but today, i've got some
phonecalls of something weird. The query is as follows :


registratie=# select * from module_info where type_module_id = 1;



i combine this with the next query in a subquery



The resulting query , which should return the same result as the first one


Here's where I think you're wrong.


registratie=# select * from module_info where type_module_id in
(select * from get_parent_type_modules(1));



The order is completely ignored, although there is an order by in the view
'module_info'


You're applying a where clause to the output of your view - filtering it 
after the sort is done. If that filter is e.g. by a hash then the result 
will be in a different order (or at least might be).


In general, the only ORDER BY you can rely on is one applied to the 
final results of your SELECT.


--
  Richard Huxton
  Archonet Ltd

---(end of broadcast)---
TIP 3: Have you checked our extensive FAQ?

  http://www.postgresql.org/docs/faq


Re: [GENERAL] upgrade 8.1.4 - latest, sort order subquery

2007-06-26 Thread Michael Glaesemann


On Jun 26, 2007, at 14:52 , jef peeraer wrote:

The order is completely ignored, although there is an order by in  
the view

'module_info'


I don't know what has caused the change in your system, but IIRC, the  
spec does not require a view to return rows in any particular order— 
I'm not even sure the spec allows ORDER BY in a view definition.  
(Whether or not PostgreSQL follows the spec in this case is another  
matter—I don't believe it does. So there's probably something a  
little more interesting going on here that others might help you with.)


A quick, spec-compliant fix would be to add an ORDER BY clause in the  
calling query.


Other than the row order, the results look correct, or am I missing  
something?


You might also look into using a set returning function, in which you  
can specify the order of the results.


Michael Glaesemann
grzm seespotcode net




---(end of broadcast)---
TIP 4: Have you searched our list archives?

  http://archives.postgresql.org/


Re: [GENERAL] upgrade 8.1.4 - latest, sort order subquery

2007-06-26 Thread Tom Lane
Richard Huxton [EMAIL PROTECTED] writes:
 jef peeraer wrote:
 registratie=# select * from module_info where type_module_id in
 (select * from get_parent_type_modules(1));

 The order is completely ignored, although there is an order by in the view
 'module_info'

 You're applying a where clause to the output of your view - filtering it 
 after the sort is done. If that filter is e.g. by a hash then the result 
 will be in a different order (or at least might be).

Yeah, that IN-clause will in fact be turned into a join.  EXPLAIN would
give more info about what's happening, but I suspect the planner chose
to do the join via mergejoin, which would sort the inputs by the join
columns ...

regards, tom lane

---(end of broadcast)---
TIP 3: Have you checked our extensive FAQ?

   http://www.postgresql.org/docs/faq