In case we don't need to reconstruct complete query just drop LIMIT part (workaround for bug #955175 and should fix bug #990724).

This commit is contained in:
Michal Čihař
2004-07-15 15:17:16 +00:00
parent 1cef835c05
commit 3a558d153a
2 changed files with 79 additions and 34 deletions

View File

@@ -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 <lem9@users.sourceforge.net>
* tbl_change.php: bug 990959, undefined index for DATETIME

View File

@@ -14,45 +14,87 @@ require('./tbl_properties_table_info.php');
<!-- Dump of a table -->
<?php
$export_page_title = $strViewDump;
// When we have some query, we need to remove LIMIT from that and possibly
// generate WHERE clause (if we are asked to export specific rows)
if (isset($sql_query)) {
// I don't want the LIMIT clause, so I use the analyzer
// to reconstruct the query with only some parts
// because the LIMIT clause may come from us (sql.php, sql_limit_to_append
// or may come from the user.
// Then, the limits set in the form will be added.
// TODO: do we need some other parts here, like PROCEDURE or FOR UPDATE?
// Parse query so we can work with tokens
$parsed_sql = PMA_SQP_parse($sql_query);
$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'];
}
// Need to generate WHERE clause?
if (isset($primary_key)) {
$sql_query .= ' WHERE ';
$conj = '';
foreach ($primary_key AS $i => $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']);