Merge pull request #423 from scnakandala/gsoc_2013

Refactoring SQL executor
This commit is contained in:
Marc Delisle 2013-06-13 14:09:11 -07:00
commit c4e5808178
3 changed files with 29 additions and 31 deletions

View File

@ -27,6 +27,12 @@ $analyzed_sql = PMA_SQP_analyze($parsed_sql);
// PRIMARY KEY (`id`)
// )
// A table has to be created, renamed, dropped -> navi frame should be reloaded
$reload = isset($analyzed_sql[0]['queryflags']['reload']);
// check for drop database
$drop_database = isset($analyzed_sql[0]['queryflags']['drop_database']);
// check for a real SELECT ... FROM
$is_select = isset($analyzed_sql[0]['queryflags']['select_from']);

View File

@ -974,6 +974,9 @@ function PMA_SQP_analyze($arr)
* Currently, those are generated:
*
* ['queryflags']['select_from'] = 1; if this is a real SELECT...FROM
* ['queryflags']['drop_database'] = 1;if this is a DROP DATABASE
* ['queryflags']['reload'] = 1; for the purpose of the reloding the
* navigation bar
* ['queryflags']['distinct'] = 1; for a DISTINCT
* ['queryflags']['union'] = 1; for a UNION
* ['queryflags']['join'] = 1; for a JOIN
@ -1586,8 +1589,19 @@ function PMA_SQP_analyze($arr)
if ($first_reserved_word=='SELECT') {
$position_of_first_select = $i;
}
} else {
if ($first_reserved_word == 'DROP' && $upper_data == 'DATABASE') {
$subresult['queryflags']['drop_database'] = 1;
}
// A table has to be created, renamed, dropped -> navi frame
// should be reloaded
if (in_array($first_reserved_word, array("CREATE", "ALTER", "DROP"))
&& in_array(
$upper_data, array("VIEW", "TABLE", "DATABASE", "SCHEMA"))
) {
$subresult['queryflags']['reload'] = 1;
}
}
if ($upper_data == 'LIMIT' && ! $in_subquery) {
@ -2887,18 +2901,4 @@ function PMA_SQP_isKeyWord($column)
return in_array(strtoupper($column), $PMA_SQPdata_forbidden_word);
}
/**
* Checks whether a given query is to drop a database
*
* @param string $sql_query The SQL query to be checked for drop database
*
* @return boolean whether true or false
*/
function PMA_isDropDatabase($sql_query)
{
return preg_match(
'/DROP[[:space:]]+(DATABASE|SCHEMA)[[:space:]]+/i',
$sql_query
);
}
?>

24
sql.php
View File

@ -199,6 +199,12 @@ if (empty($sql_query) && strlen($table) && strlen($db)) {
PMA_Util::checkParameters(array('sql_query'));
}
/**
* Parse and analyze the query
*/
require_once 'libraries/parse_analyze.lib.php';
/**
* Check rights in case of DROP DATABASE
*
@ -208,7 +214,8 @@ if (empty($sql_query) && strlen($table) && strlen($db)) {
*/
if (! defined('PMA_CHK_DROP')
&& ! $cfg['AllowUserDropDatabase']
&& PMA_isDropDatabase($sql_query)
&& isset ($drop_database)
&& $drop_database == 1
&& ! $is_superuser
) {
PMA_Util::mysqlDie(
@ -269,10 +276,6 @@ if (isset($_POST['store_bkm'])) {
}
} // end if
/**
* Parse and analyze the query
*/
require_once 'libraries/parse_analyze.lib.php';
/**
* Sets or modifies the $goto variable if required
@ -306,17 +309,6 @@ if (isset($_REQUEST['btnDrop']) && $_REQUEST['btnDrop'] == __('No')) {
} // end if
// Defines some variables
// A table has to be created, renamed, dropped -> navi frame should be reloaded
/**
* @todo use the parser/analyzer
*/
if (empty($reload)
&& preg_match('/^(CREATE|ALTER|DROP)\s+(VIEW|TABLE|DATABASE|SCHEMA)\s+/i', $sql_query)
) {
$reload = 1;
}
// $is_group added for use in calculation of total number of rows.
// $is_count is changed for more correct "LIMIT" clause
// appending in queries like