Permalink
Browse files

merge r10430 from branch 2.2 to trunk

bug 1818 fixed: fix "select distinct" queries for PostgreSQL. Patch by leloupv



git-svn-id: http://piwigo.org/svn/trunk@10431 68402e56-0260-453c-a942-63ccdbb3a9ee
  • Loading branch information...
plegall committed Apr 16, 2011
1 parent 08a875b commit 562f391c70a369b96b418868bbdfc34b426c1d2b
Showing with 72 additions and 1 deletion.
  1. +72 −1 include/dblayer/functions_pgsql.inc.php
@@ -91,7 +91,8 @@ function pwg_query($query)
{
global $conf,$page,$debug,$t2;
$replace_pattern = '`REPLACE INTO\s(\S*)\s*([^)]*\))\s*VALUES\(([^,]*),(.*)\)\s*`mi';
$replace_pattern = '`REPLACE INTO\s(\S*)\s*([^)]*\))\s*VALUES\(([^,]*),(.*)\)\s*`mi';
$select_distinct_pattern = '/SELECT\s+DISTINCT\s*(\S[^;]*\S)\s*(FROM[^(;]+WHERE[^;]+)\s+ORDER\s+BY\s+([^;]*\S)\s*;?/i';
$start = get_moment();
@@ -117,6 +118,76 @@ function pwg_query($query)
}
( $result = pg_query($query)) or die($query."\n<br>".pg_last_error());
}
elseif (preg_match($select_distinct_pattern, $query, $matches))
{
$select_fields_string='';
$distinct_fields_string='';
$orderby_fields_string='';
foreach (preg_split( '/\s*,\s*/', $matches[1]) as $field)
{
$split_field = preg_split( '/\s*AS\s*/i', $field);
if (isset($split_field[1]))
{
$distinct_fields[ $split_field[1] ] = $field;
}
else
{
$distinct_fields[ $field ] = $field;
}
}
foreach (preg_split( '/\s*,\s*/', $matches[3]) as $field)
{
$kv = preg_split( '/\s+/', $field );
$orderby_fields[ $kv[0] ] = $kv[1];
}
foreach ($distinct_fields as $as_field => $field)
{
if ($distinct_fields_string)
{
$distinct_fields_string=$distinct_fields_string.', ';
}
$distinct_fields_string=$distinct_fields_string.$as_field;
if ($select_fields_string)
{
$select_fields_string=$select_fields_string.', ';
}
$select_fields_string=$select_fields_string.$field;
if ($orderby_fields_string)
{
$orderby_fields_string=$orderby_fields_string.', ';
}
$orderby_fields_string=$orderby_fields_string.$as_field.' ';
if (isset($orderby_fields[$as_field]))
{
$orderby_fields_string=$orderby_fields_string.$orderby_fields[$as_field];
unset($orderby_fields[$as_field]);
}
else
{
$orderby_fields_string=$orderby_fields_string.'ASC';
}
}
foreach ($orderby_fields as $field => $order)
{
$orderby_fields_string=$orderby_fields_string.', '.$field.' '.$order;
}
$query = '
SELECT DISTINCT ON ('.$distinct_fields_string.') '.$select_fields_string.'
'.$matches[2].'
ORDER BY '.$orderby_fields_string;
($result = pg_query($query)) or die($query."\n<br>".pg_last_error());
}
else
{
($result = pg_query($query)) or die($query."\n<br>".pg_last_error());

0 comments on commit 562f391

Please sign in to comment.