diff --git a/ChangeLog b/ChangeLog index 912396467..ddeee14a6 100755 --- a/ChangeLog +++ b/ChangeLog @@ -10,6 +10,9 @@ $Source$ (bug #990330). * libraries/display_export.lib.php: Display SQL export after saving file on server (bug #989657). + * tbl_properties_export.php: In case we don't need to reconstruct complete + query just drop LIMIT part (workaround for bug #955175 and should fix + bug #990724). 2004-07-15 Marc Delisle * tbl_change.php: bug 990959, undefined index for DATETIME diff --git a/tbl_properties_export.php b/tbl_properties_export.php index ec08e6df5..6b3357a54 100644 --- a/tbl_properties_export.php +++ b/tbl_properties_export.php @@ -14,45 +14,87 @@ require('./tbl_properties_table_info.php'); $key) { - $sql_query .= $conj . '( ' . $key . ' ) '; - $conj = 'OR '; + // Yes => rebuild query from scracts, this doesn't work with nested + // selects :-( + $analyzed_sql = PMA_SQP_analyze($parsed_sql); + $sql_query = 'SELECT '; + + if (isset($analyzed_sql[0]['queryflags']['distinct'])) { + $sql_query .= ' DISTINCT '; + } + + $sql_query .= $analyzed_sql[0]['select_expr_clause']; + + if (!empty($analyzed_sql[0]['from_clause'])) { + $sql_query .= ' FROM ' . $analyzed_sql[0]['from_clause']; + } + if (isset($primary_key)) { + $sql_query .= ' WHERE '; + $conj = ''; + foreach ($primary_key AS $i => $key) { + $sql_query .= $conj . '( ' . $key . ' ) '; + $conj = 'OR '; + } + } elseif (!empty($analyzed_sql[0]['where_clause'])) { + $sql_query .= ' WHERE ' . $analyzed_sql[0]['where_clause']; + } + if (!empty($analyzed_sql[0]['group_by_clause'])) { + $sql_query .= ' GROUP BY ' . $analyzed_sql[0]['group_by_clause']; + } + if (!empty($analyzed_sql[0]['having_clause'])) { + $sql_query .= ' HAVING ' . $analyzed_sql[0]['having_clause']; + } + if (!empty($analyzed_sql[0]['order_by_clause'])) { + $sql_query .= ' ORDER BY ' . $analyzed_sql[0]['order_by_clause']; + } + } else { + // Just crop LIMIT clause + $inside_bracket = FALSE; + for ($i = $parsed_sql['len'] - 1; $i >= 0; $i--) { + if ($parsed_sql[$i]['type'] == 'punct_bracket_close_round') { + $inside_bracket = TRUE; + continue; + } + if ($parsed_sql[$i]['type'] == 'punct_bracket_open_round') { + $inside_bracket = FALSE; + continue; + } + if (!$inside_bracket && $parsed_sql[$i]['type'] == 'alpha_reservedWord' && $parsed_sql[$i]['data'] == 'LIMIT') { + // We found LIMIT to remove + + $sql_query = ''; + + // Concatenate parts before + for ($j = 0; $j < $i; $j++) { + $sql_query .= $parsed_sql[$j]['data'] . ' '; + } + + // Skip LIMIT + $i++; + while ($i < $parsed_sql['len'] && + ($parsed_sql[$i]['type'] != 'alpha_reservedWord' || + ($parsed_sql[$i]['type'] == 'alpha_reservedWord' && $parsed_sql[$i]['data'] == 'OFFSET'))) { + $i++; + } + + // Add remaining parts + while ($i < $parsed_sql['len']) { + $sql_query .= $parsed_sql[$i]['data'] . ' '; + $i++; + } + break; + } } - } elseif (!empty($analyzed_sql[0]['where_clause'])) { - $sql_query .= ' WHERE ' . $analyzed_sql[0]['where_clause']; - } - if (!empty($analyzed_sql[0]['group_by_clause'])) { - $sql_query .= ' GROUP BY ' . $analyzed_sql[0]['group_by_clause']; - } - if (!empty($analyzed_sql[0]['having_clause'])) { - $sql_query .= ' HAVING ' . $analyzed_sql[0]['having_clause']; - } - if (!empty($analyzed_sql[0]['order_by_clause'])) { - $sql_query .= ' ORDER BY ' . $analyzed_sql[0]['order_by_clause']; } // TODO: can we avoid reparsing the query here? PMA_showMessage($GLOBALS['strSQLQuery']);