/**
 * 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);
    }
}
Example #2
0
 /**
  * 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);
 }
Example #3
0
/**
 * 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);
 }