/** * Composes the query necessary to create a routine from an HTTP request. * * @return string The CREATE [ROUTINE | PROCEDURE] query. */ function PMA_RTN_getQueryFromRequest() { global $_REQUEST, $cfg, $errors, $param_sqldataaccess, $param_directions; $_REQUEST['item_type'] = isset($_REQUEST['item_type']) ? $_REQUEST['item_type'] : ''; $query = 'CREATE '; if (!empty($_REQUEST['item_definer'])) { if (strpos($_REQUEST['item_definer'], '@') !== false) { $arr = explode('@', $_REQUEST['item_definer']); $query .= 'DEFINER=' . PMA_backquote($arr[0]); $query .= '@' . PMA_backquote($arr[1]) . ' '; } else { $errors[] = __('The definer must be in the "username@hostname" format'); } } if ($_REQUEST['item_type'] == 'FUNCTION' || $_REQUEST['item_type'] == 'PROCEDURE') { $query .= $_REQUEST['item_type'] . ' '; } else { $errors[] = sprintf(__('Invalid routine type: "%s"'), htmlspecialchars($_REQUEST['item_type'])); } if (!empty($_REQUEST['item_name'])) { $query .= PMA_backquote($_REQUEST['item_name']); } else { $errors[] = __('You must provide a routine name'); } $params = ''; $warned_about_dir = false; $warned_about_name = false; $warned_about_length = false; if (!empty($_REQUEST['item_param_name']) && !empty($_REQUEST['item_param_type']) && !empty($_REQUEST['item_param_length']) && is_array($_REQUEST['item_param_name']) && is_array($_REQUEST['item_param_type']) && is_array($_REQUEST['item_param_length'])) { for ($i = 0; $i < count($_REQUEST['item_param_name']); $i++) { if (!empty($_REQUEST['item_param_name'][$i]) && !empty($_REQUEST['item_param_type'][$i])) { if ($_REQUEST['item_type'] == 'PROCEDURE' && !empty($_REQUEST['item_param_dir'][$i]) && in_array($_REQUEST['item_param_dir'][$i], $param_directions)) { $params .= $_REQUEST['item_param_dir'][$i] . " " . PMA_backquote($_REQUEST['item_param_name'][$i]) . " " . $_REQUEST['item_param_type'][$i]; } else { if ($_REQUEST['item_type'] == 'FUNCTION') { $params .= PMA_backquote($_REQUEST['item_param_name'][$i]) . " " . $_REQUEST['item_param_type'][$i]; } else { if (!$warned_about_dir) { $warned_about_dir = true; $errors[] = sprintf(__('Invalid direction "%s" given for parameter.'), htmlspecialchars($_REQUEST['item_param_dir'][$i])); } } } if ($_REQUEST['item_param_length'][$i] != '' && !preg_match('@^(DATE|DATETIME|TIME|TINYBLOB|TINYTEXT|BLOB|TEXT|MEDIUMBLOB|MEDIUMTEXT|LONGBLOB|LONGTEXT|SERIAL|BOOLEAN)$@i', $_REQUEST['item_param_type'][$i])) { $params .= "(" . $_REQUEST['item_param_length'][$i] . ")"; } else { if ($_REQUEST['item_param_length'][$i] == '' && preg_match('@^(ENUM|SET|VARCHAR|VARBINARY)$@i', $_REQUEST['item_param_type'][$i])) { if (!$warned_about_length) { $warned_about_length = true; $errors[] = __('You must provide length/values for routine parameters of type ENUM, SET, VARCHAR and VARBINARY.'); } } } if (!empty($_REQUEST['item_param_opts_text'][$i])) { if (in_array($_REQUEST['item_param_type'][$i], $cfg['ColumnTypes']['STRING'])) { $params .= ' CHARSET ' . strtolower($_REQUEST['item_param_opts_text'][$i]); } } if (!empty($_REQUEST['item_param_opts_num'][$i])) { if (in_array($_REQUEST['item_param_type'][$i], $cfg['ColumnTypes']['NUMERIC'])) { $params .= ' ' . strtoupper($_REQUEST['item_param_opts_num'][$i]); } } if ($i != count($_REQUEST['item_param_name']) - 1) { $params .= ", "; } } else { if (!$warned_about_name) { $warned_about_name = true; $errors[] = __('You must provide a name and a type for each routine parameter.'); break; } } } } $query .= "(" . $params . ") "; if ($_REQUEST['item_type'] == 'FUNCTION') { if (!empty($_REQUEST['item_returntype']) && in_array($_REQUEST['item_returntype'], PMA_getSupportedDatatypes())) { $query .= "RETURNS {$_REQUEST['item_returntype']}"; } else { $errors[] = __('You must provide a valid return type for the routine.'); } if (!empty($_REQUEST['item_returnlength']) && !preg_match('@^(DATE|DATETIME|TIME|TINYBLOB|TINYTEXT|BLOB|TEXT|MEDIUMBLOB|MEDIUMTEXT|LONGBLOB|LONGTEXT|SERIAL|BOOLEAN)$@i', $_REQUEST['item_returntype'])) { $query .= "(" . $_REQUEST['item_returnlength'] . ")"; } else { if (empty($_REQUEST['item_returnlength']) && preg_match('@^(ENUM|SET|VARCHAR|VARBINARY)$@i', $_REQUEST['item_returntype'])) { if (!$warned_about_length) { $warned_about_length = true; $errors[] = __('You must provide length/values for routine parameters of type ENUM, SET, VARCHAR and VARBINARY.'); } } } if (!empty($_REQUEST['item_returnopts_text'])) { if (in_array($_REQUEST['item_returntype'], $cfg['ColumnTypes']['STRING'])) { $query .= ' CHARSET ' . strtolower($_REQUEST['item_returnopts_text']); } } if (!empty($_REQUEST['item_returnopts_num'])) { if (in_array($_REQUEST['item_returntype'], $cfg['ColumnTypes']['NUMERIC'])) { $query .= ' ' . strtoupper($_REQUEST['item_returnopts_num']); } } $query .= ' '; } if (!empty($_REQUEST['item_comment'])) { $query .= "COMMENT '" . PMA_sqlAddslashes($_REQUEST['item_comment']) . "' "; } if (isset($_REQUEST['item_isdeterministic'])) { $query .= 'DETERMINISTIC '; } else { $query .= 'NOT DETERMINISTIC '; } if (!empty($_REQUEST['item_sqldataaccess']) && in_array($_REQUEST['item_sqldataaccess'], $param_sqldataaccess)) { $query .= $_REQUEST['item_sqldataaccess'] . ' '; } if (!empty($_REQUEST['item_securitytype'])) { if ($_REQUEST['item_securitytype'] == 'DEFINER' || $_REQUEST['item_securitytype'] == 'INVOKER') { $query .= 'SQL SECURITY ' . $_REQUEST['item_securitytype'] . ' '; } } if (!empty($_REQUEST['item_definition'])) { $query .= $_REQUEST['item_definition']; } else { $errors[] = __('You must provide a routine definition.'); } return $query; }
$length = $extracted_fieldspec['spec_in_brackets']; } // some types, for example longtext, are reported as // "longtext character set latin7" when their charset and / or collation // differs from the ones of the corresponding database. $tmp = strpos($type, 'character set'); if ($tmp) { $type = substr($type, 0, $tmp - 1); } if (isset($submit_length) && $submit_length != false) { $length = $submit_length; } // rtrim the type, for cases like "float unsigned" $type = rtrim($type); $type_upper = strtoupper($type); $content_cells[$i][$ci] .= PMA_getSupportedDatatypes(true, $type_upper); $content_cells[$i][$ci] .= ' </select>'; $ci++; // old column length if ($is_backup) { $_form_params['field_length_orig[' . $i . ']'] = $length; } // column length $length_to_display = $length; $content_cells[$i][$ci] = '<input id="field_' . $i . '_' . ($ci - $ci_offset) . '"' . ' type="text" name="field_length[' . $i . ']" size="' . $length_values_input_size . '"' . ' value="' . htmlspecialchars($length_to_display) . '"' . ' class="textfield" />' . '<p class="enum_notice" id="enum_notice_' . $i . '_' . ($ci - $ci_offset) . '">'; $content_cells[$i][$ci] .= __('ENUM or SET data too long?') . '<a onclick="return false;" href="enum_editor.php?' . PMA_generate_common_url() . '&values=' . urlencode($length_to_display) . '&field=' . (isset($row['Field']) ? urlencode($row['Field']) : "") . '" class="open_enum_editor" target="_blank"> ' . __('Get more editing space') . '</a>' . '</p>'; $ci++; // column default /** * having NULL enabled does not implicit having Default with NULL *