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).
|
(bug #990330).
|
||||||
* libraries/display_export.lib.php: Display SQL export after saving file
|
* libraries/display_export.lib.php: Display SQL export after saving file
|
||||||
on server (bug #989657).
|
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>
|
2004-07-15 Marc Delisle <lem9@users.sourceforge.net>
|
||||||
* tbl_change.php: bug 990959, undefined index for DATETIME
|
* tbl_change.php: bug 990959, undefined index for DATETIME
|
||||||
|
@@ -14,45 +14,87 @@ require('./tbl_properties_table_info.php');
|
|||||||
<!-- Dump of a table -->
|
<!-- Dump of a table -->
|
||||||
<?php
|
<?php
|
||||||
$export_page_title = $strViewDump;
|
$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)) {
|
if (isset($sql_query)) {
|
||||||
// I don't want the LIMIT clause, so I use the analyzer
|
// Parse query so we can work with tokens
|
||||||
// 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?
|
|
||||||
|
|
||||||
$parsed_sql = PMA_SQP_parse($sql_query);
|
$parsed_sql = PMA_SQP_parse($sql_query);
|
||||||
$analyzed_sql = PMA_SQP_analyze($parsed_sql);
|
|
||||||
$sql_query = 'SELECT ';
|
|
||||||
|
|
||||||
if (isset($analyzed_sql[0]['queryflags']['distinct'])) {
|
// Need to generate WHERE clause?
|
||||||
$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)) {
|
if (isset($primary_key)) {
|
||||||
$sql_query .= ' WHERE ';
|
// Yes => rebuild query from scracts, this doesn't work with nested
|
||||||
$conj = '';
|
// selects :-(
|
||||||
foreach ($primary_key AS $i => $key) {
|
$analyzed_sql = PMA_SQP_analyze($parsed_sql);
|
||||||
$sql_query .= $conj . '( ' . $key . ' ) ';
|
$sql_query = 'SELECT ';
|
||||||
$conj = 'OR ';
|
|
||||||
|
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?
|
// TODO: can we avoid reparsing the query here?
|
||||||
PMA_showMessage($GLOBALS['strSQLQuery']);
|
PMA_showMessage($GLOBALS['strSQLQuery']);
|
||||||
|
Reference in New Issue
Block a user