/** * Handles request for Simulation of UPDATE/DELETE queries. * * @return void */ function PMA_handleSimulateDMLRequest() { $response = PMA_Response::getInstance(); $error = false; $error_msg = __('Only single-table UPDATE and DELETE queries can be simulated.'); $sql_delimiter = $_REQUEST['sql_delimiter']; $sql_data = array(); $queries = explode($sql_delimiter, $GLOBALS['sql_query']); foreach ($queries as $sql_query) { if (empty($sql_query)) { continue; } // Parse and Analyze the query. $parsed_sql = PMA_SQP_parse($sql_query); $analyzed_sql = PMA_SQP_analyze($parsed_sql); $analyzed_sql_results = array('parsed_sql' => $parsed_sql, 'analyzed_sql' => $analyzed_sql); // Only UPDATE/DELETE queries accepted. $query_type = $analyzed_sql_results['analyzed_sql'][0]['querytype']; if ($query_type != 'UPDATE' && $query_type != 'DELETE') { $error = $error_msg; break; } // Only single-table queries accepted. $table_references = PMA_getTableReferences($analyzed_sql_results); $table_references = $table_references ? $table_references : ''; if (preg_match('/JOIN/i', $table_references)) { $error = $error_msg; break; } else { $tables = explode(',', $table_references); if (count($tables) > 1) { $error = $error_msg; break; } } // Get the matched rows for the query. $result = PMA_getMatchedRows($analyzed_sql_results); if (!($error = $GLOBALS['dbi']->getError())) { $sql_data[] = $result; } else { break; } } if ($error) { $message = PMA_Message::rawError($error); $response->addJSON('message', $message); $response->addJSON('sql_data', false); } else { $response->addJSON('sql_data', $sql_data); } }
/** * Tests simulated UPDATE/DELETE query. * * @param string $sql_query SQL query * @param string $simulated_query Simulated query * * @return void */ function simulatedQueryTest($sql_query, $simulated_query) { $parser = new SqlParser\Parser($sql_query); $analyzed_sql_results = array('query' => $sql_query, 'parser' => $parser, 'statement' => $parser->statements[0]); $simulated_data = PMA_getMatchedRows($analyzed_sql_results); // URL to matched rows. $_url_params = array('db' => 'PMA', 'sql_query' => $simulated_query); $matched_rows_url = 'sql.php' . URL::getCommon($_url_params); $this->assertEquals(array('sql_query' => PMA\libraries\Util::formatSql($analyzed_sql_results['query']), 'matched_rows' => 2, 'matched_rows_url' => $matched_rows_url), $simulated_data); }
/** * Handles request for Simulation of UPDATE/DELETE queries. * * @return void */ function PMA_handleSimulateDMLRequest() { $response = PMA_Response::getInstance(); $error = false; $error_msg = __('Only single-table UPDATE and DELETE queries can be simulated.'); $sql_delimiter = $_REQUEST['sql_delimiter']; $sql_data = array(); $queries = explode($sql_delimiter, $GLOBALS['sql_query']); foreach ($queries as $sql_query) { if (empty($sql_query)) { continue; } // Parsing the query. $parser = new SqlParser\Parser($sql_query); if (empty($parser->statements[0])) { continue; } $statement = $parser->statements[0]; $analyzed_sql_results = array('query' => $sql_query, 'parser' => $parser, 'statement' => $statement); if (!($statement instanceof SqlParser\Statements\UpdateStatement || $statement instanceof SqlParser\Statements\DeleteStatement) || !empty($statement->join)) { $error = $error_msg; break; } $tables = SqlParser\Utils\Query::getTables($statement); if (count($tables) > 1) { $error = $error_msg; break; } // Get the matched rows for the query. $result = PMA_getMatchedRows($analyzed_sql_results); if (!($error = $GLOBALS['dbi']->getError())) { $sql_data[] = $result; } else { break; } } if ($error) { $message = PMA_Message::rawError($error); $response->addJSON('message', $message); $response->addJSON('sql_data', false); } else { $response->addJSON('sql_data', $sql_data); } }
/** * Tests simulated UPDATE/DELETE query. * * @param string $sql_query SQL query * @param string $simulated_query Simulated query * * @return void */ function simulatedQueryTest($sql_query, $simulated_query) { $parsed_sql = PMA_SQP_parse($sql_query); $analyzed_sql = PMA_SQP_analyze($parsed_sql); $analyzed_sql_results = array('parsed_sql' => $parsed_sql, 'analyzed_sql' => $analyzed_sql); $simulated_data = PMA_getMatchedRows($analyzed_sql_results); // URL to matched rows. $_url_params = array('db' => 'PMA', 'sql_query' => $simulated_query); $matched_rows_url = 'sql.php' . PMA_URL_getCommon($_url_params); $this->assertEquals(array('sql_query' => PMA_Util::formatSql($analyzed_sql_results['parsed_sql']['raw']), 'matched_rows' => 2, 'matched_rows_url' => $matched_rows_url), $simulated_data); }