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:
@@ -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
|
||||
|
@@ -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']);
|
||||
|
Reference in New Issue
Block a user