bug 649665 rows count and UNION
This commit is contained in:
@@ -7,7 +7,8 @@ $Source$
|
|||||||
|
|
||||||
2003-07-08 Marc Delisle <lem9@users.sourceforge.net>
|
2003-07-08 Marc Delisle <lem9@users.sourceforge.net>
|
||||||
* libraries/sqlparser.lib.php3, sql.php3: bug 762213,
|
* libraries/sqlparser.lib.php3, sql.php3: bug 762213,
|
||||||
incorrect row count for MySQL 4.1 subqueries
|
incorrect row count for MySQL 4.1 subqueries;
|
||||||
|
bug 649665, incorrect row count for UNIONs
|
||||||
|
|
||||||
2003-07-08 Michal Cihar <nijel@users.sourceforge.net>
|
2003-07-08 Michal Cihar <nijel@users.sourceforge.net>
|
||||||
* config.inc.php3, tbl_properties_operations.php3,
|
* config.inc.php3, tbl_properties_operations.php3,
|
||||||
|
@@ -713,6 +713,7 @@ if (!defined('PMA_SQP_LIB_INCLUDED')) {
|
|||||||
* ['queryflags']['need_confirm'] = 1; if the query needs confirmation
|
* ['queryflags']['need_confirm'] = 1; if the query needs confirmation
|
||||||
* ['queryflags']['select_from'] = 1; if this is a real SELECT...FROM
|
* ['queryflags']['select_from'] = 1; if this is a real SELECT...FROM
|
||||||
* ['queryflags']['distinct'] = 1; for a DISTINCT
|
* ['queryflags']['distinct'] = 1; for a DISTINCT
|
||||||
|
* ['queryflags']['union'] = 1; for a UNION
|
||||||
*
|
*
|
||||||
* lem9: query clauses
|
* lem9: query clauses
|
||||||
* -------------
|
* -------------
|
||||||
@@ -1230,6 +1231,10 @@ if (!defined('PMA_SQP_LIB_INCLUDED')) {
|
|||||||
$subresult['queryflags']['distinct'] = 1;
|
$subresult['queryflags']['distinct'] = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($upper_data == 'UNION') {
|
||||||
|
$subresult['queryflags']['union'] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
// if this is a real SELECT...FROM
|
// if this is a real SELECT...FROM
|
||||||
if ($upper_data == 'FROM' && isset($subresult['queryflags']['select_from']) && $subresult['queryflags']['select_from'] == 1) {
|
if ($upper_data == 'FROM' && isset($subresult['queryflags']['select_from']) && $subresult['queryflags']['select_from'] == 1) {
|
||||||
$in_from = TRUE;
|
$in_from = TRUE;
|
||||||
@@ -1475,12 +1480,16 @@ if (!defined('PMA_SQP_LIB_INCLUDED')) {
|
|||||||
* Formats SQL queries to html
|
* Formats SQL queries to html
|
||||||
*
|
*
|
||||||
* @param array The SQL queries
|
* @param array The SQL queries
|
||||||
|
* @param string mode
|
||||||
|
* @param integer starting token
|
||||||
|
* @param integer number of tokens to format, -1 = all
|
||||||
*
|
*
|
||||||
* @return string The formatted SQL queries
|
* @return string The formatted SQL queries
|
||||||
*
|
*
|
||||||
* @access public
|
* @access public
|
||||||
*/
|
*/
|
||||||
function PMA_SQP_formatHtml($arr, $mode='color', $start_token=0)
|
function PMA_SQP_formatHtml($arr, $mode='color', $start_token=0,
|
||||||
|
$number_of_tokens=-1)
|
||||||
{
|
{
|
||||||
// first check for the SQL parser having hit an error
|
// first check for the SQL parser having hit an error
|
||||||
if (PMA_SQP_isError()) {
|
if (PMA_SQP_isError()) {
|
||||||
@@ -1560,7 +1569,11 @@ if (!defined('PMA_SQP_LIB_INCLUDED')) {
|
|||||||
);
|
);
|
||||||
$keywords_priv_list_cnt = 2;
|
$keywords_priv_list_cnt = 2;
|
||||||
|
|
||||||
$arraysize = $arr['len'];
|
if ($number_of_tokens == -1) {
|
||||||
|
$arraysize = $arr['len'];
|
||||||
|
} else {
|
||||||
|
$arraysize = $number_of_tokens;
|
||||||
|
}
|
||||||
$typearr = array();
|
$typearr = array();
|
||||||
if ($arraysize >= 0) {
|
if ($arraysize >= 0) {
|
||||||
$typearr[0] = '';
|
$typearr[0] = '';
|
||||||
|
24
sql.php3
24
sql.php3
@@ -355,7 +355,9 @@ else {
|
|||||||
// because SQL_CALC_FOUND_ROWS
|
// because SQL_CALC_FOUND_ROWS
|
||||||
// is not quick on large InnoDB tables
|
// is not quick on large InnoDB tables
|
||||||
|
|
||||||
if (!$is_group && !isset($analyzed_sql[0]['table_ref'][1]['table_name'])
|
if (!$is_group
|
||||||
|
&& !isset($analyzed_sql[0]['queryflags']['union'])
|
||||||
|
&& !isset($analyzed_sql[0]['table_ref'][1]['table_name'])
|
||||||
&& (empty($analyzed_sql[0]['where_clause'])
|
&& (empty($analyzed_sql[0]['where_clause'])
|
||||||
|| $analyzed_sql[0]['where_clause'] == '1 ')) {
|
|| $analyzed_sql[0]['where_clause'] == '1 ')) {
|
||||||
|
|
||||||
@@ -373,9 +375,6 @@ else {
|
|||||||
|
|
||||||
$count_query = 'SELECT COUNT(' . $count_what . ') AS count';
|
$count_query = 'SELECT COUNT(' . $count_what . ') AS count';
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
$count_query = 'SELECT SQL_CALC_FOUND_ROWS ';
|
|
||||||
}
|
|
||||||
|
|
||||||
// add the remaining of select expression if there is
|
// add the remaining of select expression if there is
|
||||||
// a GROUP BY or HAVING clause
|
// a GROUP BY or HAVING clause
|
||||||
@@ -386,13 +385,22 @@ else {
|
|||||||
$count_query .= ' ,' . $analyzed_sql[0]['select_expr_clause'];
|
$count_query .= ' ,' . $analyzed_sql[0]['select_expr_clause'];
|
||||||
}
|
}
|
||||||
|
|
||||||
// add select expression after the SQL_CALC_FOUND_ROWS
|
|
||||||
if (PMA_MYSQL_INT_VERSION >= 40000) {
|
if (PMA_MYSQL_INT_VERSION >= 40000) {
|
||||||
|
// add select expression after the SQL_CALC_FOUND_ROWS
|
||||||
// if (eregi('DISTINCT(.*)', $sql_query)) {
|
// if (eregi('DISTINCT(.*)', $sql_query)) {
|
||||||
// $count_query .= 'DISTINCT ' . $analyzed_sql[0]['select_expr_clause'];
|
// $count_query .= 'DISTINCT ' . $analyzed_sql[0]['select_expr_clause'];
|
||||||
// } else {
|
// } else {
|
||||||
//$count_query .= $analyzed_sql[0]['select_expr_clause'];
|
//$count_query .= $analyzed_sql[0]['select_expr_clause'];
|
||||||
|
|
||||||
|
// for UNION, just adding SQL_CALC_FOUND_ROWS
|
||||||
|
// after the first SELECT works.
|
||||||
|
|
||||||
|
// take the left part, could be:
|
||||||
|
// SELECT
|
||||||
|
// (SELECT
|
||||||
|
$count_query = PMA_SQP_formatHtml($parsed_sql, 'query_only', 0, $analyzed_sql[0]['position_of_first_select'] + 1);
|
||||||
|
$count_query .= ' SQL_CALC_FOUND_ROWS ';
|
||||||
|
|
||||||
// add everything that was after the first SELECT
|
// add everything that was after the first SELECT
|
||||||
$count_query .= PMA_SQP_formatHtml($parsed_sql, 'query_only', $analyzed_sql[0]['position_of_first_select']+1);
|
$count_query .= PMA_SQP_formatHtml($parsed_sql, 'query_only', $analyzed_sql[0]['position_of_first_select']+1);
|
||||||
// }
|
// }
|
||||||
@@ -414,13 +422,15 @@ else {
|
|||||||
|
|
||||||
// if using SQL_CALC_FOUND_ROWS, add a LIMIT to avoid
|
// if using SQL_CALC_FOUND_ROWS, add a LIMIT to avoid
|
||||||
// long delays. Returned count will be complete anyway.
|
// long delays. Returned count will be complete anyway.
|
||||||
|
// (but a LIMIT would disrupt results in an UNION)
|
||||||
|
|
||||||
if (PMA_MYSQL_INT_VERSION >= 40000) {
|
if (PMA_MYSQL_INT_VERSION >= 40000
|
||||||
|
&& !isset($analyzed_sql[0]['queryflags']['union'])) {
|
||||||
$count_query .= ' LIMIT 1';
|
$count_query .= ' LIMIT 1';
|
||||||
}
|
}
|
||||||
|
|
||||||
// run the count query
|
// run the count query
|
||||||
//echo "trace cq=" . $count_query . "<br/>";
|
//DEBUG echo "trace cq=" . $count_query . "<br/>";
|
||||||
|
|
||||||
if (PMA_MYSQL_INT_VERSION < 40000) {
|
if (PMA_MYSQL_INT_VERSION < 40000) {
|
||||||
if ($cnt_all_result = PMA_mysql_query($count_query)) {
|
if ($cnt_all_result = PMA_mysql_query($count_query)) {
|
||||||
|
Reference in New Issue
Block a user