Merge branch 'QA_4_5' into STABLE

This commit is contained in:
Isaac Bennetch 2016-02-22 15:29:46 -05:00
commit 70103ad777
153 changed files with 976 additions and 1299 deletions

View File

@ -9,6 +9,7 @@ php:
- "7.0"
- "5.6"
- "5.5"
- "hhvm"
sudo: false

626
ChangeLog
View File

@ -1,6 +1,43 @@
phpMyAdmin - ChangeLog
======================
4.5.5.0 (2016-02-22)
- issue Undefined index: is_ajax_request
- issue #11855 Fix password change on MariaDB 10.1 and newer
- issue #11874 Validate version information before further processing it
- issue #11881 Full processlist lost on refresh
- issue #11834 Adjust privileges fails if database name contains underscores
- issue #11906 'Loading...' banner shows on login screen
- issue #11930 Fixed changing of table parameters, eg. AUTO_INCREMENT
- issue #11885 Call to undefined function SqlParser\ctype_alnum()
- issue #11879 4.5.3.1 - NOW() function not recognized by parser
- issue #11867 Gracefully handle the DESC statement
- issue #11843 Fractional timestamp causes corrupted SQL export
- issue #11836 Static analysis error for valid WHERE condition with IF keyword
- issue #11800 Syntax Verifier error using REGEXP in SQL statement
- issue #11799 Backslashes in comments are being interpreted as escape characters
- issue #11909 Can't insert row into table that contains generated column
- issue #11677 sql-parser and php-gettext collide.
- issue #11920 Can't disable backquotes in export
- issue #11911 Inserts via tbl_change.php in VARBINARY columns does not allow using HEX() and MD5()
- issue #11939 Correct content type for uploaded error reports
- issue #11940 Silent errors from checking local documentation
- issue #11944 Fixed error on servers with disabled php_uname
- issue #11946 Correctly store and report file upload errors
- issue #11948 Avoid javascript errors on invalid location hash
- issue #11950 Fix PHP warning on configuration errors
- issue #11951 Silent errors on checking for writable folders
- issue #11952 Silent warning on invalid file upload
- issue #11953 Do not fail getting filename with open_basedir limitations
- issue #11956 unrecognized keyword interval
- issue Field names and aliases are being correctly parsed now.
- issue #11959 Fix javascript error in setup
- issue #11964 Undefined index: TABLE_COMMENT in database structure page
- issue #11967 Fix PHP error on loading invalid XML or ODS file
- issue #11969 Missing confirmation while dropping a view in view_operations.php
- issue #11968 Fix export of index comments in SQL
- issue #11979 DECLARE not accepted as valid SQL
4.5.4.1 (2016-01-29)
- issue #11892 Error with PMA 4.4.15.3
- issue #11896 Remove hard dependency on phpseclib
@ -43,595 +80,6 @@ phpMyAdmin - ChangeLog
- issue [Security] Full path disclosure vulnerability in SQL parser, see PMASA-2016-8
- issue [Security] XSS vulnerability in SQL editor, see PMASA-2016-9
4.5.3.1 (2015-12-25)
- issue #11774 Undefined offset 2
- issue [Security] Path disclosure, see PMASA-2015-6
4.5.3.0 (2015-12-23)
- issue #11744 Incomplete results of UNION ALL
- issue #11742 MATCH AGAINST keywords not recognized
- issue #11723 syntax verifier is not knowing "STRAIGHT_JOIN"
- issue #11699 REPLACE() function confused with REPLACE statement
- issue #11690 FLUSH word not recognized by parser
- issue #11664 Online syntax verifier bug - "IF" on SELECT statement
- issue #11665 Format breaks query with COUNT()
- issue Undefinex index: SendErrorReports
- issue Incorrect script name in include
- issue #11685 Warning: Invalid argument supplied for foreach()
- issue #11687 Delimiter missing while exporting multiple db routines
- issue #11684 mysql_native_password with MariaDB bug
- issue #11693 Flush privileges overusage - related to #11597
- issue #11691 Query was empty on creating User in 4.5.2
- issue #11695 PMA_getDataForDeleteUsers() warning
- issue #11698 Cannot create user on Percona Server
- issue Properly report error on connecting
- issue #11706 Database export template not saving compression option
- issue #11721 Fix single quote export for servers in ANSI_QUOTES mode
- issue #11714 Avoid duplicite fetching of table information
- issue #11724 Temporary fix for live data edit of big sets is not working
- issue IE 8 compatibility in console
- issue #11732 Exporting feature does not work with union table
- issue #11728 CSV import skip row count after
- issue #11679 Cannot export results of some queries
- issue #11720 Message "An account already exists..." incorrectly displayed
- issue #11758 Missing quoting of table in ALTER CONVERT query
- issue #11752 PMA 4.5.2 breaks MySQL Master-Master Cluster
- issue #11757 Export and preview show different SQL for character set
- issue #11749 Fix possible undefined variables in table operations
4.5.2.0 (2015-11-23)
- issue #11589 Incorrect parameter in mysqli_fetch_fields()
- issue #11592 Missing headers in zipped export
- issue #11590 Parser: Array to string conversion
- issue #11597 Huge binary log growth on 4.5.x
- issue #11594 'only_db' config option bug when db names contain underscore and are grouped
- issue #11607 Unable to change password from Login information tab
- issue #11610 Undefined variable: res_rel
- issue #11611 Warning while exporting schema to PDF
- issue #11612 Undefined index: new_row_format
- issue #11605 Changing hostname kills password
- issue #11614 Undefined variable: db
- issue #11627 CREATE TABLE/INSERT INTO executed twice (ctrl+enter)
- issue #11630 Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given
- issue #11632 Exporting GIS visualization ignores start and row count
- issue #11476 Errors instead of git info when PHP has no gzip support
- issue #11633 CodeMirror tooltip shows below modal window
- issue #11639 Bug with the MainBackground Color
- issue Profiling checkbox is missing
- issue #11642 Properly handle session expiry after POST requests
- issue #11648 Notice in ./export.php#214 Undefined index: quick_or_custom
- issue #11646 Unrecognized keywords
- issue #11635 Sql not executed properly
- issue #11631 Linter warnings when creating new user
- issue #11626 wrong row count for query results
- issue #11608 Analyzer doesn't recognize GRANT statements
- issue #11602 Parser warnings (subqueries)
- issue #11658 Collation column is empty in table Structure
- issue #11661 Error changing table's column encoding
4.5.1.0 (2015-10-23)
- issue Invalid argument supplied for foreach()
- issue array_key_exists() expects parameter 2 to be array
- issue #11480 Notice Undefined index: drop_database
- issue #11486 Server variable edition in ANSI_QUOTES sql_mode: losing current value
- issue #11491 Propose table structure broken
- issue #11464 phpMyAdmin suggests upgrading to newer version not usable on that system
- issue #11495 'PMA_Microhistory' is undefined
- issue #11496 Incorrect definition for getTablesWhenOpen()
- issue #11500 Error when creating new user on MariaDB 10.0.21
- issue #11505 Notice on htmlspecialchars()
- issue Notice in Structure page of views
- issue #11510 AUTO_INCREMENT always exported when IF NOT EXISTS is on
- issue #11516 Some partitions are missing in copied table
- issue #11521 Notice of undefined variable when performing SHOW CREATE
- issue #11509 Error exporting sql query results with table alias
- issue #11512 SQL editing window does not recognise 'OUTER' keyword in 'LEFT OUTER JOIN'
- issue #11518 "NOT IN" clause not recognized (MySQL 5.6 and 5.7)
- issue #11524 Yellow star does not change in database Structure after add/remove from favorites
- issue #11531 Invalid SQL in table definition when exporting table
- issue #11526 Foreign key to other database's tables fails
- issue #11519 Bug while exporting results when a joined table field name is in SELECT query
- issue #11522 Strange behavior on table rename
- issue #11539 Rename table does not result in refresh in left panel
- issue #11541 Missing arguments for PMA_Table::generateAlter()
- issue #11544 Notices about undefined indexes on structure pages of information_schema tables
- issue Change minimum PHP version for Composer
- issue #11542 Import parser and backslash
- issue #11546 "Visualize GIS data" seems to be broken
- issue #11548 Confirm box on "Reset slave" option
- issue Fix cookies clearing on version change
- issue #11558 Cannot execute SQL with subquery
- issue #11520 Incorrect syntax creating a user using mysql_native_password with MariaDB
- issue #11561 Cannot use third party auth plugins
4.5.0.2 (2015-09-25)
- issue #11497 Incorrect indexes when exporting
4.5.0.1 (2015-09-24)
- issue #11492 AUTO_INCREMENT statements are partly missing from exports
4.5.0.0 (2015-09-23)
+ rfe Pagination for GIS visualization
+ issue #6207 Usability improvements for console
+ issue #6310 Access to Add columns text-box and Go button when creating table
+ issue #6007 Add lock tables, disable keys options
+ issue #6306 Additional page locking
+ issue #6314 Support MySQL 5.7 syntax for password change
+ issue #6319 Display/edit index name
+ issue #6318 Toggle autocomplete of table and column names
+ issue #5633 Manage multiple variable in bookmarked query
+ issue #5642 Show edit/delete also when there is calculated column
+ issue #6313 Show databases as list instead of as dropdown when no database is selected
+ rfe Optional dark theme for the console
+ issue #5053 PDF schema sort options
+ issue #5543 Structure in PDF export
+ issue #6327 Have ZeroConf create phpmyadmin DB if possible
+ issue #5462 Warning before silent data conversion/truncation
+ issue #6338 Support a default page in designer
+ issue #6339 Allow copying mutiple rows
+ issue #6334 No SQL query for loading data
+ issue #6341 New data validation feature and datetime type
+ issue #6324 Importing and exporting pMA meta-data
+ issue #6330 Add grouping to stored procedures in the navigation tree
+ issue #6275 Support IPv6 browser transformation
+ rfe Option groups for 'With selected' dropdown in database structure page
+ issue #6347 Support CHECKSUM TABLE operation
+ issue #6088 Support for Paramaters with raw SQL
+ issue #5844 Show original size of truncated columns
+ issue #6114 Explain analyzer
+ issue #6186 Add "Drop partition" option to partition tools
+ issue #6354 Procedures window shift-click should select multiple rows
+ issue #6355 Designer: "Sticky" menu option
+ issue #6357 Directly show table comments in structure view
+ issue #6259 Page-related settings
+ issue #5356 Alter privileges when renaming or copying a database
- issue #11256 Slowness due to large number of routines
- issue #11258 GROUP_CONCAT shown as GROUPBY_CONCAT in CodeMirror autocomplete
+ issue #5946 Work with --skip-grant-tables
- issue #11266 "Sort by key" drop-down value is lost
+ issue #6287 Browse: improve display of right-aligned data
- issue #11265 Textarea rows settings ignored Features > Text fields
+ issue #6358 MIME types should be lower case
- issue #11226 Drop table doesn't remove the table name from navigation bar
+ issue #6360 MySQL and MariaDB functions INET6_ATON and INET6_NTOA
- bug Link to get real row counts of all the views in a db, at once
- issue #11275 Drizzle version numbers
+ issue #5400 Rewrite print view using CSS; fixes print view failures on multi-query statements
+ issue #6362 Support spatial indexes in table create form
+ issue #6068 Use CTRL or ALT plus arrow keys for navigation in grid editor
+ rfe Remove support for Shift + Click on function name to apply to all rows in insert/edit page
+ issue #6326 Don't group tables in tree if the result has only one group
- issue #11287 When hide table structure actions is false, action should be in a row
+ issue #5425 Batch changing the collation of each column in a table
- issue #10918 QBE generates wrong query
+ issue #6292 Use plain English descriptors instead of script names for icon link destinations
+ issue #6239 Disable foreign key checks for some operations
- issue #11296 "With selected" links doesn't work in table browse
- issue #11166 Query builder: missing joint for the intermediary table
+ issue #6251 Integrate SQL debugging into console
- issue #11061 Improve/restore non-unique index row editing
- issue #11301 MySQL errors are not shown when DebugSQL is enabled
+ issue #5037 One file per table and one file per database export option
+ issue #5759 Designer settings should be part of saved state
+ issue #6257 Option to remove functions, procedures, etc., from navigation tree
+ issue #5388 Column privileges and update
+ issue #6231 Cant use external config file
+ issue #6252 CSV import: Allow "Columns escaped with" to be optional
+ issue #6262 Being able to use multiple servers at the same time when using cookie auth
+ issue #6301 select structure or data for each table when exporting
- issue #11261 Autocomplete completes the original table name when joining multiple aliased tables
+ rfe Remove configuration storage data related to a user upon deleting the user
+ issue #6298 Improved processlist for mariadb
+ issue #6300 Warn about "Any user" potential problem
+ issue #6368 Hide/disable edit links for read-only variables
+ issue #6365 Human readable/writable URLs (html5 api)
+ rfe Support virtual columns in MySQL 5.7.5+
+ issue #6215 Support for virtual/persistent columns in MariaDB
- issue #11314 Undefined <feature>work upon upgrade to new version
- issue #1817 Creating configuration storage tables fail in MySQL 5.7
- issue #6118 Parser does not handle nested selects
- issue #5437 Support SELECT ... FROM DUAL
- issue #4962 Support UNION
- issue #11322 Missing null checkbox when grid editing a null cell
+ Upgrade TCPDF to version 6.2.9
+ issue #6102 Add SHA256 security password support
- issue #10250 Displayed git revision info is not set
+ Improved schema SVG export
- issue #10726 Do not try to set port 80 for https requests
+ issue #11394 Export/import Designer view
+ Partition support in table Structure
+ issue #11414 Unclear export options / organization / hierarchy
Set minimum required PHP version to 5.5 (older versions are EOL)
- issue #11407 ALTER TABLE failing on import when table exists
- issue Do not export `sys` database when exporting server
- issue #11436 CREATE DATABASE should be enabled by default on server exports
- issue #11442 MySQL 5.7 and SHOW VARIABLES
- issue #11445 MySQL 5.7 and Status page for an unprivileged user
- issue #11448 Clarify doc about the MemoryLimit directive
- issue #11489 Cannot copy a database under certain conditions
4.4.15.1 (2015-10-23)
- issue #11464 phpMyAdmin suggests upgrading to newer version not usable on that system
- issue [security] Content spoofing on url.php
4.4.15.0 (2015-09-20)
- issue #11411 Undefined "replace" function on numeric scalar
- issue #11421 Stored-proc / routine - broken parameter parsing
- issue Missing name for configuration read_as_multibytes
- issue #11431 Incorrect "No row selected" message
- issue #11447 MySQL 5.5 and the language system variable
- issue #11452 Semantics of export and import icons are mixed up
- issue #11451 Designer-Bug in move.js on multiple server configuration
- issue #11458 Invalid UTF-8 sequence in argument
- issue #11457 Request URI too large
- issue Invalid argument supplied for foreach()
- issue #11461 Foreign key constraints for InnoDB tables with upper-case letters disabled
- issue #11487 Warning when entering Query page
4.4.14.1 (2015-09-08)
- issue [security] reCaptcha bypass
4.4.14.0 (2015-08-20)
- issue #11367 Export after search, missing WHERE clause
- issue #11380 Incomplete message after import
- issue Incorrect scalar type declaration (reported under PHP 7)
- issue #11389 ReCaptcha produces deprecated messages under PHP 7
- issue #11387 phpseclib < 2.0 produces deprecated messages on PHP 7
- issue #11404 "Switch to copied table" doesn't work
- issue #11406 Missing quotes after calling "distinct values"
- issue #11386 Cannot import database with long data in one column
- issue #11410 SPATIAL index option is not clickable
4.4.13.1 (2015-08-08)
- issue #11368 SQL error when importing phpMyAdmin dump file
4.4.13.0 (2015-08-07)
- issue #1808 "Improve table structure" generates invalid SQL
- issue Once checked "Show only active" checkbox is always checked
- issue #1813 Delete rows using "Check All" is broken
- issue Fix PHP 7 possible binding ambiguity
- issue #11326 Exported schema includes all the tables of the database
- issue #11339 Results not displayed if query ends in delimiter and comment
- issue #11320 Live edit of data fields is not working always
- issue Table list in navigation collapses when entering into a table in another page
- issue #11364 JS error while trying to auto navigate to db structure page when db creation has failed
4.4.12.0 (2015-07-20)
- bug Saved chart image does not have a proper name or an extension
- bug #4976 Timepicker CSS issues in Original theme
- bug #4975 Move/Copy/Rename operations on Table/Db fail on Drizzle server
- bug #4826 Two inline edit windows
- bug #4979 Problem when import *.ods file
- bug Add missing head tag
- bug #4985 Column headers move when scrolling
4.4.11.0 (2015-07-06)
- bug Missing selected/entered values when editing active options in visual query builder
- bug #4969 Autoload from prefs_storage not behaving properly
- bug #4972 Incorrect length computed for binary data
- bug Remove character set from create_tables_drizzle.sql
- bug #4973 Users overview needs clarification
- bug #4974 Creating a database from console doesn't update navigation panel
- bug #4844 FAQ 1.17 needs an update
4.4.10.0 (2015-06-17)
- bug #4950 Issues in database selection for replication
- bug #4951 Trying to save chart as image crashes the browser
- bug #4953 cant drag sql.gz file onto import input
- bug #4960 Table creation results in GET request with missing server parameter that invalidates the session
- bug #4961 Javascript error when Designer is opened
- bug #4962 Insert by foreign key scrolls page to top
- bug #4955 Clicking on the navi logo does not always work
- bug External URL for $cfg['NavigationLogoLink'] causes JavaScript error when clicked
4.4.9.0 (2015-06-04)
- bug #4920 relation view doesn't list fields of table in other database
- bug #4905 Sorting by an alias
- bug #4931 False error before entering reCAPTCHA
- bug #4909 central column with multiple server
- bug #4937 Custom export with backquotes off is not working
- bug #4908 Reverse proxy: infinite internal redirect (added warning in doc)
- bug #4942 Export to gzip saves plain text under Chrome
4.4.8.0 (2015-05-28)
- bug Allow accessing visual query builder when pmadb is not configured
- bug #4893 Nav tree line alignment issue
- bug #4911 Lock page icon is not shown after fresh reload
- bug #4912 "Highlight pointer" and "Row marker" doesn't work properly
- bug Browse foreigners window goes out of the window
- bug #4918 Date field popup dialog position bug
- bug In /setup, PMA_messages is not defined
- bug #4924 Recaptcha failure
- bug #4930 Database copy doesn't work for tables with more than one FULLTEXT index
- bug #4929 Edit view structure doesn't load the algorithm
- bug #4923 Do not limit table comments to 60 characters
4.4.7.0 (2015-05-16)
- bug #4876 Settings issues (Favorite tables shown twice in Settings)
- bug #4896 Non-styled error page when following results link
- bug #4894 Deleting without confirmation
- bug #4858 Issues with SQL autocomplete
- bug #4897 Column hint in SQL autocomplete is sometimes not shown
- bug #4898 JS error after selecting a field and press Enter
- bug Honor proxy settings when getting Git commit information
- bug Missing title on link
- bug #4512 ForceSSL Redirect Check
- bug Undefined index collation_connection
- bug Error when the reporting server is down
- bug Escape database and table names for partition maintenance
- bug Invalid value for CURLOPT_SSL_VERIFYPEER
- bug #4367 Import status infinite loop
- bug #4902 Designer: Loading does not work
- bug #4904 Setup: Overview > Display does not work
- bug #4906 Designer: pages from all databases
4.4.6.1 (2015-05-13)
- bug #4899 [security] CSRF vulnerability in setup
- bug #4900 [security] Vulnerability allowing man-in-the-middle attack
4.4.6.0 (2015-05-07)
- bug #4890 webkitStorageInfo and webkitIndexedDB is deprecated
- bug #4892 Undefined variable: unique_conditions
- bug #4891 CSV Import ignores "Replace table data with file" checkbox
4.4.5.0 (2015-05-05)
- bug Table overhead stats: missing space before the unit
- bug Fix resize icon in Designer
- bug #4879 Exit fullscreen in Designer does not change the button text
- bug #4880 Designer icons missing when using original theme
- bug #4878 Column list of central columns is not cleared
- bug #4881 jQuery dialogs of the Designer are not displayed in fullscreen
- bug #4883 Search function breaks when searching for certain combinations of backslashes and slashes
- bug #4830 Maximum execution time exceeded in Util.class.php (better fix)
- bug #4885 Some icons are above the overlay of jQuery dialogs
- bug #4886 Clicking on external links in advisor rules give JS error
- bug #4888 Filter in central columns does not work in other languages
4.4.4.0 (2015-04-26)
- bug #4863 Edit vs Change
- bug #4859 Don't scroll (to bottom) when editing multiple rows
- bug #4862 Misaligned Inline edit field
- bug #4861 Use of undefined constant PMA_DRIZZLE
- bug #4865 sprintf(): Too few arguments
- bug #4866 Limit column ordering in index edit dialog
- bug #4867 Incorrect ALTER TABLE statement generated
- bug #4870 Inconsistency in 'Ignore' checkbox in insert page
- bug #4869 Drop column action not asking to confirm
- bug #4871 Error on creating table
- bug Undefined index: Rows
4.4.3.0 (2015-04-20)
- bug #4851 PHP errors in login dialogue
- bug #4207 json_encode error due to strftime returning non utf8 chars in Windows 8.1 Chinese version
- bug #4845 White screen (Cloudflare)
- bug #4794 Server error viewing table content
- bug Fix issues related to number of decimal places in time
- bug #4853 Relation view between 1600 and 1780 px
- bug PHP 7 compatibility in php-gettext
- bug PHP 7 compatibility in bfShapeFiles
- bug PHP 7 session_regenerate_id() warning
- bug #4857 Alter table after changing column name error
- bug #4830 Maximum execution time exceeded in Util.class.php
4.4.2.0 (2015-04-13)
- bug #4835 PMA_hideShowConnection not called after submit_num_fields
- bug #4836 Server warning after moving from console to direct clicks
- bug #4837 Duplicate new version notification when using the "Back" button
- bug #4839 DOC link in setting is broken
- bug #4841 Status page: Mislukte pogingen per uur value is incorrect
- bug MIME Transformation link fixed
- bug #4838 Prevents console window from moving out of the screen height
- bug #4829 Create procedure via SQL Editor not more possible
- bug #4833 CSS and Javascript are not compressed
- bug #4849 Functions accessed from navigation do not load on ajax dialog
- bug #4850 Relation view on 1920
4.4.1.1 (2015-04-08)
- bug #4846 Web server's error log is flooded
4.4.1.0 (2015-04-07)
- bug #4813 MySQL 5.7.6 and the Users menu tab
- bug #4818 MySQL 5.7.6 and changing the password for another user
- bug #4819 Request URI too large
- bug #4814 MySQL 5.7.6 and Databases
- bug Use 'server' parameter in console to work in multi server environments
- bug Missing tooltip in monitor
- bug Missing sort icons in monitor
- bug #4805 Inline edit broken when using functions in query
- bug #4821 Timed-out import fails to restart when file represented
- bug #4754 pMA DB not detected properly
- bug #4825 Datepicker missing when changing number of rows on Insert page
- bug #4824 INNODB STATUS page is empty
- bug #4828 JavaScript is loaded in wrong order
- bug #4827 TEXT formatting doesn't work after inline editing
- bug #4822 Compress when php.ini output_buffering is active
- bug #4832 Sorting distinct values result loses links
- bug #4834 Do not attach token to css requests to improve caching
4.4.0.0 (2015-04-01)
+ rfe #1553 InnoDB presently supports one FULLTEXT index creation at a time
+ rfe #1562 Allow tracking multiple table at once from database level tracking page
+ rfe #1564 Improve action message on Tracking page
+ rfe #1566 Change value of "Number of rows:" when "Show all" is checked
+ rfe Focus console by clicking on white space
+ rfe #1507 Part 1: Cycle through console history with keyboard up/down arrows
+ rfe #1579 Default to primary key when adding relation
+ rfe #1572 User prefs: Diff-friendly JSON for config
+ rfe #1567 Sever Variables Table UI Improvements
- bug #4675 phpMyAdmin should be able to work without 'examples' DIR - move SQL scripts to sql directory
+ rfe #1578 Warn about reserved word only when a column is created
+ rfe #1590 Recaptcha API v2
+ rfe #1580 Individual Zeroconf PMA tables support
+ rfe #1525 Generate keys one per line
+ rfe #347 allow table with transformed column anywhere in FROM clause
+ rfe #1591 Shortcut link to search page
+ rfe #1568 Fold Add Column After / Before into dropdown
- bug #4705 Table structure: adding primary key doesn't refresh page
+ rfe #1582 SQL formatter
+ rfe #1597 Fast filter improvement: remove "x other results found"
- bug #4720 No error message on Missing extension mbstring
+ rfe #801 Builtin transformations and relations
+ rfe #767 USING BTREE support for HEAP/MEMORY tables
+ rfe #1596 Make "Options > Relational" configurable
+ rfe #719 More details in PDF relation view
+ rfe #1096 Cannot enter connection for federated engine table
+ rfe #954 Allow SALT in ENCRYPT function
+ rfe #1260 Setting LoginCookieValidity > session.gc_maxlifetime
+ rfe Transformation for JSON
- bug Fix isCanvasSupported for new window
+ rfe #1600 Clarify the "Inline" link
+ rfe #1179 Speed up slow triggers by using EVENT_OBJECT_SCHEMA
+ rfe #1192 ON DUPLICATE KEY UPDATE for loading CSV
- bug Cannot execute command from console (multi-server installation)
+ rfe #1208 linking from information_schema
+ rfe #1235 Relation view: move to main "Structure" page
+ rfe #1558 Designer menu with explicit text
+ rfe #937 Relations with views like with tables
+ rfe #1241 Browse Field -> Search
+ rfe #723 Provide sanity check for table/column names (table names)
+ rfe #1312 SessionTimeZone configuration directive
- bug Add missing confirmation when deleting tracking report entries
+ rfe Ability to disable foreign key check when emptying tables
+ rfe #1549 Reset auto-increment when exporting structure
+ rfe #1602 Recover query in redaction after session end
+ rfe #1605 After database creation, go to database structure page
+ rfe #1604 Show PHP version
- bug #4770 Multiple delete on table browse ignoring foreign key checkbox
+ rfe CodeMirror based SQL editor as an input transformation
+ rfe #1275 CodeMirror based JSON editor as an input transformation
+ rfe #685 Editor for HTML content
+ rfe #1595 make professional code editor suggestion
+ rfe #1606 processlist filter
+ rfe Change tracking activation status from db level tracking page
+ rfe #1207 Export users associated with a specific schema/database
+ rfe #1575 "Disable database expansion" : unclear directive name and
explanation
+ rfe #1607 Tool tip for lock icon when making changes to a page
+ rfe #1327 Hide 'Add user' link if user does not have privileges
+ rfe #501 Support for SSL GRANT option
+ rfe #1608 Central columns allowing setting SIGNED / UNSIGNED attribute for integer
+ rfe #1441 Add regexp match when using AllowArbitraryServer
- bug #4806 Unable to work with two different servers in two tabs
4.3.14.0 (not yet released)
4.3.13.0 (2015-03-29)
- bug #4803 "Show hidden items" is sometimes hidden
- bug #4807 Breaks when sorting by multiple columns while using UNION
- bug #4798 Missing column when exporting in sql
- bug #4810 Broken find and replace
- bug #4804 Undefined Index after export schema
- bug #4802 Changelog page is not working
- bug #4815 Infinite calls to index.php
- bug #4820 Invalid links to dev.mysql.com
- bug #4718 simulate query fails, but actual query does not
4.3.12.0 (2015-03-14)
- bug #4746 Right-aligned columns have left-aligned header
- bug #4779 PMA_Util::parseEnumSetValues fails on enums with UTF-8 values
- bug Undefined index savedsearcheswork
- bug #4788 Inline edit of DATE fields with NULL, NULL checkbox is under datepicker
- bug #4790 DROP TABLE/VIEW IF EXISTS are not tracked
- bug Compatibility with central columns of version 4.4
- bug #4758 Firefox with auth_type to http with multiple server doesn't work anymore
- bug #4789 Views aren't dropped when copying a database
- bug #4784 Incomplete bookmark saving
- bug #4786 SELECT width on relations page
4.3.11.1 (2015-03-04)
- bug [security] Risk of BREACH attack, see PMASA-2015-1
4.3.11.0 (2015-03-02)
- bug #4774 SQL links are completely wrong
- bug #4768 MariaDB: version mismatch
- bug #4777 Some images are missing in Designer for original theme
- bug #4767 Drizzle: undefined index in mysql_charsets.inc.php
- bug #4753 Normal field and multi-line field have different margins
- bug #4760 Cannot re-import settings from local storage
- bug #4778 SQL error when database list is sorted by additional columns
- bug #4780 Notice when timestamp column does not have default value
4.3.10.0 (2015-02-20)
- bug Undefined index navwork
- bug #4744 Opening console scroll down the page
- bug Remove extra column heading in view structure page
- bug Add missing confirmation when deleting central columns
- bug Undefined index DisableIS
- bug #4763 Database export with more than 512 tables fails
- bug #4769 Previously set column aliases are destroyed if returned to the same table
- bug #4752 Incorrect page after creating table
- bug #4771 Central Columns not working, showing error
4.3.9.0 (2015-02-05)
- bug #4728 Incorrect headings in routine editor
- bug #4730 Notice while browsing tables when phpmyadmin pma database exists, but not all the tables
- bug #4729 Display original field when using "Relational display column" option and display column is empty
- bug #4734 Default values for binary fields do not support binary values
- bug #4736 Changing display options breaks query highlighting
- bug Undefined index submit_type
- bug #4738 Header lose align when scrolling in Firefox
- bug #4741 in ./libraries/Advisor.class.php#184 vsprintf(): Too few arguments
- bug #4743 Unable to move cursor with keyboard in filter rows box
- bug Incorrect link in doc
- bug #4745 Tracking does not handle views properly
- bug #4706 Schema export doesn't handle dots in db/table name
- bug #3935 Table Header not displayed correct (Safari 5.0.5 Mac)
- bug #4750 Disable renaming referenced columns
- bug #4748 Column name center-aligned instead of left-aligned in Relations
4.3.8.0 (2015-01-24)
- bug Undefined constant PMA_DRIZZLE
- bug #4712 Wrongly positioned date-picker while Grid-Editing
- bug #4714 Forced ORDER BY for own sql statements
- bug #4721 Undefined property: stdClass::$version
- bug #4719 'only_db' not working
- bug #4700 Error text: Internal Server Error
- bug #4722 Incorrect width table summary when favorite tables is disabled
- bug #4716 Collapse all in navigation panel is sometimes broken
- bug #4724 Cannot navigate in filtered table list
- bug #4717 Database navigation menu broken when resolution/screen is changing
- bug #4727 Collation column missing in database list when DisableIS is true
- bug Undefined index central_columnswork
- bug Undefined index favorite_tables
4.3.7.0 (2015-01-15)
- bug #4694 js error on marking table as favorite in Safari (in private mode)
- bug #4695 Changing $cfg['DefaultTabTable'] doesn't update link and title
- bug Undefined index menuswork
- bug Undefined index navwork
- bug Undefined index central_columnswork
- bug #4697 Server Status refresh not behaving as expected
- bug Null argument in array_multisort()
- bug #4699 Navigation panel should not hide icons based on 'TableNavigationLinksMode'
- bug #4703 Unsaved schema page exported as pdf.pdf
- bug #4707 Call to undefined method PMA_Schema_PDF::dieSchema()
- bug #4702 URL is non RFC-2396 compatible in get_scripts.js.php
4.3.6.0 (2015-01-07)
- bug Undefined index notices while configuring recent and favorite tables
- bug #4687 Designer breaks without configuration storage
- bug #4686 Select elements flicker and selects something else
- bug #4689 Setup tool creates "pma__favorites" incorrectly
- bug #4685 Call to a member function isUserType() on a non-object
- bug #4691 Do not include console when no server is selected
- bug #4688 File permissions in archive
- bug #4692 Dynamic javascripts gives 500 when db selected
4.3.5.0 (2015-01-05)
- bug Auto-configuration: tables were not created automatically
- bug #4677 Advanced feature checker does not check for favorite tables feature
- bug #4678 Some of the data stored in configuration storage are not deleted upon db or table delete
- bug #4679 Setup does not allow providing a name for favorites table
- bug #4680 Number of favorite table are not configurable in setup
- bug #4681 'Central columns table' field in setup does not have a description
- bug #4318 Default connection collation and sorting
- bug #4683 Relational data is not properly updated on table rename
- bug #4655 Undefined index: collation_connection (second patch)
- bug #4682 4.3.3 & 4.3.4 Import sql created by mysqldump fails on foreign keys
- bug #4676 Auto-configuration issues
- bug #4416 New lines are removed when grid editing (part two: TEXT)
--- Older ChangeLogs can be found on our project website ---
http://www.phpmyadmin.net/old-stuff/ChangeLogs/

2
README
View File

@ -1,7 +1,7 @@
phpMyAdmin - Readme
===================
Version 4.5.4.1
Version 4.5.5
A set of PHP-scripts to manage MySQL over the web.

View File

@ -20,7 +20,7 @@ $filename = CHANGELOG_FILE;
* Read changelog.
*/
// Check if the file is available, some distributions remove these.
if (is_readable($filename)) {
if (@is_readable($filename)) {
// Test if the if is in a compressed format
if (substr($filename, -3) == '.gz') {

View File

@ -51,7 +51,7 @@ copyright = u'2012 - 2014, The phpMyAdmin devel team'
# built documents.
#
# The short X.Y version.
version = '4.5.4.1'
version = '4.5.5'
# The full version, including alpha/beta/rc tags.
release = version

View File

@ -253,14 +253,25 @@ Verifying phpMyAdmin releases
+++++++++++++++++++++++++++++
Since July 2015 all phpMyAdmin releases are cryptographically signed by the
releasing developer, who is currently Marc Delisle. His key id is
releasing developer, who through January 2016 was Marc Delisle. His key id is
0x81AF644A, his PGP fingerprint is:
.. code-block:: console
436F F188 4B1A 0C3F DCBF 0D79 FEFC 65D1 81AF 644A
and you can get more identification information from `https://keybase.io/lem9 <https://keybase.io/lem9>`_. You should verify that the signature matches
and you can get more identification information from `https://keybase.io/lem9 <https://keybase.io/lem9>`_.
Beginning in January 2016, the release manager is Isaac Bennetch. His key id is
0x8259BD92, and his PGP fingerprint is:
.. code-block:: console
3D06 A59E CE73 0EB7 1B51 1C17 CE75 2F17 8259 BD92
and you can get more identification information from `https://keybase.io/ibennetch <https://keybase.io/ibennetch>`_.
You should verify that the signature matches
the archive you have downloaded. This way you can be sure that you are using
the same code that was released.
@ -269,9 +280,9 @@ for it. Once you have both of them in the same folder, you can verify the signat
.. code-block:: console
$ gpg --verify phpMyAdmin-4.4.9-all-languages.zip.asc
gpg: Signature made Fri Jun 12 13:09:58 2015 CEST using RSA key ID 81AF644A
gpg: Can't check signature: No public key
$ gpg --verify phpMyAdmin-4.5.4.1-all-languages.zip.asc
gpg: Signature made Fri 29 Jan 2016 08:59:37 AM EST using RSA key ID 8259BD92
gpg: Can't check signature: public key not found
As you can see gpg complains that it does not know the public key. At this
point you should do one of the following steps:
@ -286,9 +297,9 @@ point you should do one of the following steps:
.. code-block:: console
$ gpg --keyserver hkp://pgp.mit.edu --recv-keys 81AF644A
gpg: requesting key 81AF644A from hkp server pgp.mit.edu
gpg: key 81AF644A: public key "Marc Delisle <marc@infomarc.info>" imported
$ gpg --keyserver hkp://pgp.mit.edu --recv-keys 8259BD92
gpg: requesting key 8259BD92 from hkp server pgp.mit.edu
gpg: key 8259BD92: public key "Isaac Bennetch <bennetch@gmail.com>" imported
gpg: no ultimately trusted keys found
gpg: Total number processed: 1
gpg: imported: 1 (RSA: 1)
@ -299,12 +310,13 @@ in the key:
.. code-block:: console
$ gpg --verify phpMyAdmin-4.4.9-all-languages.zip.asc
gpg: Signature made Fri Jun 12 13:09:58 2015 CEST using RSA key ID 81AF644A
gpg: Good signature from "Marc Delisle <marc@infomarc.info>" [unknown]
$ gpg --verify phpMyAdmin-4.5.4.1-all-languages.zip.asc
gpg: Signature made Fri 29 Jan 2016 08:59:37 AM EST using RSA key ID 8259BD92
gpg: Good signature from "Isaac Bennetch <bennetch@gmail.com>"
gpg: aka "Isaac Bennetch <isaac@bennetch.org>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: 436F F188 4B1A 0C3F DCBF 0D79 FEFC 65D1 81AF 644A
Primary key fingerprint: 3D06 A59E CE73 0EB7 1B51 1C17 CE75 2F17 8259 BD92
The problem here is that anybody could issue the key with this name. You need to
ensure that the key is actually owned by the mentioned person. The GNU Privacy
@ -312,29 +324,29 @@ Handbook covers this topic in the chapter `Validating other keys on your public
keyring`_. The most reliable method is to meet the developer in person and
exchange key fingerprints, however you can also rely on the web of trust. This way
you can trust the key transitively though signatures of others, who have met
the developer in person. For example you can see how `Marc's key links to
the developer in person. For example you can see how `Isaac's key links to
Linus's key`_.
Once the key is trusted, the warning will not occur:
.. code-block:: console
$ gpg --verify phpMyAdmin-4.4.9-all-languages.zip.asc
gpg: Signature made Fri Jun 12 13:09:58 2015 CEST using RSA key ID 81AF644A
gpg: Good signature from "Marc Delisle <marc@infomarc.info>" [full]
$ gpg --verify phpMyAdmin-4.5.4.1-all-languages.zip.asc
gpg: Signature made Fri 29 Jan 2016 08:59:37 AM EST using RSA key ID 8259BD92
gpg: Good signature from "Isaac Bennetch <bennetch@gmail.com>" [full]
Should the signature be invalid (the archive has been changed), you would get a
clear error regardless of the fact that the key is trusted or not:
.. code-block:: console
$ gpg --verify phpMyAdmin-4.4.9-all-languages.zip.asc
gpg: Signature made Fri Jun 12 13:09:58 2015 CEST using RSA key ID 81AF644A
gpg: BAD signature from "Marc Delisle <marc@infomarc.info>" [unknown]
$ gpg --verify phpMyAdmin-4.5.4.1-all-languages.zip.asc
gpg: Signature made Fri 29 Jan 2016 08:59:37 AM EST using RSA key ID 8259BD92
gpg: BAD signature from "Isaac Bennetch <bennetch@gmail.com>" [unknown]
.. _Validating other keys on your public keyring: https://www.gnupg.org/gph/en/manual.html#AEN335
.. _Marc's key links to Linus's key: http://pgp.cs.uu.nl/mk_path.cgi?FROM=00411886&TO=81AF644A
.. _Isaac's key links to Linus's key: http://pgp.cs.uu.nl/mk_path.cgi?FROM=00411886&TO=8259BD92
.. index::
@ -652,3 +664,21 @@ are always ways to make your installation more secure:
* If you are afraid of automated attacks, enabling Captcha by
:config:option:`$cfg['CaptchaLoginPublicKey']` and
:config:option:`$cfg['CaptchaLoginPrivateKey']` might be an option.
Known issues
++++++++++++
Users with column-specific privileges are unable to "Browse"
------------------------------------------------------------
If a user has only column-specific privileges on some (but not all) columns in a table, "Browse"
will fail with an error message.
As a workaround, a bookmarked query with the same name as the table can be created, this will
run when using the "Browse" link instead. `Issue 11922 <https://github.com/phpmyadmin/phpmyadmin/issues/11922>`_.
Trouble logging back in after logging out using 'http' authentication
----------------------------------------------------------------------
When using the 'http' ``auth_type``, it can be impossible to log back in (when the logout comes
manually or after a period of inactivity). `Issue 11898 <https://github.com/phpmyadmin/phpmyadmin/issues/11898>`_.

View File

@ -64,6 +64,8 @@ if (isset($_REQUEST['console_bookmark_add'])) {
}
}
$format = '';
/**
* Sets globals from $_POST
*/
@ -450,7 +452,7 @@ if ($import_file != 'none' && ! $error) {
$tmp_subdir = sys_get_temp_dir();
}
$tmp_subdir = rtrim($tmp_subdir, DIRECTORY_SEPARATOR);
if (is_writable($tmp_subdir)) {
if (@is_writable($tmp_subdir)) {
$import_file_new = $tmp_subdir . DIRECTORY_SEPARATOR
. basename($import_file) . uniqid();
if (move_uploaded_file($import_file, $import_file_new)) {

View File

@ -543,7 +543,7 @@ if (! empty($_SESSION['encryption_key'])
* Check for existence of config directory which should not exist in
* production environment.
*/
if (file_exists('config')) {
if (@file_exists('config')) {
trigger_error(
__(
'Directory [code]config[/code], which is used by the setup script, ' .
@ -661,7 +661,7 @@ if ($cfg['SuhosinDisableWarning'] == false
*
* The data file is created while creating release by ./scripts/remove-incomplete-mo
*/
if (file_exists('libraries/language_stats.inc.php')) {
if (@file_exists('libraries/language_stats.inc.php')) {
include 'libraries/language_stats.inc.php';
/*
* This message is intentionally not translated, because we're

View File

@ -31,7 +31,8 @@ CodeMirror.sqlLint = function(text, updateLinting, options, cm) {
data: {
sql_query: text,
token: PMA_commonParams.get('token'),
server: PMA_commonParams.get('server')
server: PMA_commonParams.get('server'),
options: options.lintOptions,
},
success: handleResponse
});

View File

@ -3,6 +3,30 @@
* Functions used in configuration forms and on user preferences pages
*/
/**
* checks whether browser supports web storage
*
* @param type the type of storage i.e. localStorage or sessionStorage
*
* @returns bool
*/
function isStorageSupported(type)
{
try {
window[type].setItem('PMATest', 'test');
// Check whether key-value pair was set successfully
if (window[type].getItem('PMATest') === 'test') {
// Supported, remove test variable from storage
window[type].removeItem('PMATest');
return true;
}
} catch(error) {
// Not supported
PMA_ajaxShowMessage(PMA_messages.strNoLocalStorage, false);
}
return false;
}
/**
* Unbind all event handlers before tearing down a page
*/
@ -600,7 +624,7 @@ AJAX.registerOnload('config.js', function () {
var tab_check_fnc = function () {
if (location.hash != prev_hash) {
prev_hash = location.hash;
if (location.hash.match(/^#tab_.+/) && $('#' + location.hash.substr(5)).length) {
if (location.hash.match(/^#tab_[a-zA-Z0-9_]+/) && $('#' + location.hash.substr(5)).length) {
setTab(location.hash.substr(5));
}
}

View File

@ -116,11 +116,12 @@ function PMA_handleRedirectAndReload(data) {
/**
* Creates an SQL editor which supports auto completing etc.
*
* @param $textarea jQuery object wrapping the textarea to be made the editor
* @param options optional options for CodeMirror
* @param resize optional resizing ('vertical', 'horizontal', 'both')
* @param $textarea jQuery object wrapping the textarea to be made the editor
* @param options optional options for CodeMirror
* @param resize optional resizing ('vertical', 'horizontal', 'both')
* @param lintOptions additional options for lint
*/
function PMA_getSQLEditor($textarea, options, resize) {
function PMA_getSQLEditor($textarea, options, resize, lintOptions) {
if ($textarea.length > 0 && typeof CodeMirror !== 'undefined') {
// merge options for CodeMirror
@ -140,6 +141,7 @@ function PMA_getSQLEditor($textarea, options, resize) {
lint: {
"getAnnotations": CodeMirror.sqlLint,
"async": true,
"lintOptions": lintOptions
}
});
}
@ -872,6 +874,9 @@ AJAX.registerOnload('functions.js', function () {
updateTimeout = window.setTimeout(UpdateIdleTime, 2000);
}
} else { //timeout occurred
if(isStorageSupported('sessionStorage')){
window.sessionStorage.clear();
}
window.location.reload(true);
clearInterval(IncInterval);
}
@ -4743,30 +4748,6 @@ function PMA_ignorePhpErrors(clearPrevErrors){
$pmaErrors.remove();
}
/**
* checks whether browser supports web storage
*
* @param type the type of storage i.e. localStorage or sessionStorage
*
* @returns bool
*/
function isStorageSupported(type)
{
try {
window[type].setItem('PMATest', 'test');
// Check whether key-value pair was set successfully
if (window[type].getItem('PMATest') === 'test') {
// Supported, remove test variable from storage
window[type].removeItem('PMATest');
return true;
}
} catch(error) {
// Not supported
PMA_ajaxShowMessage(PMA_messages.strNoLocalStorage, false);
}
return false;
}
/**
* Unbind all event handlers before tearing down a page
*/

View File

@ -515,9 +515,6 @@ $(function () {
}
});
});
});
AJAX.registerOnload('navigation.js', function () {
// Check if session storage is supported
if (isStorageSupported('sessionStorage')) {
var storage = window.sessionStorage;

View File

@ -15,6 +15,8 @@ var RTE = {
*/
object: function (type) {
$.extend(this, RTE.COMMON);
this.editorType = type;
switch (type) {
case 'routine':
$.extend(this, RTE.ROUTINE);
@ -58,6 +60,10 @@ RTE.COMMON = {
* the jQueryUI dialog buttons
*/
buttonOptions: {},
/**
* @var editorType Type of the editor
*/
editorType: null,
/**
* Validate editor form fields.
*/
@ -360,7 +366,9 @@ RTE.COMMON = {
* the Definition textarea.
*/
var $elm = $('textarea[name=item_definition]').last();
that.syntaxHiglighter = PMA_getSQLEditor($elm);
var linterOptions = {};
linterOptions[that.editorType + '_editor'] = true;
that.syntaxHiglighter = PMA_getSQLEditor($elm, {}, null, linterOptions);
// Execute item-specific code
that.postDialogShow(data);

View File

@ -114,7 +114,7 @@ class PMA_Config
*/
public function checkSystem()
{
$this->set('PMA_VERSION', '4.5.4.1');
$this->set('PMA_VERSION', '4.5.5');
/**
* @deprecated
*/
@ -813,7 +813,7 @@ class PMA_Config
public function loadDefaults()
{
$cfg = array();
if (! file_exists($this->default_source)) {
if (! @file_exists($this->default_source)) {
$this->error_config_default_file = true;
return false;
}
@ -1166,12 +1166,12 @@ class PMA_Config
return false;
}
if (! file_exists($this->getSource())) {
if (! @file_exists($this->getSource())) {
$this->source_mtime = 0;
return false;
}
if (! is_readable($this->getSource())) {
if (! @is_readable($this->getSource())) {
// manually check if file is readable
// might be bug #3059806 Supporting running from CIFS/Samba shares

View File

@ -425,40 +425,39 @@ class PMA_Error extends PMA_Message
* prevent path disclosure in error message,
* and make users feel safe to submit error reports
*
* @param string $dest path to be shorten
* @param string $path path to be shorten
*
* @return string shortened path
*/
public static function relPath($dest)
public static function relPath($path)
{
$dest = realpath($dest);
$dest = @realpath($path);
if (substr(PHP_OS, 0, 3) == 'WIN') {
$separator = '\\';
} else {
$separator = '/';
/* Probably affected by open_basedir */
if ($dest === FALSE) {
return $path;
}
$Ahere = explode(
$separator,
realpath(__DIR__ . $separator . '..')
DIRECTORY_SEPARATOR,
realpath(__DIR__ . DIRECTORY_SEPARATOR . '..')
);
$Adest = explode($separator, $dest);
$Adest = explode(DIRECTORY_SEPARATOR, $dest);
$result = '.';
// && count ($Adest)>0 && count($Ahere)>0 )
while (implode($separator, $Adest) != implode($separator, $Ahere)) {
while (implode(DIRECTORY_SEPARATOR, $Adest) != implode(DIRECTORY_SEPARATOR, $Ahere)) {
if (count($Ahere) > count($Adest)) {
array_pop($Ahere);
$result .= $separator . '..';
$result .= DIRECTORY_SEPARATOR . '..';
} else {
array_pop($Adest);
}
}
$path = $result . str_replace(implode($separator, $Adest), '', $dest);
$path = $result . str_replace(implode(DIRECTORY_SEPARATOR, $Adest), '', $dest);
return str_replace(
$separator . $separator,
$separator,
DIRECTORY_SEPARATOR . PATH_SEPARATOR,
DIRECTORY_SEPARATOR,
$path
);
}

View File

@ -441,10 +441,7 @@ class PMA_File
{
// suppress warnings from being displayed, but not from being logged
// any file access outside of open_basedir will issue a warning
ob_start();
$is_readable = is_readable($this->getName());
ob_end_clean();
return $is_readable;
return @is_readable($this->getName());
}
/**
@ -463,7 +460,7 @@ class PMA_File
}
if (empty($GLOBALS['cfg']['TempDir'])
|| ! is_writable($GLOBALS['cfg']['TempDir'])
|| ! @is_writable($GLOBALS['cfg']['TempDir'])
) {
// cannot create directory or access, point user to FAQ 1.11
$this->_error_message = __(

View File

@ -200,12 +200,12 @@ class PMA_Header
$this->_scripts->addFile(
'get_image.js.php?theme=' . $theme_id
);
$this->_scripts->addFile('config.js');
$this->_scripts->addFile('doclinks.js');
$this->_scripts->addFile('functions.js');
$this->_scripts->addFile('navigation.js');
$this->_scripts->addFile('indexes.js');
$this->_scripts->addFile('common.js');
$this->_scripts->addFile('config.js');
$this->_scripts->addFile('page_settings.js');
$this->_scripts->addCode($this->getJsParamsCode());
}

View File

@ -518,7 +518,7 @@ class PMA_Util
if (defined('TESTSUITE')) {
/* Provide consistent URL for testsuite */
return PMA_linkURL('http://docs.phpmyadmin.net/en/latest/' . $url);
} else if (file_exists('doc/html/index.html')) {
} else if (@file_exists('doc/html/index.html')) {
if (defined('PMA_SETUP')) {
return '../doc/html/' . $url;
} else {
@ -4897,6 +4897,7 @@ class PMA_Util
'ENGINE' => '',
'TABLE_TYPE' => '',
'TABLE_ROWS' => 0,
'TABLE_COMMENT' => '',
);
}
} // end while

View File

@ -87,12 +87,19 @@ class VersionInformation
}
}
/* Parse response */
$data = json_decode($response);
if (is_object($data)
&& ! empty($data->version)
&& ! empty($data->date)
&& $save
/* Basic sanity checking */
if (! is_object($data)
|| empty($data->version)
|| empty($data->releases)
|| empty($data->date)
) {
return null;
}
if ($save) {
if (! isset($_SESSION) && ! defined('TESTSUITE')) {
ini_set('session.use_only_cookies', 'false');
ini_set('session.use_cookies', 'false');
@ -267,4 +274,4 @@ class VersionInformation
return PMA_Util::cacheGet('PMA_MYSQL_STR_VERSION');
}
}
?>
?>

View File

@ -207,6 +207,20 @@ foreach (get_defined_vars() as $key => $value) {
}
unset($key, $value, $variables_whitelist);
/**
* @global boolean $GLOBALS['is_ajax_request']
* @todo should this be moved to the variables init section above?
*
* Check if the current request is an AJAX request, and set is_ajax_request
* accordingly. Suppress headers, footers and unnecessary output if set to
* true
*/
if (isset($_REQUEST['ajax_request']) && $_REQUEST['ajax_request'] == true) {
$GLOBALS['is_ajax_request'] = true;
} else {
$GLOBALS['is_ajax_request'] = false;
}
/**
* Subforms - some functions need to be called by form, cause of the limited URL
@ -1175,20 +1189,6 @@ $GLOBALS['PMA_Config']->set('default_server', '');
/* Tell tracker that it can actually work */
PMA_Tracker::enable();
/**
* @global boolean $GLOBALS['is_ajax_request']
* @todo should this be moved to the variables init section above?
*
* Check if the current request is an AJAX request, and set is_ajax_request
* accordingly. Suppress headers, footers and unnecessary output if set to
* true
*/
if (isset($_REQUEST['ajax_request']) && $_REQUEST['ajax_request'] == true) {
$GLOBALS['is_ajax_request'] = true;
} else {
$GLOBALS['is_ajax_request'] = false;
}
if (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS'])) {
PMA_fatalError(__("GLOBALS overwrite attempt"));
}

View File

@ -220,7 +220,7 @@ function PMA_fatalError(
$error_message = vsprintf($error_message, $message_args);
}
if ($GLOBALS['is_ajax_request']) {
if (! empty($GLOBALS['is_ajax_request']) && $GLOBALS['is_ajax_request']) {
$response = PMA_Response::getInstance();
$response->isSuccess(false);
$response->addJSON('message', PMA_Message::error($error_message));

View File

@ -194,7 +194,7 @@ function PMA_sendErrorReport($report)
array(
'method' => 'POST',
'content' => $data_string,
'header' => "Content-Type: multipart/form-data\r\n",
'header' => "Content-Type: application/json\r\n",
)
);
$context = PMA_Util::handleContext($context);
@ -216,7 +216,10 @@ function PMA_sendErrorReport($report)
}
$curl_handle = PMA_Util::configureCurl($curl_handle);
curl_setopt($curl_handle, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl_handle, CURLOPT_HTTPHEADER, array('Expect:'));
curl_setopt(
$curl_handle, CURLOPT_HTTPHEADER,
array('Expect:', 'Content-Type: application/json')
);
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($curl_handle);

View File

@ -339,7 +339,7 @@ function PMA_openExportFile($filename, $quick_export)
)
);
$message->addParam($save_filename);
} elseif (is_file($save_filename) && ! is_writable($save_filename)) {
} elseif (is_file($save_filename) && ! @is_writable($save_filename)) {
$message = PMA_Message::error(
__(
'The web server does not have permission '

View File

@ -19,7 +19,7 @@ if (! defined('PHPMYADMIN')) {
*/
function PMA_getDirContent($dir, $expression = '')
{
if (!file_exists($dir) || !($handle = @opendir($dir))) {
if (!@file_exists($dir) || !($handle = @opendir($dir))) {
return false;
}
@ -28,7 +28,7 @@ function PMA_getDirContent($dir, $expression = '')
$dir .= '/';
}
while ($file = @readdir($handle)) {
if (is_file($dir . $file)
if (@is_file($dir . $file)
&& ($expression == '' || preg_match($expression, $file))
) {
$result[] = $file;

View File

@ -1273,6 +1273,13 @@ function PMA_getValueColumnForOtherDatatypes($column, $default_char_editing,
$onChangeClause, $tabindex, $tabindex_for_value, $idindex, $data_type
);
$virtual = array(
'VIRTUAL', 'PERSISTENT', 'VIRTUAL GENERATED', 'STORED GENERATED'
);
if (in_array($column['Extra'], $virtual)) {
$html_output .= '<input type="hidden" name="virtual'
. $column_name_appendix . '" value="1" />';
}
if ($column['Extra'] == 'auto_increment') {
$html_output .= '<input type="hidden" name="auto_increment'
. $column_name_appendix . '" value="1" />';
@ -2274,13 +2281,15 @@ function PMA_getQueryValuesForInsertAndUpdateInMultipleEdit($multi_edit_columns_
* @param boolean $using_key whether editing or new row
* @param string $where_clause where clause
* @param string $table table name
* @param array $multi_edit_funcs multiple edit functions array
*
* @return string $current_value current column value in the form
*/
function PMA_getCurrentValueForDifferentTypes($possibly_uploaded_val, $key,
$multi_edit_columns_type, $current_value, $multi_edit_auto_increment,
$rownumber, $multi_edit_columns_name, $multi_edit_columns_null,
$multi_edit_columns_null_prev, $is_insert, $using_key, $where_clause, $table
$multi_edit_columns_null_prev, $is_insert, $using_key, $where_clause, $table,
$multi_edit_funcs
) {
// Fetch the current values of a row to use in case we have a protected field
if ($is_insert
@ -2295,6 +2304,8 @@ function PMA_getCurrentValueForDifferentTypes($possibly_uploaded_val, $key,
if (false !== $possibly_uploaded_val) {
$current_value = $possibly_uploaded_val;
} else if (! empty($multi_edit_funcs[$key])) {
$current_value = "'" . PMA_Util::sqlAddSlashes($current_value) . "'";
} else {
// c o l u m n v a l u e i n t h e f o r m
if (isset($multi_edit_columns_type[$key])) {

View File

@ -588,6 +588,8 @@ function PMA_AdjustPrivileges_moveDB($oldDb, $newname)
&& $GLOBALS['is_reload_priv']
) {
$GLOBALS['dbi']->selectDb('mysql');
$newname = str_replace("_", "\_", $newname);
$oldDb = str_replace("_", "\_", $oldDb);
// For Db specific privileges
$query_db_specific = 'UPDATE ' . PMA_Util::backquote('db')
@ -636,6 +638,8 @@ function PMA_AdjustPrivileges_copyDB($oldDb, $newname)
&& $GLOBALS['is_reload_priv']
) {
$GLOBALS['dbi']->selectDb('mysql');
$newname = str_replace("_", "\_", $newname);
$oldDb = str_replace("_", "\_", $oldDb);
$query_db_specific_old = 'SELECT * FROM '
. PMA_Util::backquote('db') . ' WHERE '

View File

@ -244,7 +244,7 @@ function _setlocale($category, $locale) {
function _bindtextdomain($domain, $path) {
global $text_domains;
// ensure $path ends with a slash ('/' should work for both, but lets still play nice)
if (substr(php_uname(), 0, 7) == "Windows") {
if (DIRECTORY_SEPARATOR == '\\') {
if ($path[strlen($path)-1] != '\\' and $path[strlen($path)-1] != '/')
$path .= '\\';
} else {

View File

@ -115,7 +115,7 @@ class AuthenticationCookie extends AuthenticationPlugin
$header->disableMenuAndConsole();
$header->disableWarnings();
if (file_exists(CUSTOM_HEADER_FILE)) {
if (@file_exists(CUSTOM_HEADER_FILE)) {
include CUSTOM_HEADER_FILE;
}
echo '
@ -263,7 +263,7 @@ class AuthenticationCookie extends AuthenticationPlugin
echo '</div>';
}
echo '</div>';
if (file_exists(CUSTOM_FOOTER_FILE)) {
if (@file_exists(CUSTOM_FOOTER_FILE)) {
include CUSTOM_FOOTER_FILE;
}
if (! defined('TESTSUITE')) {

View File

@ -103,7 +103,7 @@ class AuthenticationHttp extends AuthenticationPlugin
);
$response->addHTML('</h3>');
if (file_exists(CUSTOM_FOOTER_FILE)) {
if (@file_exists(CUSTOM_FOOTER_FILE)) {
include CUSTOM_FOOTER_FILE;
}

View File

@ -24,7 +24,7 @@ function Swekey_Auth_check()
$_SESSION['SWEKEY'] = array();
}
$_SESSION['SWEKEY']['ENABLED'] = (! empty($confFile) && file_exists($confFile));
$_SESSION['SWEKEY']['ENABLED'] = (! empty($confFile) && @file_exists($confFile));
// Load the swekey.conf file the first time
if ($_SESSION['SWEKEY']['ENABLED']
@ -169,7 +169,7 @@ function Swekey_Auth_error()
// echo "<!-- exists -->\n";
}
if (file_exists($caFile)) {
if (@file_exists($caFile)) {
Swekey_SetCAFile($caFile);
} elseif (! empty($caFile)
&& (substr($_SESSION['SWEKEY']['CONF_SERVER_CHECK'], 0, 8) == "https://")

View File

@ -13,7 +13,7 @@ if (! defined('PHPMYADMIN')) {
/**
* Skip the plugin if TCPDF is not available.
*/
if (! file_exists(TCPDF_INC)) {
if (! @file_exists(TCPDF_INC)) {
$GLOBALS['skip_import'] = true;
return;
}

View File

@ -1551,6 +1551,12 @@ class ExportSql extends ExportPlugin
// analysis.
if (!$view) {
if (empty($sql_backquotes)) {
// Option "Enclose table and column names with backquotes"
// was checked.
Context::$MODE |= Context::NO_ENCLOSING_QUOTES;
}
// Using appropriate quotes.
if (($compat === 'MSSQL') || ($sql_backquotes === '"')) {
SqlParser\Context::$MODE |= SqlParser\Context::ANSI_QUOTES;
@ -1621,7 +1627,9 @@ class ExportSql extends ExportPlugin
$indexes_fulltext[] = $field->build($field);
unset($statement->fields[$key]);
} else if (empty($GLOBALS['sql_if_not_exists'])) {
$indexes[] = $field->build($field);
$indexes[] = str_replace(
'COMMENT=\'', 'COMMENT \'', $field::build($field)
);
unset($statement->fields[$key]);
}
}

View File

@ -149,7 +149,7 @@ class ImportOds extends ImportPlugin
* result in increased performance without the need to
* alter the code in any way. It's basically a freebee.
*/
$xml = simplexml_load_string($buffer, "SimpleXMLElement", LIBXML_COMPACT);
$xml = @simplexml_load_string($buffer, "SimpleXMLElement", LIBXML_COMPACT);
unset($buffer);

View File

@ -88,7 +88,7 @@ class ImportShp extends ImportPlugin
// and use the files in it for import
if ($compression == 'application/zip'
&& ! empty($GLOBALS['cfg']['TempDir'])
&& is_writable($GLOBALS['cfg']['TempDir'])
&& @is_writable($GLOBALS['cfg']['TempDir'])
) {
$dbf_file_name = PMA_findFileFromZipArchive(
'/^.*\.dbf$/i', $import_file

View File

@ -106,7 +106,7 @@ class ImportXml extends ImportPlugin
* result in increased performance without the need to
* alter the code in any way. It's basically a freebee.
*/
$xml = simplexml_load_string($buffer, "SimpleXMLElement", LIBXML_COMPACT);
$xml = @simplexml_load_string($buffer, "SimpleXMLElement", LIBXML_COMPACT);
unset($buffer);

View File

@ -12,7 +12,7 @@ if (! defined('PHPMYADMIN')) {
/**
* Skip the plugin if TCPDF is not available.
*/
if (! file_exists(TCPDF_INC)) {
if (! @file_exists(TCPDF_INC)) {
$GLOBALS['skip_import'] = true;
return;
}

View File

@ -97,7 +97,8 @@ function PMA_getRelationsParamDiagnostic($cfgRelation)
$messages['disabled'] = '<font color="red">' . __('Disabled') . '</font>';
if (empty($cfgRelation['db'])) {
$retval .= __('Configuration of pmadb… ')
$retval .= __('Configuration of pmadb…')
. ' '
. $messages['error']
. PMA_Util::showDocu('setup', 'linked-tables')
. '<br />' . "\n"

View File

@ -454,7 +454,7 @@ function PMA_langList()
$path = $GLOBALS['lang_path'] . '/' . $file . '/LC_MESSAGES/phpmyadmin.mo';
if ($file != "."
&& $file != ".."
&& file_exists($path)
&& @file_exists($path)
) {
$result[$file] = PMA_langDetails($file);
}

View File

@ -165,6 +165,9 @@ function PMA_getHtmlForServerProcesslist()
if ($is_sorted && $_REQUEST['sort_order'] === 'ASC') {
$column['sort_order'] = 'DESC';
}
if (isset($_REQUEST['showExecuting'])) {
$column['showExecuting'] = 'on';
}
$retval .= '<th>';
$columnUrl = PMA_URL_getCommon($column);
@ -244,7 +247,12 @@ function PMA_getHtmlForProcessListFilter()
}
$url_params = array(
'ajax_request' => true
'ajax_request' => true,
'full' => (isset($_REQUEST['full']) ? $_REQUEST['full'] : ''),
'column_name' => (isset($_REQUEST['column_name']) ? $_REQUEST['column_name'] : ''),
'order_by_field'
=> (isset($_REQUEST['order_by_field']) ? $_REQUEST['order_by_field'] : ''),
'sort_order' => (isset($_REQUEST['sort_order']) ? $_REQUEST['sort_order'] : ''),
);
$retval = '';

View File

@ -63,6 +63,12 @@ class AutoloaderInit
}
}
// php-gettext is used to translate error messages.
// This must be included before any class of the parser is loaded because
// if there is no `__` function defined, the library defines a dummy one
// in `common.php`.
require_once './libraries/php-gettext/gettext.inc';
// Initializing the autoloader.
return AutoloaderInit::getLoader(
array(

View File

@ -172,8 +172,8 @@ class AlterOperation extends Component
$parser,
$list,
array(
'noAlias' => true,
'noBrackets' => true,
'breakOnAlias' => true,
'parseField' => 'column',
)
);
if ($ret->field === null) {

View File

@ -63,20 +63,32 @@ class ArrayObj extends Component
$ret = empty($options['type']) ? new ArrayObj() : array();
/**
* The state of the parser.
* The last raw expression.
*
* Below are the states of the parser.
*
* 0 -----------------------[ ( ]------------------------> 1
*
* 1 ------------------[ array element ]-----------------> 2
*
* 2 ------------------------[ , ]-----------------------> 1
* 2 ------------------------[ ) ]-----------------------> (END)
*
* @var int $state
* @var string $lastRaw
*/
$state = 0;
$lastRaw = '';
/**
* The last value.
*
* @var string $lastValue
*/
$lastValue = '';
/**
* Counts brackets.
*
* @var int $brackets
*/
$brackets = 0;
/**
* Last separator (bracket or comma).
*
* @var boolean $isCommaLast
*/
$isCommaLast = false;
for (; $list->idx < $list->count; ++$list->idx) {
/**
@ -92,49 +104,72 @@ class ArrayObj extends Component
}
// Skipping whitespaces and comments.
if (($token->type === Token::TYPE_WHITESPACE) || ($token->type === Token::TYPE_COMMENT)) {
if (($token->type === Token::TYPE_WHITESPACE)
|| ($token->type === Token::TYPE_COMMENT)
) {
$lastRaw .= $token->token;
$lastValue = trim($lastValue) .' ';
continue;
}
if ($state === 0) {
if (($token->type !== Token::TYPE_OPERATOR) || ($token->value !== '(')) {
$parser->error(
__('An opening bracket was expected.'),
$token
);
break;
}
$state = 1;
} elseif ($state === 1) {
if (($token->type === Token::TYPE_OPERATOR) && ($token->value === ')')) {
// Empty array.
break;
}
if (empty($options['type'])) {
$ret->values[] = $token->value;
$ret->raw[] = $token->token;
} else {
$ret[] = $options['type']::parse(
$parser,
$list,
empty($options['typeOptions']) ? array() : $options['typeOptions']
);
}
$state = 2;
} elseif ($state === 2) {
if (($token->type !== Token::TYPE_OPERATOR) || (($token->value !== ',') && ($token->value !== ')'))) {
$parser->error(
__('A comma or a closing bracket was expected'),
$token
);
break;
}
if ($token->value === ',') {
$state = 1;
} else { // )
break;
if (($brackets === 0)
&& (($token->type !== Token::TYPE_OPERATOR)
|| ($token->value !== '('))
) {
$parser->error(__('An opening bracket was expected.'), $token);
break;
}
if ($token->type === Token::TYPE_OPERATOR) {
if ($token->value === '(') {
if (++$brackets === 1) { // 1 is the base level.
continue;
}
} elseif ($token->value === ')') {
if (--$brackets === 0) { // Array ended.
break;
}
} elseif ($token->value === ',') {
if ($brackets === 1) {
$isCommaLast = true;
if (empty($options['type'])) {
$ret->raw[] = trim($lastRaw);
$ret->values[] = trim($lastValue);
$lastRaw = $lastValue = '';
}
}
continue;
}
}
if (empty($options['type'])) {
$lastRaw .= $token->token;
$lastValue .= $token->value;
} else {
$ret[] = $options['type']::parse(
$parser,
$list,
empty($options['typeOptions']) ? array() : $options['typeOptions']
);
}
}
// Handling last element.
//
// This is treated differently to treat the following cases:
//
// => array()
// (,) => array('', '')
// () => array()
// (a,) => array('a', '')
// (a) => array('a')
//
$lastRaw = trim($lastRaw);
if ((empty($options['type']))
&& ((strlen($lastRaw) > 0) || ($isCommaLast))
) {
$ret->raw[] = $lastRaw;
$ret->values[] = trim($lastValue);
}
return $ret;

View File

@ -30,18 +30,20 @@ class Condition extends Component
*
* @var array
*/
public static $DELIMITERS = array('&&', 'AND', 'OR', 'XOR', '||');
public static $DELIMITERS = array('&&', '||', 'AND', 'OR', 'XOR');
/**
* Hash map containing reserved keywords that are also operators.
* List of allowed reserved keywords in conditions.
*
* @var array
*/
public static $OPERATORS = array(
public static $ALLOWED_KEYWORDS = array(
'AND' => 1,
'BETWEEN' => 1,
'EXISTS' => 1,
'IF' => 1,
'IN' => 1,
'INTERVAL' => 1,
'IS' => 1,
'LIKE' => 1,
'MATCH' => 1,
@ -106,6 +108,7 @@ class Condition extends Component
/**
* Whether there was a `BETWEEN` keyword before or not.
*
* It is required to keep track of them because their structure contains
* the keyword `AND`, which is also an operator that delimits
* expressions.
@ -115,6 +118,7 @@ class Condition extends Component
$betweenBefore = false;
for (; $list->idx < $list->count; ++$list->idx) {
/**
* Token parsed at this moment.
*
@ -142,11 +146,12 @@ class Condition extends Component
// Conditions are delimited by logical operators.
if (in_array($token->value, static::$DELIMITERS, true)) {
if (($betweenBefore) && ($token->value === 'AND')) {
// The syntax of keyword `BETWEEN` is hard-coded.
$betweenBefore = false;
} else {
// The expression ended.
$expr->expr = trim($expr->expr);
if (!empty($expr->expr)) {
// Adding the condition that is delimited by this operator.
$ret[] = $expr;
}
@ -155,11 +160,21 @@ class Condition extends Component
$expr->isOperator = true;
$ret[] = $expr;
// Preparing to parse another condition.
$expr = new Condition();
continue;
}
}
if (($token->type === Token::TYPE_KEYWORD) && ($token->flags & Token::FLAG_KEYWORD_RESERVED)) {
if ($token->value === 'BETWEEN') {
$betweenBefore = true;
}
if (($brackets === 0) && (empty(static::$ALLOWED_KEYWORDS[$token->value]))) {
break;
}
}
if ($token->type === Token::TYPE_OPERATOR) {
if ($token->value === '(') {
++$brackets;
@ -168,23 +183,16 @@ class Condition extends Component
}
}
// No keyword is expected.
if (($token->type === Token::TYPE_KEYWORD) && ($token->flags & Token::FLAG_KEYWORD_RESERVED)) {
if ($token->value === 'BETWEEN') {
$betweenBefore = true;
}
if (($brackets === 0) && (empty(static::$OPERATORS[$token->value]))) {
break;
}
}
$expr->expr .= $token->token;
if (($token->type === Token::TYPE_NONE)
|| (($token->type === Token::TYPE_KEYWORD) && (!($token->flags & Token::FLAG_KEYWORD_RESERVED)))
|| (($token->type === Token::TYPE_KEYWORD)
&& (!($token->flags & Token::FLAG_KEYWORD_RESERVED)))
|| ($token->type === Token::TYPE_STRING)
|| ($token->type === Token::TYPE_SYMBOL)
) {
$expr->identifiers[] = $token->value;
if (!in_array($token->value, $expr->identifiers)) {
$expr->identifiers[] = $token->value;
}
}
}

View File

@ -43,7 +43,7 @@ class CreateDefinition extends Component
'NOT NULL' => 1,
'NULL' => 1,
'DEFAULT' => array(2, 'var'),
'DEFAULT' => array(2, 'expr'),
'AUTO_INCREMENT' => 3,
'PRIMARY' => 4,
'PRIMARY KEY' => 4,
@ -55,7 +55,7 @@ class CreateDefinition extends Component
// Generated columns options.
'GENERATED ALWAYS' => 8,
'AS' => array(9, 'expr', array('bracketsDelimited' => true)),
'AS' => array(9, 'expr', array('parenthesesDelimited' => true)),
'VIRTUAL' => 10,
'PERSISTENT' => 11,
'STORED' => 11,

View File

@ -28,6 +28,15 @@ use SqlParser\TokensList;
class Expression extends Component
{
/**
* List of allowed reserved keywords in expressions.
*
* @var array
*/
private static $ALLOWED_KEYWORDS = array(
'AS' => 1, 'DUAL' => 1, 'NULL' => 1, 'REGEXP' => 1
);
/**
* The name of this database.
*
@ -110,6 +119,31 @@ class Expression extends Component
}
/**
* Possible options:
*
* `field`
*
* First field to be filled.
* If this is not specified, it takes the value of `parseField`.
*
* `parseField`
*
* Specifies the type of the field parsed. It may be `database`,
* `table` or `column`. These expressions may not include
* parentheses.
*
* `breakOnAlias`
*
* If not empty, breaks when the alias occurs (it is not included).
*
* `breakOnParentheses`
*
* If not empty, breaks when the first parentheses occurs.
*
* `parenthesesDelimited`
*
* If not empty, breaks after last parentheses occurred.
*
* @param Parser $parser The parser that serves as context.
* @param TokensList $list The list of tokens that are being parsed.
* @param array $options Parameters for parsing.
@ -137,9 +171,9 @@ class Expression extends Component
/**
* Whether an alias is expected. Is 2 if `AS` keyword was found.
*
* @var int $alias
* @var bool $alias
*/
$alias = 0;
$alias = false;
/**
* Counts brackets.
@ -149,17 +183,20 @@ class Expression extends Component
$brackets = 0;
/**
* Keeps track of the previous token.
* Possible values:
* string, if function was previously found;
* true, if opening bracket was previously found;
* null, in any other case.
* Keeps track of the last two previous tokens.
*
* @var string|bool $prev
* @var Token[] $prev
*/
$prev = null;
$prev = array(null, null);
// When a field is parsed, no parentheses are expected.
if (!empty($options['parseField'])) {
$options['breakOnParentheses'] = true;
$options['field'] = $options['parseField'];
}
for (; $list->idx < $list->count; ++$list->idx) {
/**
* Token parsed at this moment.
*
@ -173,59 +210,92 @@ class Expression extends Component
}
// Skipping whitespaces and comments.
if (($token->type === Token::TYPE_WHITESPACE) || ($token->type === Token::TYPE_COMMENT)) {
if (($isExpr) && (!$alias)) {
if (($token->type === Token::TYPE_WHITESPACE)
|| ($token->type === Token::TYPE_COMMENT)
) {
if ($isExpr) {
$ret->expr .= $token->token;
}
if (($alias === 0) && (empty($options['noAlias'])) && (!$isExpr) && (!$dot) && (!empty($ret->expr))) {
$alias = 1;
}
continue;
}
if (($token->type === Token::TYPE_KEYWORD)
&& ($token->flags & Token::FLAG_KEYWORD_RESERVED)
&& ($token->value !== 'DUAL')
&& ($token->value !== 'NULL')
) {
// Keywords may be found only between brackets.
if ($brackets === 0) {
if ((empty($options['noAlias'])) && ($token->value === 'AS')) {
$alias = 2;
continue;
}
if (!($token->flags & Token::FLAG_KEYWORD_FUNCTION)) {
if ($token->type === Token::TYPE_KEYWORD) {
if (($brackets > 0) && (empty($ret->subquery))
&& (!empty(Parser::$STATEMENT_PARSERS[$token->value]))
) {
// A `(` was previously found and this keyword is the
// beginning of a statement, so this is a subquery.
$ret->subquery = $token->value;
} elseif (($token->flags & Token::FLAG_KEYWORD_FUNCTION)
&& (empty($options['parseField']))
) {
$isExpr = true;
} elseif (($token->flags & Token::FLAG_KEYWORD_RESERVED)
&& ($brackets === 0)
) {
if (empty(self::$ALLOWED_KEYWORDS[$token->value])) {
// A reserved keyword that is not allowed in the
// expression was found so the expression must have
// ended and a new clause is starting.
break;
}
} elseif ($prev === true) {
if ((empty($ret->subquery) && (!empty(Parser::$STATEMENT_PARSERS[$token->value])))) {
// A `(` was previously found and this keyword is the
// beginning of a statement, so this is a subquery.
$ret->subquery = $token->value;
if ($token->value === 'AS') {
if (!empty($options['breakOnAlias'])) {
break;
}
if (!empty($ret->alias)) {
$parser->error(
__('An alias was previously found.'),
$token
);
break;
}
$alias = true;
continue;
}
$isExpr = true;
}
}
if (($token->type === Token::TYPE_NUMBER)
|| ($token->type === Token::TYPE_BOOL)
|| (($token->type === Token::TYPE_SYMBOL)
&& ($token->flags & Token::FLAG_SYMBOL_VARIABLE))
|| (($token->type === Token::TYPE_OPERATOR)
&& ($token->value !== '.'))
) {
if (!empty($options['parseField'])) {
break;
}
// Numbers, booleans and operators (except dot) are usually part
// of expressions.
$isExpr = true;
}
if ($token->type === Token::TYPE_OPERATOR) {
if ((!empty($options['noBrackets']))
if ((!empty($options['breakOnParentheses']))
&& (($token->value === '(') || ($token->value === ')'))
) {
// No brackets were expected.
break;
}
if ($token->value === '(') {
++$brackets;
if ((empty($ret->function)) && ($prev !== null) && ($prev !== true)) {
// A function name was previously found and now an open
// bracket, so this is a function call.
$ret->function = $prev;
if ((empty($ret->function)) && ($prev[1] !== null)
&& (($prev[1]->type === Token::TYPE_NONE)
|| ($prev[1]->type === Token::TYPE_SYMBOL)
|| (($prev[1]->type === Token::TYPE_KEYWORD)
&& ($prev[1]->flags & Token::FLAG_KEYWORD_FUNCTION)))
) {
$ret->function = $prev[1]->value;
}
$isExpr = true;
} elseif ($token->value === ')') {
--$brackets;
if ($brackets === 0) {
if (!empty($options['bracketsDelimited'])) {
// The current token is the last brackets, the next
// one will be outside.
if (!empty($options['parenthesesDelimited'])) {
// The current token is the last bracket, the next
// one will be outside the expression.
$ret->expr .= $token->token;
++$list->idx;
break;
@ -236,109 +306,88 @@ class Expression extends Component
break;
}
} elseif ($token->value === ',') {
// Expressions are comma-delimited.
if ($brackets === 0) {
break;
}
}
}
if (($token->type === Token::TYPE_NUMBER) || ($token->type === Token::TYPE_BOOL)
|| (($token->type === Token::TYPE_SYMBOL) && ($token->flags & Token::FLAG_SYMBOL_VARIABLE))
|| (($token->type === Token::TYPE_OPERATOR)) && ($token->value !== '.')
) {
// Numbers, booleans and operators are usually part of expressions.
$isExpr = true;
}
// Saving the previous tokens.
$prev[0] = $prev[1];
$prev[1] = $token;
if ($alias) {
// An alias is expected (the keyword `AS` was previously found).
if (!empty($ret->alias)) {
$parser->error(__('An alias was previously found.'), $token);
break;
}
$ret->alias = $token->value;
$alias = 0;
} else {
if (!$isExpr) {
if (($token->type === Token::TYPE_OPERATOR) && ($token->value === '.')) {
// Found a `.` which means we expect a column name and
// the column name we parsed is actually the table name
// and the table name is actually a database name.
if ((!empty($ret->database)) || ($dot)) {
$parser->error(__('Unexpected dot.'), $token);
}
$ret->database = $ret->table;
$ret->table = $ret->column;
$ret->column = null;
$dot = true;
} else {
// We found the name of a column (or table if column
// field should be skipped; used to parse table names).
$field = (!empty($options['skipColumn'])) ? 'table' : 'column';
if (!empty($ret->$field)) {
// No alias is expected.
if (!empty($options['noAlias'])) {
break;
}
// Parsing aliases without `AS` keyword and any
// whitespace.
// Example: SELECT 1`foo`
if (($token->type === Token::TYPE_STRING)
|| (($token->type === Token::TYPE_SYMBOL)
&& ($token->flags & Token::FLAG_SYMBOL_BACKTICK))
) {
if (!empty($ret->alias)) {
$parser->error(
__('An alias was previously found.'),
$token
);
}
$ret->alias = $token->value;
}
} else {
$ret->$field = $token->value;
}
$dot = false;
$alias = false;
} elseif ($isExpr) {
// Handling aliases.
if (/* (empty($ret->alias)) && */ ($brackets === 0)
&& (($prev[0] === null)
|| ((($prev[0]->type !== Token::TYPE_OPERATOR)
|| ($prev[0]->token === ')'))
&& (($prev[0]->type !== Token::TYPE_KEYWORD)
|| (!($prev[0]->flags & Token::FLAG_KEYWORD_RESERVED)))))
&& (($prev[1]->type === Token::TYPE_STRING)
|| (($prev[1]->type === Token::TYPE_SYMBOL)
&& (!($prev[1]->flags & Token::FLAG_SYMBOL_VARIABLE)))
|| ($prev[1]->type === Token::TYPE_NONE))
) {
if (!empty($ret->alias)) {
$parser->error(__('An alias was previously found.'), $token);
break;
}
$ret->alias = $prev[1]->value;
} else {
// Parsing aliases without `AS` keyword.
// Example: SELECT 'foo' `bar`
if (($brackets === 0) && (empty($options['noAlias']))) {
if (($token->type === Token::TYPE_NONE) || ($token->type === Token::TYPE_STRING)
|| (($token->type === Token::TYPE_SYMBOL) && ($token->flags & Token::FLAG_SYMBOL_BACKTICK))
) {
if (!empty($ret->alias)) {
$parser->error(
__('An alias was previously found.'),
$token
);
}
$ret->alias = $token->value;
continue;
$ret->expr .= $token->token;
}
} elseif (!$isExpr) {
if (($token->type === Token::TYPE_OPERATOR) && ($token->value === '.')) {
// Found a `.` which means we expect a column name and
// the column name we parsed is actually the table name
// and the table name is actually a database name.
if ((!empty($ret->database)) || ($dot)) {
$parser->error(__('Unexpected dot.'), $token);
}
$ret->database = $ret->table;
$ret->table = $ret->column;
$ret->column = null;
$dot = true;
$ret->expr .= $token->token;
} else {
$field = empty($options['field']) ? 'column' : $options['field'];
if (empty($ret->$field)) {
$ret->$field = $token->value;
$ret->expr .= $token->token;
$dot = false;
} else {
// No alias is expected.
if (!empty($options['breakOnAlias'])) {
break;
}
if (!empty($ret->alias)) {
$parser->error(__('An alias was previously found.'), $token);
break;
}
$ret->alias = $token->value;
}
}
$ret->expr .= $token->token;
}
if (($token->type === Token::TYPE_KEYWORD) && ($token->flags & Token::FLAG_KEYWORD_FUNCTION)) {
$prev = strtoupper($token->value);
} elseif (($token->type === Token::TYPE_OPERATOR) || ($token->value === '(')) {
$prev = true;
} else {
$prev = null;
}
}
if ($alias === 2) {
if ($alias) {
$parser->error(
__('An alias was expected.'),
$list->tokens[$list->idx - 1]
);
}
// Whitespaces might be added at the end.
// White-spaces might be added at the end.
$ret->expr = trim($ret->expr);
if (empty($ret->expr)) {

View File

@ -107,9 +107,8 @@ class IntoKeyword extends Component
$parser,
$list,
array(
'noAlias' => true,
'noBrackets' => true,
'skipColumn' => true,
'parseField' => 'table',
'breakOnAlias' => true,
)
);
$state = 1;

View File

@ -128,7 +128,7 @@ class JoinKeyword extends Component
break;
}
} elseif ($state === 1) {
$expr->expr = Expression::parse($parser, $list, array('skipColumn' => true));
$expr->expr = Expression::parse($parser, $list, array('field' => 'table'));
$state = 2;
} elseif ($state === 2) {
if (($token->type === Token::TYPE_KEYWORD) && ($token->value === 'ON')) {

View File

@ -169,8 +169,8 @@ class PartitionDefinition extends Component
$parser,
$list,
array(
'bracketsDelimited' => true,
'noAlias' => true,
'parenthesesDelimited' => true,
'breakOnAlias' => true,
)
);
}

View File

@ -121,9 +121,8 @@ class Reference extends Component
$parser,
$list,
array(
'noAlias' => true,
'skipColumn' => true,
'noBrackets' => true,
'parseField' => 'table',
'breakOnAlias' => true,
)
);
$state = 1;

View File

@ -93,9 +93,8 @@ class RenameOperation extends Component
$parser,
$list,
array(
'noAlias' => true,
'noBrackets' => true,
'skipColumn' => true,
'breakOnAlias' => true,
'parseField' => 'table',
)
);
if (empty($expr->old)) {
@ -120,9 +119,8 @@ class RenameOperation extends Component
$parser,
$list,
array(
'noBrackets' => true,
'skipColumn' => true,
'noAlias' => true,
'breakOnAlias' => true,
'parseField' => 'table',
)
);
if (empty($expr->new)) {

View File

@ -92,7 +92,7 @@ class SetOperation extends Component
if ($state === 0) {
if ($token->token === '=') {
$state = 1;
} else if ($token->value !== ',') {
} elseif ($token->value !== ',') {
$expr->column .= $token->token;
}
} elseif ($state === 1) {
@ -100,7 +100,7 @@ class SetOperation extends Component
$parser,
$list,
array(
'noAlias' => true,
'breakOnAlias' => true,
)
);
if ($tmp == null) {

View File

@ -107,7 +107,7 @@ abstract class Context
':=' => 8,
// @see Token::FLAG_OPERATOR_SQL
'(' => 16, ')' => 16, '.' => 16, ',' => 16,
'(' => 16, ')' => 16, '.' => 16, ',' => 16, ';' => 16,
);
/**
@ -190,6 +190,13 @@ abstract class Context
// https://dev.mysql.com/doc/refman/5.0/en/sql-mode.html#sqlmode_strict_trans_tables
const STRICT_TRANS_TABLES = 1048576;
// Custom modes.
// The table and column names and any other field that must be escaped will
// not be.
// Reserved keywords are being escaped regardless this mode is used or not.
const NO_ENCLOSING_QUOTES = 1073741824;
/*
* Combination SQL Modes
* https://dev.mysql.com/doc/refman/5.0/en/sql-mode.html#sql-mode-combo
@ -397,9 +404,12 @@ abstract class Context
*/
public static function isSeparator($str)
{
// NOTES: Only ASCII characters may be separators.
// NOTES: Only non alphanumeric ASCII characters may be separators.
// `~` is the last printable ASCII character.
return ($str <= '~') && (!ctype_alnum($str)) && ($str !== '_');
return ($str <= '~') && ($str !== '_')
&& (($str < '0') || ($str > '9'))
&& (($str < 'a') || ($str > 'z'))
&& (($str < 'A') || ($str > 'Z'));
}
/**
@ -517,9 +527,16 @@ abstract class Context
return $str;
}
if ((static::$MODE & Context::NO_ENCLOSING_QUOTES)
&& (!static::isKeyword($str, true))
) {
return $str;
}
if (static::$MODE & Context::ANSI_QUOTES) {
$quote = '"';
}
return $quote . str_replace($quote, $quote . $quote, $str) . $quote;
}
}

View File

@ -37,8 +37,8 @@ class ContextMySql50000 extends Context
public static $KEYWORDS = array(
'DO' => 1, 'IO' => 1, 'NO' => 1, 'XA' => 1,
'ANY' => 1, 'BDB' => 1, 'BIT' => 1, 'CPU' => 1, 'END' => 1, 'IPC' => 1,
'NDB' => 1, 'NEW' => 1, 'ONE' => 1, 'ROW' => 1,
'ANY' => 1, 'BDB' => 1, 'CPU' => 1, 'END' => 1, 'IPC' => 1, 'NDB' => 1,
'NEW' => 1, 'ONE' => 1, 'ROW' => 1,
'BOOL' => 1, 'BYTE' => 1, 'CODE' => 1, 'CUBE' => 1, 'DATA' => 1, 'FAST' => 1,
'FILE' => 1, 'FULL' => 1, 'HASH' => 1, 'HELP' => 1, 'LAST' => 1, 'LOGS' => 1,
'MODE' => 1, 'NAME' => 1, 'NEXT' => 1, 'NONE' => 1, 'OPEN' => 1, 'PAGE' => 1,
@ -162,7 +162,7 @@ class ContextMySql50000 extends Context
'DEFAULT CHARACTER SET' => 7,
'WITH CONSISTENT SNAPSHOT' => 7,
'XML' => 9,
'BIT' => 9, 'XML' => 9,
'ENUM' => 9, 'JSON' => 9, 'TEXT' => 9,
'ARRAY' => 9,
'SERIAL' => 9,

View File

@ -37,8 +37,8 @@ class ContextMySql50100 extends Context
public static $KEYWORDS = array(
'AT' => 1, 'DO' => 1, 'IO' => 1, 'NO' => 1, 'XA' => 1,
'ANY' => 1, 'BDB' => 1, 'BIT' => 1, 'CPU' => 1, 'END' => 1, 'IPC' => 1,
'NDB' => 1, 'NEW' => 1, 'ONE' => 1, 'ROW' => 1,
'ANY' => 1, 'BDB' => 1, 'CPU' => 1, 'END' => 1, 'IPC' => 1, 'NDB' => 1,
'NEW' => 1, 'ONE' => 1, 'ROW' => 1,
'BOOL' => 1, 'BYTE' => 1, 'CODE' => 1, 'CUBE' => 1, 'DATA' => 1, 'DISK' => 1,
'ENDS' => 1, 'FAST' => 1, 'FILE' => 1, 'FULL' => 1, 'GOTO' => 1, 'HASH' => 1,
'HELP' => 1, 'HOST' => 1, 'LAST' => 1, 'LESS' => 1, 'LIST' => 1, 'LOGS' => 1,
@ -175,7 +175,7 @@ class ContextMySql50100 extends Context
'DEFAULT CHARACTER SET' => 7,
'WITH CONSISTENT SNAPSHOT' => 7,
'XML' => 9,
'BIT' => 9, 'XML' => 9,
'ENUM' => 9, 'JSON' => 9, 'TEXT' => 9,
'ARRAY' => 9,
'SERIAL' => 9,

View File

@ -37,8 +37,8 @@ class ContextMySql50500 extends Context
public static $KEYWORDS = array(
'AT' => 1, 'DO' => 1, 'IO' => 1, 'NO' => 1, 'XA' => 1,
'ANY' => 1, 'BIT' => 1, 'CPU' => 1, 'END' => 1, 'IPC' => 1, 'NDB' => 1,
'NEW' => 1, 'ONE' => 1, 'ROW' => 1,
'ANY' => 1, 'CPU' => 1, 'END' => 1, 'IPC' => 1, 'NDB' => 1, 'NEW' => 1,
'ONE' => 1, 'ROW' => 1,
'BOOL' => 1, 'BYTE' => 1, 'CODE' => 1, 'CUBE' => 1, 'DATA' => 1, 'DISK' => 1,
'ENDS' => 1, 'FAST' => 1, 'FILE' => 1, 'FULL' => 1, 'HASH' => 1, 'HELP' => 1,
'HOST' => 1, 'LAST' => 1, 'LESS' => 1, 'LIST' => 1, 'LOGS' => 1, 'MODE' => 1,
@ -180,7 +180,7 @@ class ContextMySql50500 extends Context
'DEFAULT CHARACTER SET' => 7,
'WITH CONSISTENT SNAPSHOT' => 7,
'XML' => 9,
'BIT' => 9, 'XML' => 9,
'ENUM' => 9, 'JSON' => 9, 'TEXT' => 9,
'ARRAY' => 9,
'SERIAL' => 9,

View File

@ -37,8 +37,8 @@ class ContextMySql50600 extends Context
public static $KEYWORDS = array(
'AT' => 1, 'DO' => 1, 'IO' => 1, 'NO' => 1, 'XA' => 1,
'ANY' => 1, 'BIT' => 1, 'CPU' => 1, 'END' => 1, 'IPC' => 1, 'NDB' => 1,
'NEW' => 1, 'ONE' => 1, 'ROW' => 1,
'ANY' => 1, 'CPU' => 1, 'END' => 1, 'IPC' => 1, 'NDB' => 1, 'NEW' => 1,
'ONE' => 1, 'ROW' => 1,
'BOOL' => 1, 'BYTE' => 1, 'CODE' => 1, 'CUBE' => 1, 'DATA' => 1, 'DISK' => 1,
'ENDS' => 1, 'FAST' => 1, 'FILE' => 1, 'FULL' => 1, 'HASH' => 1, 'HELP' => 1,
'HOST' => 1, 'LAST' => 1, 'LESS' => 1, 'LIST' => 1, 'LOGS' => 1, 'MODE' => 1,
@ -186,7 +186,7 @@ class ContextMySql50600 extends Context
'DEFAULT CHARACTER SET' => 7,
'WITH CONSISTENT SNAPSHOT' => 7,
'XML' => 9,
'BIT' => 9, 'XML' => 9,
'ENUM' => 9, 'JSON' => 9, 'TEXT' => 9,
'ARRAY' => 9,
'SERIAL' => 9,

View File

@ -37,8 +37,8 @@ class ContextMySql50700 extends Context
public static $KEYWORDS = array(
'AT' => 1, 'DO' => 1, 'IO' => 1, 'NO' => 1, 'XA' => 1,
'ANY' => 1, 'BIT' => 1, 'CPU' => 1, 'END' => 1, 'IPC' => 1, 'NDB' => 1,
'NEW' => 1, 'ONE' => 1, 'ROW' => 1, 'XID' => 1,
'ANY' => 1, 'CPU' => 1, 'END' => 1, 'IPC' => 1, 'NDB' => 1, 'NEW' => 1,
'ONE' => 1, 'ROW' => 1, 'XID' => 1,
'BOOL' => 1, 'BYTE' => 1, 'CODE' => 1, 'CUBE' => 1, 'DATA' => 1, 'DISK' => 1,
'ENDS' => 1, 'FAST' => 1, 'FILE' => 1, 'FULL' => 1, 'HASH' => 1, 'HELP' => 1,
'HOST' => 1, 'LAST' => 1, 'LESS' => 1, 'LIST' => 1, 'LOGS' => 1, 'MODE' => 1,
@ -193,7 +193,7 @@ class ContextMySql50700 extends Context
'DEFAULT CHARACTER SET' => 7,
'WITH CONSISTENT SNAPSHOT' => 7,
'XML' => 9,
'BIT' => 9, 'XML' => 9,
'ENUM' => 9, 'JSON' => 9, 'TEXT' => 9,
'ARRAY' => 9,
'SERIAL' => 9,

View File

@ -36,6 +36,7 @@ class Parser
// MySQL Utility Statements
'DESCRIBE' => 'SqlParser\\Statements\\ExplainStatement',
'DESC' => 'SqlParser\\Statements\\ExplainStatement',
'EXPLAIN' => 'SqlParser\\Statements\\ExplainStatement',
'FLUSH' => '',
'GRANT' => '',
@ -124,17 +125,17 @@ class Parser
'ALTER' => array(
'class' => 'SqlParser\\Components\\Expression',
'field' => 'table',
'options' => array('skipColumn' => true),
'options' => array('parseField' => 'table'),
),
'ANALYZE' => array(
'class' => 'SqlParser\\Components\\ExpressionArray',
'field' => 'tables',
'options' => array('skipColumn' => true),
'options' => array('parseField' => 'table'),
),
'BACKUP' => array(
'class' => 'SqlParser\\Components\\ExpressionArray',
'field' => 'tables',
'options' => array('skipColumn' => true),
'options' => array('parseField' => 'table'),
),
'CALL' => array(
'class' => 'SqlParser\\Components\\FunctionCall',
@ -143,22 +144,22 @@ class Parser
'CHECK' => array(
'class' => 'SqlParser\\Components\\ExpressionArray',
'field' => 'tables',
'options' => array('skipColumn' => true),
'options' => array('parseField' => 'table'),
),
'CHECKSUM' => array(
'class' => 'SqlParser\\Components\\ExpressionArray',
'field' => 'tables',
'options' => array('skipColumn' => true),
'options' => array('parseField' => 'table'),
),
'DROP' => array(
'class' => 'SqlParser\\Components\\ExpressionArray',
'field' => 'fields',
'options' => array('skipColumn' => true),
'options' => array('parseField' => 'table'),
),
'FROM' => array(
'class' => 'SqlParser\\Components\\ExpressionArray',
'field' => 'from',
'options' => array('skipColumn' => true),
'options' => array('parseField' => 'table'),
),
'GROUP BY' => array(
'class' => 'SqlParser\\Components\\OrderKeyword',
@ -211,7 +212,7 @@ class Parser
'OPTIMIZE' => array(
'class' => 'SqlParser\\Components\\ExpressionArray',
'field' => 'tables',
'options' => array('skipColumn' => true),
'options' => array('parseField' => 'table'),
),
'ORDER BY' => array(
'class' => 'SqlParser\\Components\\OrderKeyword',
@ -232,12 +233,12 @@ class Parser
'REPAIR' => array(
'class' => 'SqlParser\\Components\\ExpressionArray',
'field' => 'tables',
'options' => array('skipColumn' => true),
'options' => array('parseField' => 'table'),
),
'RESTORE' => array(
'class' => 'SqlParser\\Components\\ExpressionArray',
'field' => 'tables',
'options' => array('skipColumn' => true),
'options' => array('parseField' => 'table'),
),
'SET' => array(
'class' => 'SqlParser\\Components\\SetOperation',
@ -250,12 +251,12 @@ class Parser
'TRUNCATE' => array(
'class' => 'SqlParser\\Components\\Expression',
'field' => 'table',
'options' => array('skipColumn' => true),
'options' => array('parseField' => 'table'),
),
'UPDATE' => array(
'class' => 'SqlParser\\Components\\ExpressionArray',
'field' => 'tables',
'options' => array('skipColumn' => true),
'options' => array('parseField' => 'table'),
),
'VALUE' => array(
'class' => 'SqlParser\\Components\\Array2d',

View File

@ -76,8 +76,8 @@ class AlterStatement extends Statement
$parser,
$list,
array(
'noAlias' => true,
'noBrackets' => true,
'parseField' => 'column',
'breakOnAlias' => true,
)
);
++$list->idx; // Skipping field.

View File

@ -342,9 +342,8 @@ class CreateStatement extends Statement
$parser,
$list,
array(
'noAlias' => true,
'noBrackets' => true,
'skipColumn' => true,
'parseField' => 'table',
'breakOnAlias' => true,
)
);
@ -538,9 +537,8 @@ class CreateStatement extends Statement
$parser,
$list,
array(
'noAlias' => true,
'noBrackets' => true,
'skipColumn' => true,
'parseField' => 'table',
'breakOnAlias' => true,
)
);
++$list->idx;

View File

@ -29,12 +29,18 @@ class BufferedQuery
{
// Constants that describe the current status of the parser.
const STATUS_STRING_SINGLE_QUOTES = 1;
const STATUS_STRING_DOUBLE_QUOTES = 2;
const STATUS_STRING_BACKTICK = 3;
const STATUS_COMMENT_BASH = 4;
const STATUS_COMMENT_C = 5;
const STATUS_COMMENT_SQL = 6;
// A string is being parsed.
const STATUS_STRING = 16; // 0001 0000
const STATUS_STRING_SINGLE_QUOTES = 17; // 0001 0001
const STATUS_STRING_DOUBLE_QUOTES = 18; // 0001 0010
const STATUS_STRING_BACKTICK = 20; // 0001 0100
// A comment is being parsed.
const STATUS_COMMENT = 32; // 0010 0000
const STATUS_COMMENT_BASH = 33; // 0010 0001
const STATUS_COMMENT_C = 34; // 0010 0010
const STATUS_COMMENT_SQL = 36; // 0010 0100
/**
* The query that is being processed.
@ -193,7 +199,7 @@ class BufferedQuery
* treated differently, because of the preceding backslash, it will
* be ignored.
*/
if ($this->query[$i] === '\\') {
if (($this->status & static::STATUS_COMMENT == 0) && ($this->query[$i] === '\\')) {
$this->current .= $this->query[$i] . $this->query[++$i];
continue;
}

View File

@ -305,8 +305,8 @@ class Formatter
&& (!$formattedOptions)
&& (empty(self::$INLINE_CLAUSES[$lastClause]))
&& (($curr->type !== Token::TYPE_KEYWORD)
|| (($curr->type === Token::TYPE_KEYWORD)
&& ($curr->flags & Token::FLAG_KEYWORD_FUNCTION)))
|| (($curr->type === Token::TYPE_KEYWORD)
&& ($curr->flags & Token::FLAG_KEYWORD_FUNCTION)))
) {
$formattedOptions = true;
$lineEnded = true;

View File

@ -22,7 +22,7 @@ header('Content-type: text/plain; charset=utf-8');
$filename = LICENSE_FILE;
// Check if the file is available, some distributions remove these.
if (is_readable($filename)) {
if (@is_readable($filename)) {
readfile($filename);
} else {
printf(

View File

@ -35,4 +35,16 @@ PMA_Response::getInstance()->disable();
PMA_headerJSON();
if (! empty($_POST['options'])) {
$options = $_POST['options'];
if (! empty($options['routine_editor'])) {
$sql_query = 'CREATE PROCEDURE `a`() ' . $sql_query;
} elseif (! empty($options['trigger_editor'])) {
$sql_query = 'CREATE TRIGGER `a` AFTER INSERT ON `b` FOR EACH ROW ' . $sql_query;
} elseif (! empty($options['event_editor'])) {
$sql_query = 'CREATE EVENT `a` ON SCHEDULE EVERY MINUTE DO ' . $sql_query;
}
}
echo json_encode(PMA_Linter::lint($sql_query));

View File

@ -11360,7 +11360,7 @@ msgstr "Beskikbaar"
#: libraries/relation.lib.php:100
#, fuzzy
#| msgid "Modifications have been saved"
msgid "Configuration of pmadb… "
msgid "Configuration of pmadb…"
msgstr "Veranderinge is gestoor"
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140

View File

@ -11605,7 +11605,7 @@ msgstr "مفعل"
#: libraries/relation.lib.php:100
#, fuzzy
#| msgid "Modifications have been saved"
msgid "Configuration of pmadb… "
msgid "Configuration of pmadb…"
msgstr "تمت التعديلات"
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140

View File

@ -10945,7 +10945,7 @@ msgstr ""
#: libraries/relation.lib.php:100
#, fuzzy
#| msgid "Configuration saved."
msgid "Configuration of pmadb… "
msgid "Configuration of pmadb…"
msgstr "Konfiqurasiya yaddaşa verildi."
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140

View File

@ -11917,7 +11917,7 @@ msgstr "Уключана"
#: libraries/relation.lib.php:100
#, fuzzy
#| msgid "Modifications have been saved"
msgid "Configuration of pmadb… "
msgid "Configuration of pmadb…"
msgstr "Мадыфікацыі былі захаваныя"
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140

View File

@ -11986,7 +11986,7 @@ msgstr "Uklučana"
#: libraries/relation.lib.php:100
#, fuzzy
#| msgid "Modifications have been saved"
msgid "Configuration of pmadb… "
msgid "Configuration of pmadb…"
msgstr "Madyfikacyi byli zachavanyja"
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140

View File

@ -11570,7 +11570,7 @@ msgstr "Позволено"
#: libraries/relation.lib.php:100
#, fuzzy
#| msgid "Configuration saved."
msgid "Configuration of pmadb… "
msgid "Configuration of pmadb…"
msgstr "Конфигурацията запазена."
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140

View File

@ -11598,7 +11598,7 @@ msgstr "কার্যকর"
#: libraries/relation.lib.php:100
#, fuzzy
#| msgid "Configuration saved."
msgid "Configuration of pmadb… "
msgid "Configuration of pmadb…"
msgstr "কনফিগারেশন সংরক্ষন করা হয়েছে।"
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140

View File

@ -11574,7 +11574,7 @@ msgstr ""
#: libraries/relation.lib.php:100
#, fuzzy
#| msgid "Configuration file"
msgid "Configuration of pmadb… "
msgid "Configuration of pmadb…"
msgstr "Restr gefluniañ"
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140

View File

@ -11560,7 +11560,7 @@ msgstr "Omogućeno"
#: libraries/relation.lib.php:100
#, fuzzy
#| msgid "Modifications have been saved"
msgid "Configuration of pmadb… "
msgid "Configuration of pmadb…"
msgstr "Izmjene su sačuvane"
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140

View File

@ -11194,7 +11194,7 @@ msgid "Enabled"
msgstr "Activat"
#: libraries/relation.lib.php:100
msgid "Configuration of pmadb… "
msgid "Configuration of pmadb…"
msgstr "Configuració de pmadb... "
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140

View File

@ -11012,7 +11012,7 @@ msgid "Enabled"
msgstr ""
#: libraries/relation.lib.php:100
msgid "Configuration of pmadb… "
msgid "Configuration of pmadb…"
msgstr ""
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140

View File

@ -6,10 +6,10 @@ msgstr ""
"Project-Id-Version: phpMyAdmin 4.5.4-dev\n"
"Report-Msgid-Bugs-To: translators@phpmyadmin.net\n"
"POT-Creation-Date: 2016-01-14 09:16+0100\n"
"PO-Revision-Date: 2015-11-12 10:29+0000\n"
"PO-Revision-Date: 2016-01-31 11:31+0000\n"
"Last-Translator: Michal Čihař <michal@cihar.com>\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/phpmyadmin/4-5/cs/"
">\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/phpmyadmin/4-5/cs/>"
"\n"
"Language: cs\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -4708,9 +4708,9 @@ msgid "Skip Explain SQL"
msgstr "Bez vysvětlení SQL"
#: libraries/Util.class.php:1189
#, fuzzy, php-format
#, php-format
msgid "Analyze Explain at %s"
msgstr "Analyzovat výstup příkazu Explain na %s"
msgstr "Analyzovat výstup příkazu EXPLAIN na %s"
#: libraries/Util.class.php:1220
msgid "Without PHP Code"
@ -7859,10 +7859,11 @@ msgid "Enable Zero Configuration mode"
msgstr "Umožnit mód Automatické konfigurace"
#: libraries/config/page_settings.class.php:140
#, fuzzy
#| msgid "Cannot save settings, submitted form contains errors!"
msgid "Cannot save settings, submitted configuration form contains errors!"
msgstr "Nepodařilo se uložit nastavení, odeslaný formulář obsahuje chyby!"
msgstr ""
"Nepodařilo se uložit nastavení, odeslaný konfigurační formulář obsahuje "
"chyby!"
#: libraries/config/setup.forms.php:40
msgid "Config authentication"
@ -8441,14 +8442,11 @@ msgstr ""
"ale může to způsobit problémy s transakcemi.)</i>"
#: libraries/display_import.lib.php:309
#, fuzzy
#| msgid ""
#| "Skip this number of queries (for SQL) or lines (for other formats), "
#| "starting from the first one:"
msgid "Skip this number of queries (for SQL) starting from the first one:"
msgstr ""
"Přeskočit daný počet dotazů (pro SQL) nebo řádek (pro ostatní formáty), "
"počínaje od:"
msgstr "Přeskočit daný počet dotazů (pro SQL) počínaje od:"
#: libraries/display_import.lib.php:339
msgid "Other options:"
@ -11062,8 +11060,8 @@ msgid "Enabled"
msgstr "Zapnuto"
#: libraries/relation.lib.php:100
msgid "Configuration of pmadb… "
msgstr "Konfigurace pmadb... "
msgid "Configuration of pmadb…"
msgstr "Konfigurace pmadb"
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140
msgid "General relation features"
@ -16240,7 +16238,7 @@ msgstr ""
#: libraries/advisory_rules.txt:267
#, php-format
msgid "Current values are tmp_table_size: %s, max_heap_table_size: %s"
msgstr "Současné hodnoty jous tmp_table_size: %s, max_heap_table_size: %s"
msgstr "Současné hodnoty jsou tmp_table_size: %s, max_heap_table_size: %s"
#: libraries/advisory_rules.txt:269
msgid "Percentage of temp tables on disk"

View File

@ -11669,7 +11669,7 @@ msgstr ""
#: libraries/relation.lib.php:100
#, fuzzy
#| msgid "Modifications have been saved"
msgid "Configuration of pmadb… "
msgid "Configuration of pmadb…"
msgstr "Cafodd yr addasiadau eu cadw"
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140

View File

@ -11262,7 +11262,7 @@ msgid "Enabled"
msgstr "Slået til"
#: libraries/relation.lib.php:100
msgid "Configuration of pmadb… "
msgid "Configuration of pmadb…"
msgstr "Konfiguration af pmadb … "
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140

View File

@ -4,10 +4,10 @@ msgstr ""
"Project-Id-Version: phpMyAdmin-docs 4.0.0-dev\n"
"Report-Msgid-Bugs-To: translators@phpmyadmin.net\n"
"POT-Creation-Date: 2016-01-14 09:16+0100\n"
"PO-Revision-Date: 2015-12-17 13:57+0000\n"
"Last-Translator: Anna Henningsen <sqrt@entless.org>\n"
"Language-Team: German <https://hosted.weblate.org/projects/phpmyadmin/4-5/de/"
">\n"
"PO-Revision-Date: 2016-01-18 18:42+0000\n"
"Last-Translator: BlackyPanther <webmaster@am-wd.de>\n"
"Language-Team: German "
"<https://hosted.weblate.org/projects/phpmyadmin/4-5/de/>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -2629,6 +2629,13 @@ msgid ""
"cause such a problem, clearing your \"Offline Website Data\" might help. In "
"Safari, such problem is commonly caused by \"Private Mode Browsing\"."
msgstr ""
"Es gab ein Problem beim Zugriff auf den lokalen Browserspeicher, weshalb "
"manche Eigenschaften möglicherweise nicht funktionieren. Dies tritt meistens "
"auf, wenn der Browser lokale Datenbanken nicht unterstützt oder das Quota-"
"Limit erreicht wurde. Im Firefox kann auch ein beschädigter Speicher solche "
"Probleme verursachen. Eventuell hilft es die \"Offline Webseiten Daten\" zu "
"löschen. In Safari entstehen solche Probleme meistens, wenn das \"Private "
"Surfen\" aktiviert ist."
#: js/messages.php:635
msgctxt "Previous month"
@ -11296,7 +11303,7 @@ msgid "Enabled"
msgstr "Aktiviert"
#: libraries/relation.lib.php:100
msgid "Configuration of pmadb… "
msgid "Configuration of pmadb…"
msgstr "Konfiguration des pmadb... "
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140

View File

@ -4,7 +4,7 @@ msgstr ""
"Project-Id-Version: phpMyAdmin 4.5.4-dev\n"
"Report-Msgid-Bugs-To: translators@phpmyadmin.net\n"
"POT-Creation-Date: 2016-01-14 09:16+0100\n"
"PO-Revision-Date: 2016-01-14 16:02+0000\n"
"PO-Revision-Date: 2016-02-02 10:26+0000\n"
"Last-Translator: Παναγιώτης Παπάζογλου <papaz_p@yahoo.com>\n"
"Language-Team: Greek <https://hosted.weblate.org/projects/phpmyadmin/4-5/el/>"
"\n"
@ -11262,8 +11262,8 @@ msgid "Enabled"
msgstr "Ενεργοποιημένη"
#: libraries/relation.lib.php:100
msgid "Configuration of pmadb… "
msgstr "Ρύθμιση της pmadb… "
msgid "Configuration of pmadb…"
msgstr "Ρύθμιση της pmadb…"
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140
msgid "General relation features"

View File

@ -11596,7 +11596,7 @@ msgstr "Enabled"
#: libraries/relation.lib.php:100
#, fuzzy
#| msgid "Configuration saved."
msgid "Configuration of pmadb… "
msgid "Configuration of pmadb…"
msgstr "Configuration saved."
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140

View File

@ -10383,7 +10383,7 @@ msgid "Enabled"
msgstr "Ŝaltita"
#: libraries/relation.lib.php:100
msgid "Configuration of pmadb… "
msgid "Configuration of pmadb…"
msgstr ""
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140

View File

@ -11300,7 +11300,7 @@ msgid "Enabled"
msgstr "Habilitado"
#: libraries/relation.lib.php:100
msgid "Configuration of pmadb… "
msgid "Configuration of pmadb…"
msgstr "Configuración de pmadb… "
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140

View File

@ -11060,7 +11060,7 @@ msgid "Enabled"
msgstr "Lubatud"
#: libraries/relation.lib.php:100
msgid "Configuration of pmadb… "
msgid "Configuration of pmadb…"
msgstr "pmadb seadistus... "
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140

View File

@ -11584,7 +11584,7 @@ msgstr "Gaituta"
#: libraries/relation.lib.php:100
#, fuzzy
#| msgid "Modifications have been saved"
msgid "Configuration of pmadb… "
msgid "Configuration of pmadb…"
msgstr "Aldaketak gorde dira"
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140

View File

@ -11480,7 +11480,7 @@ msgstr "فعال"
#: libraries/relation.lib.php:100
#, fuzzy
#| msgid "Modifications have been saved"
msgid "Configuration of pmadb… "
msgid "Configuration of pmadb…"
msgstr "اصلاحات ذخيره گرديد"
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140

View File

@ -4,10 +4,10 @@ msgstr ""
"Project-Id-Version: phpMyAdmin 4.5.4-dev\n"
"Report-Msgid-Bugs-To: translators@phpmyadmin.net\n"
"POT-Creation-Date: 2016-01-14 09:16+0100\n"
"PO-Revision-Date: 2015-11-12 10:40+0000\n"
"Last-Translator: Michal Čihař <michal@cihar.com>\n"
"Language-Team: Finnish <https://hosted.weblate.org/projects/phpmyadmin/4-5/"
"fi/>\n"
"PO-Revision-Date: 2016-01-25 09:44+0000\n"
"Last-Translator: Daniel Iltanen <daniel.iltanen@gmail.com>\n"
"Language-Team: Finnish "
"<https://hosted.weblate.org/projects/phpmyadmin/4-5/fi/>\n"
"Language: fi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -5279,7 +5279,7 @@ msgstr ""
"Avaimen pitäisi sisältää kirjaimia, numeroita [em]ja[/em] erikoismerkkejä."
#: libraries/config/ServerConfigChecks.class.php:382
#, fuzzy, php-format
#, php-format
#| msgid ""
#| "a@?page=form&amp;formset=features#tab_Security]option[/a] should be abled "
#| "it allows attackers to bruteforce login to any MySQL server. you feel s "
@ -5296,7 +5296,7 @@ msgstr ""
"Tämä %svalinta%s pitäisi poistaa käytöstä, sillä se sallii hyökkääjien "
"kirjautua mihin tahansa MySQL-palvelimeen käyttämällä bruteforce-hyökkäystä. "
"Jos tätä valintaa on pakko käyttää, käytä %srestrict login to MySQL server%s "
"or %sluotettujen välipalvelimien luetteloa%s. IP-osoitteeseen perustuva "
"tai %sluotettujen välipalvelimien luetteloa%s. IP-osoitteeseen perustuva "
"suojaus ei kuitenkaan ole täysin luotettava mikäli IP-osoite kuuluu Internet-"
"palveluntarjoajalle, johon sinun lisäksesi tuhannet käyttäjät ovat "
"yhteydessä."
@ -7542,7 +7542,7 @@ msgstr "Näytä tietokannanluontilomake"
#: libraries/config/messages.inc.php:847
msgid "Show or hide a column displaying the comments for all tables."
msgstr ""
msgstr "Näytä tai piilota kommentti -sarake kaikista tauluista."
#: libraries/config/messages.inc.php:849
#, fuzzy
@ -11362,7 +11362,7 @@ msgstr "Päällä"
#: libraries/relation.lib.php:100
#, fuzzy
#| msgid "Configuration saved."
msgid "Configuration of pmadb… "
msgid "Configuration of pmadb…"
msgstr "Asetukset tallennettu."
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140

View File

@ -4,8 +4,8 @@ msgstr ""
"Project-Id-Version: phpMyAdmin-docs 4.0.0-dev\n"
"Report-Msgid-Bugs-To: translators@phpmyadmin.net\n"
"POT-Creation-Date: 2016-01-14 09:16+0100\n"
"PO-Revision-Date: 2016-01-14 12:59+0000\n"
"Last-Translator: Marc Delisle <marc@infomarc.info>\n"
"PO-Revision-Date: 2016-01-22 22:49+0000\n"
"Last-Translator: Adam Magnier <adam@magnier.io>\n"
"Language-Team: French "
"<https://hosted.weblate.org/projects/phpmyadmin/4-5/fr/>\n"
"Language: fr\n"
@ -5587,7 +5587,7 @@ msgstr "Secret Blowfish"
#: libraries/config/messages.inc.php:40
msgid "Highlight selected rows."
msgstr "Utilisé quand on clique sur une ligne."
msgstr "Mettre en surbrillance les lignes sélectionnées."
#: libraries/config/messages.inc.php:41
msgid "Row marker"
@ -5619,7 +5619,7 @@ msgid ""
"columns; [kbd]input[/kbd] - allows limiting of input length, [kbd]textarea[/"
"kbd] - allows newlines in columns."
msgstr ""
"Déterminer la méthode d'édition pour les colonnes CHAR et VARCHAR; "
"Détermine la méthode d'édition pour les colonnes CHAR et VARCHAR; "
"[kbd]input[/kbd] - permet de limiter la taille, [kbd]textarea[/kbd] - permet "
"la saisie de sauts de lignes."
@ -11263,8 +11263,8 @@ msgid "Enabled"
msgstr "Activé"
#: libraries/relation.lib.php:100
msgid "Configuration of pmadb… "
msgstr "Configuration de pmadb… "
msgid "Configuration of pmadb…"
msgstr "Configuration de pmadb…"
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140
msgid "General relation features"
@ -16840,7 +16840,7 @@ msgstr ""
msgid ""
"Max_used_connections is at %s%% of max_connections, it should be below 80%%"
msgstr ""
"Max_used_connections est à %s%% de max_connections, devrait être sous les "
"Max_used_connections est à %s%% de max_connections, il devrait être sous les "
"80%%"
#: libraries/advisory_rules.txt:399
@ -16940,8 +16940,8 @@ msgid ""
"The InnoDB log file size is not an appropriate size, in relation to the "
"InnoDB buffer pool."
msgstr ""
"La taille du journal InnoDB n'est pas appropriée, en tenant compte du pool "
"de mémoire tampon InnoDB."
"La taille du journal InnoDB n'est pas appropriée, par rapport au pool de "
"mémoire tampon InnoDB."
#: libraries/advisory_rules.txt:440
#, php-format
@ -16956,16 +16956,16 @@ msgid ""
"fine. See also <a href=\"http://mysqldatabaseadministration.blogspot."
"com/2007/01/increase-innodblogfilesize-proper-way.html\">this blog entry</a>"
msgstr ""
"Surtout si votre système effectue de nombreuses écritures dans des tables "
"InnoDB, vous devriez régler innodb_log_file à 25%% de "
"En particulier si votre système effectue de nombreuses écritures dans des "
"tables InnoDB, vous devriez régler innodb_log_file à 25%% de "
"{innodb_buffer_pool_size}. Cependant, plus cette valeur est élevée, plus "
"long sera le temps de recouvrement en cas de panne de la base de données, "
"alors cette valeur ne devrait pas dépasser 256 Mio. Veuillez noter que vous "
"ne pouvez pas simplement changer la valeur de cette variable. Il vous faut "
"fermer le serveur, enlever les journaux InnoDB, placer la nouvelle valeur "
"dans my.cnf, démarrer le serveur, puis vérifier les journaux d'erreurs. Voir "
"aussi <a href=\"http://mysqldatabaseadministration.blogspot.com/2007/01/"
"increase-innodblogfilesize-proper-way.html\">cet article de blogue.</a>"
"aussi <a href=\"http://mysqldatabaseadministration.blogspot.com/2007/01"
"/increase-innodblogfilesize-proper-way.html\">cet article de blogue.</a>"
#: libraries/advisory_rules.txt:441
#, php-format
@ -16973,8 +16973,8 @@ msgid ""
"Your InnoDB log size is at %s%% in relation to the InnoDB buffer pool size, "
"it should not be below 20%%"
msgstr ""
"La taille de votre journal InnoDB est de %s%% en comparant au pool de "
"mémoire tampon InnoDB, elle ne devrait pas être sous les 20%%"
"La taille de votre journal InnoDB est de %s%% par rapport au pool de mémoire "
"tampon InnoDB, elle ne devrait pas être sous les 20%%"
#: libraries/advisory_rules.txt:443
msgid "Max InnoDB log size"
@ -17018,7 +17018,7 @@ msgstr "Taille de la mémoire-tampon InnoDB"
#: libraries/advisory_rules.txt:453
msgid "Your InnoDB buffer pool is fairly small."
msgstr "Votre mémoire-tampon InnoDB est petite."
msgstr "Votre mémoire-tampon InnoDB est trop petite."
#: libraries/advisory_rules.txt:454
#, php-format

View File

@ -10544,7 +10544,7 @@ msgid "Enabled"
msgstr "Ynskeakele"
#: libraries/relation.lib.php:100
msgid "Configuration of pmadb… "
msgid "Configuration of pmadb…"
msgstr ""
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140

119
po/gl.po
View File

@ -4,10 +4,10 @@ msgstr ""
"Project-Id-Version: phpMyAdmin 4.5.4-dev\n"
"Report-Msgid-Bugs-To: translators@phpmyadmin.net\n"
"POT-Creation-Date: 2016-01-14 09:16+0100\n"
"PO-Revision-Date: 2016-01-11 22:37+0000\n"
"PO-Revision-Date: 2016-01-17 22:02+0000\n"
"Last-Translator: Xosé Calvo <xosecalvo@gmail.com>\n"
"Language-Team: Galician <https://hosted.weblate.org/projects/phpmyadmin/4-5/"
"gl/>\n"
"Language-Team: Galician "
"<https://hosted.weblate.org/projects/phpmyadmin/4-5/gl/>\n"
"Language: gl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -2595,6 +2595,12 @@ msgid ""
"cause such a problem, clearing your \"Offline Website Data\" might help. In "
"Safari, such problem is commonly caused by \"Private Mode Browsing\"."
msgstr ""
"Produciuse un problema ao acceder ao almacenamento do seu navegador; "
"algunhas funcionalidades poderían non funcionar axeitadamente. É probábel "
"que o navegador non admita o almacenamento ou que se atinxise o límite de "
"cota. No Firefox o almacenamento estragado pode provocar problemas deste "
"tipo; limpar os «Datos de sitios web sen conexión» podería axudar. No Safari "
"este é un problema que causa frecuentemente a «Navegación en modo privado»."
#: js/messages.php:635
msgctxt "Previous month"
@ -6438,7 +6444,7 @@ msgstr ""
#: libraries/config/messages.inc.php:375 libraries/config/messages.inc.php:389
msgid "Update data when duplicate keys found on import"
msgstr ""
msgstr "Actualizar os datos ao atopar chaves duplicadas ao importar"
#: libraries/config/messages.inc.php:379
msgid ""
@ -6812,7 +6818,7 @@ msgstr "Mostrar os procedementos nunha árbore"
#: libraries/config/messages.inc.php:535
msgid "Whether to show procedures under database in the navigation tree"
msgstr ""
msgstr "Mostrar os procedementos baixo a base de datos na árbore de navegación"
#: libraries/config/messages.inc.php:536
msgid "Show events in tree"
@ -6850,11 +6856,11 @@ msgstr "Onde mostrar as ligazóns das fileiras das táboas"
#: libraries/config/messages.inc.php:548
msgid "Whether to show row links even in the absence of a unique key."
msgstr ""
msgstr "Mostrar as ligazóns das filas mesmo na ausencia de chaves únicas."
#: libraries/config/messages.inc.php:550
msgid "Show row links anyway"
msgstr ""
msgstr "Mostrar as ligazóns das filas de calquera maneira"
#: libraries/config/messages.inc.php:552
msgid "Use natural order for sorting table and database names."
@ -7002,7 +7008,7 @@ msgstr "Recordar a ordenación da táboa"
#: libraries/config/messages.inc.php:607
msgid "Default sort order for tables with a primary key."
msgstr ""
msgstr "Orde predeterminada de ordenación das táboas con chave primaria."
#: libraries/config/messages.inc.php:609
#, fuzzy
@ -7472,7 +7478,6 @@ msgid "Display columns table"
msgstr "Mostrar a táboa de columnas"
#: libraries/config/messages.inc.php:773
#, fuzzy
#| msgid ""
#| "Leave blank for no \"persistent\" tables' UI preferences across sessions, "
#| "suggested: [kbd]pma__table_uiprefs[/kbd]"
@ -7481,7 +7486,7 @@ msgid ""
"suggested: [kbd]pma__table_uiprefs[/kbd]."
msgstr ""
"Déixeo en branco se non desexa preferencias «persistentes» da interface das "
"táboas entre sesións; suxírese: [kbd]pma__table_uiprefs[/kbd]"
"táboas entre sesións; suxírese: [kbd]pma__table_uiprefs[/kbd]."
#: libraries/config/messages.inc.php:776
msgid "UI preferences table"
@ -7601,7 +7606,7 @@ msgstr ""
#: libraries/config/messages.inc.php:827
msgid "Hidden navigation items table"
msgstr ""
msgstr "Táboa de elementos de navegación agochados"
#: libraries/config/messages.inc.php:829
msgid "User for config auth"
@ -7945,7 +7950,7 @@ msgstr ""
#: libraries/config/messages.inc.php:965
msgid "Proxy url"
msgstr ""
msgstr "URL do proxy"
#: libraries/config/messages.inc.php:967
msgid ""
@ -8002,7 +8007,7 @@ msgstr "Chave privada do reCaptcha"
#: libraries/config/messages.inc.php:991
msgid "Choose the default action when sending error reports."
msgstr ""
msgstr "Escolla a acción predeterminada para enviar informes de fallo."
#: libraries/config/messages.inc.php:993
msgid "Send error reports"
@ -8013,12 +8018,13 @@ msgid ""
"Queries are executed by pressing Enter (instead of Ctrl+Enter). New lines "
"will be inserted with Shift+Enter."
msgstr ""
"As consultas execútanse ao premer Intro (no canto de Ctrl+Intro). As liñas "
"novas insírense con Maiús+Intro."
#: libraries/config/messages.inc.php:999
#, fuzzy
#| msgid "Executed queries"
msgid "Enter executes queries in console"
msgstr "Consultas executadas"
msgstr "Intro executa consultas na consola"
#: libraries/config/messages.inc.php:1002
msgid ""
@ -8105,14 +8111,14 @@ msgstr "Deixouse a vista %s"
#: libraries/controllers/DatabaseStructureController.class.php:429
#: tbl_operations.php:398
#, fuzzy, php-format
#, php-format
#| msgid "Table %s has been dropped."
msgid "Table %s has been dropped."
msgstr "Eliminouse a táboa %s"
msgstr "Eliminouse a táboa %s."
#: libraries/controllers/DatabaseStructureController.class.php:738
msgid "Favorite List is full!"
msgstr ""
msgstr "A lista de favoritos está chea!"
#: libraries/controllers/DatabaseStructureController.class.php:953
#: libraries/mysql_charsets.lib.php:369 libraries/mysql_charsets.lib.php:376
@ -8165,18 +8171,17 @@ msgstr "Busca gráfica"
#: libraries/controllers/TableSearchController.class.php:850
#: templates/table/search/selection_form.phtml:59
#, fuzzy
#| msgid "Find and Replace"
msgid "Find and replace"
msgstr "Buscar e substituír"
msgstr "Atopar e substituír"
#: libraries/controllers/TableStructureController.class.php:163
#, fuzzy, php-format
#, php-format
#| msgid "The column name '%s' is a MySQL reserved keyword."
msgid "The name '%s' is a MySQL reserved keyword."
msgid_plural "The names '%s' are MySQL reserved keywords."
msgstr[0] "O nome de columna «%s» é unha palabra chave reservada do MySQL."
msgstr[1] "O nome de columna «%s» é unha palabra chave reservada do MySQL."
msgstr[0] "O nome «%s» é unha palabra chave reservada do MySQL."
msgstr[1] "Os nomes «%s» son palabras chaves reservadas do MySQL."
#: libraries/controllers/TableStructureController.class.php:241
msgid "No column selected."
@ -8187,11 +8192,11 @@ msgid "The columns have been moved successfully."
msgstr "Movéronse as columnas satisfactoriamente."
#: libraries/controllers/TableStructureController.class.php:741
#, fuzzy, php-format
#, php-format
#| msgid "Table %1$s has been altered successfully."
msgid ""
"Table %1$s has been altered successfully. Privileges have been adjusted."
msgstr "Alterouse a táboa %1$s sen problemas."
msgstr "Alterouse a táboa %1$s sen problemas. Axustáronse os privilexios."
#: libraries/controllers/TableStructureController.class.php:796
#: libraries/tracking.lib.php:1094
@ -8349,28 +8354,24 @@ msgid "Export templates:"
msgstr "Tipo de exportación"
#: libraries/display_export.lib.php:205
#, fuzzy
#| msgid "File name template:"
msgid "New template:"
msgstr "Modelo do nome de ficheiro:"
msgstr "Modelo novo:"
#: libraries/display_export.lib.php:208
#, fuzzy
#| msgid "Table name"
msgid "Template name"
msgstr "Nome da táboa"
msgstr "Nome do modelo"
#: libraries/display_export.lib.php:217
#, fuzzy
#| msgid "File name template:"
msgid "Existing templates:"
msgstr "Modelo do nome de ficheiro:"
msgstr "Modelos existentes:"
#: libraries/display_export.lib.php:218
#, fuzzy
#| msgid "Temp disk rate"
msgid "Template:"
msgstr "Taxa de temporais no disco"
msgstr "Modelo:"
#: libraries/display_export.lib.php:223
#, fuzzy
@ -8379,16 +8380,14 @@ msgid "Update"
msgstr "Actualizada"
#: libraries/display_export.lib.php:245
#, fuzzy
#| msgid "Select Tables"
msgid "Select a template"
msgstr "Escoller táboas"
msgstr "Seleccionar un modelo"
#: libraries/display_export.lib.php:291
#, fuzzy
#| msgid "Export method"
msgid "Export method:"
msgstr "Método de exportación"
msgstr "Método de exportación:"
#: libraries/display_export.lib.php:301
msgid "Quick - display only the minimal options"
@ -8399,17 +8398,15 @@ msgid "Custom - display all possible options"
msgstr "Personalizada - mostrar todas as opcións posíbeis"
#: libraries/display_export.lib.php:335
#, fuzzy
#| msgid "Databases"
msgid "Databases:"
msgstr "Bases de datos"
msgstr "Bases de datos:"
#: libraries/display_export.lib.php:337
#: libraries/navigation/Navigation.class.php:196
#, fuzzy
#| msgid "Tables"
msgid "Tables:"
msgstr "Táboas"
msgstr "Táboas:"
#: libraries/display_export.lib.php:357 libraries/display_import.lib.php:358
#: libraries/plugins/export/ExportCodegen.class.php:107
@ -8511,20 +8508,18 @@ msgid "View output as text"
msgstr "Ver a saída como texto"
#: libraries/display_export.lib.php:751
#, fuzzy
#| msgid "Export views"
msgid "Export databases as separate files"
msgstr "Exportar as vistas"
msgstr "Exportar as bases de datos como ficheiros separados"
#: libraries/display_export.lib.php:753
#, fuzzy
#| msgid "Export table headers"
msgid "Export tables as separate files"
msgstr "Exportar os cabezallos das táboas"
msgstr "Exportar as táboas como ficheiros separados"
#: libraries/display_export.lib.php:783 libraries/display_export.lib.php:909
msgid "Rename exported databases/tables/columns"
msgstr ""
msgstr "Mudar o nome das bases de datos/táboas/columnas seleccionadas"
#: libraries/display_export.lib.php:808
msgid "Save output to a file"
@ -8532,19 +8527,17 @@ msgstr "Gardar a saída nun ficheiro"
#: libraries/display_export.lib.php:841
msgid "Skip tables larger than"
msgstr ""
msgstr "Omitir as táboas maiores de"
#: libraries/display_export.lib.php:936
#, fuzzy
#| msgid "Select Tables"
msgid "Select database"
msgstr "Escoller táboas"
msgstr "Seleccionar base de datos"
#: libraries/display_export.lib.php:938
#, fuzzy
#| msgid "Select Tables"
msgid "Select table"
msgstr "Escoller táboas"
msgstr "Seleccionar táboa"
#: libraries/display_export.lib.php:954
#, fuzzy
@ -8553,16 +8546,14 @@ msgid "New database name"
msgstr "nome da base de datos"
#: libraries/display_export.lib.php:978
#, fuzzy
#| msgid "New table"
msgid "New table name"
msgstr "Sen táboas"
msgstr "Nome novo da táboa"
#: libraries/display_export.lib.php:988
#, fuzzy
#| msgid "Copy column name"
msgid "Old column name"
msgstr "Copiar nome da columna"
msgstr "Nome anterior da táboa"
#: libraries/display_export.lib.php:989
#, fuzzy
@ -8629,21 +8620,19 @@ msgstr ""
"b>. Exemplo: <b>.sql.zip</b>"
#: libraries/display_import.lib.php:224
#, fuzzy
#| msgid "File to Import:"
msgid "File to import:"
msgstr "Ficheiro que importar:"
#: libraries/display_import.lib.php:234 libraries/display_import.lib.php:251
msgid "You may also drag and drop a file on any page."
msgstr ""
msgstr "Tamén pode arrastrar e soltar un ficheiro sobre calquera páxina."
#: libraries/display_import.lib.php:254
msgid "File uploads are not allowed on this server."
msgstr "Este servidor non admite a recepción de ficheiros."
#: libraries/display_import.lib.php:278
#, fuzzy
#| msgid "Partial Import:"
msgid "Partial import:"
msgstr "Importación parcial:"
@ -8667,16 +8656,14 @@ msgstr ""
"importar ficheiros longos, aínda que pode rachar transaccións.)</i>"
#: libraries/display_import.lib.php:309
#, fuzzy
#| msgid "Number of rows to skip, starting from the first row:"
msgid "Skip this number of queries (for SQL) starting from the first one:"
msgstr "Número de filas que saltar, comezando na primeira:"
msgstr "Omitir este número de consultas (para SQL), comezando na primeira:"
#: libraries/display_import.lib.php:339
#, fuzzy
#| msgid "Options"
msgid "Other options:"
msgstr "Opcións"
msgstr "Outras opcións:"
#: libraries/display_import.lib.php:477
msgid ""
@ -9113,10 +9100,9 @@ msgid ""
msgstr "As estruturas seguintes foron creadas ou alteradas. Aquí pode:"
#: libraries/import.lib.php:1258
#, fuzzy
#| msgid "View a structure's contents by clicking on its name"
msgid "View a structure's contents by clicking on its name."
msgstr "Ver o contido dunha estrutura premendo o seu nome"
msgstr "Ver o contido dunha estrutura premendo no seu nome."
#: libraries/import.lib.php:1261
#, fuzzy
@ -11445,7 +11431,7 @@ msgstr "Activado"
#: libraries/relation.lib.php:100
#, fuzzy
#| msgid "Configuration saved."
msgid "Configuration of pmadb… "
msgid "Configuration of pmadb…"
msgstr "Configuración gardada."
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140
@ -12392,7 +12378,7 @@ msgstr "Non hai acontecementos que mostrar."
#: libraries/select_lang.lib.php:614
msgid "Ignoring unsupported language code."
msgstr ""
msgstr "Ignórase o código de idioma descoñecido."
#: libraries/select_server.lib.php:43 libraries/select_server.lib.php:48
#, fuzzy
@ -12457,7 +12443,6 @@ msgstr ""
#: libraries/server_databases.lib.php:366
#: libraries/server_databases.lib.php:371
#, fuzzy
#| msgid "Enable Statistics"
msgid "Enable statistics"
msgstr "Activar as estatísticas"

View File

@ -11539,7 +11539,7 @@ msgstr "מופעל"
#: libraries/relation.lib.php:100
#, fuzzy
#| msgid "Modifications have been saved"
msgid "Configuration of pmadb… "
msgid "Configuration of pmadb…"
msgstr "שינויים נשמרו"
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140

View File

@ -11836,7 +11836,7 @@ msgstr "सक्षम"
#: libraries/relation.lib.php:100
#, fuzzy
#| msgid "Configuration storage"
msgid "Configuration of pmadb… "
msgid "Configuration of pmadb…"
msgstr "विन्यास भंडारण"
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140

View File

@ -11944,7 +11944,7 @@ msgstr "Omogućeno"
#: libraries/relation.lib.php:100
#, fuzzy
#| msgid "Modifications have been saved"
msgid "Configuration of pmadb… "
msgid "Configuration of pmadb…"
msgstr "Izmjene su spremljene"
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140

View File

@ -11294,7 +11294,7 @@ msgid "Enabled"
msgstr "Engedélyezett"
#: libraries/relation.lib.php:100
msgid "Configuration of pmadb… "
msgid "Configuration of pmadb…"
msgstr "A pmadb beállítása… "
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140

View File

@ -10668,7 +10668,7 @@ msgid "Enabled"
msgstr "Առկա"
#: libraries/relation.lib.php:100
msgid "Configuration of pmadb… "
msgid "Configuration of pmadb…"
msgstr ""
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140
@ -14443,9 +14443,6 @@ msgid ""
"as well as information about relevant configuration settings to send to the "
"phpMyAdmin team to help us in debugging the problem."
msgstr ""
"Ձեր կայանքները պահպանվելու են միայն ընթացիկ ժամանակաշրջանի համար։ Դրանց "
"մշտական պահպանման համար անհրաժեշտ է %sphpMyAdmin-ի կազմաձևի պահպանման "
"ընդլայնումը%s։"
#: templates/error/report_form.phtml:15
msgid "You may examine the data in the error report:"

View File

@ -11178,7 +11178,7 @@ msgid "Enabled"
msgstr "Habilitate"
#: libraries/relation.lib.php:100
msgid "Configuration of pmadb… "
msgid "Configuration of pmadb…"
msgstr "Configuration de pmadb... "
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140

View File

@ -11845,7 +11845,7 @@ msgid "Enabled"
msgstr "Aktif"
#: libraries/relation.lib.php:100
msgid "Configuration of pmadb… "
msgid "Configuration of pmadb…"
msgstr "Konfigurasi pmadb … "
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140

View File

@ -4,7 +4,7 @@ msgstr ""
"Project-Id-Version: phpMyAdmin 4.5.4-dev\n"
"Report-Msgid-Bugs-To: translators@phpmyadmin.net\n"
"POT-Creation-Date: 2016-01-14 09:16+0100\n"
"PO-Revision-Date: 2016-01-14 14:28+0000\n"
"PO-Revision-Date: 2016-02-04 11:09+0000\n"
"Last-Translator: Stefano Martinelli <stefano.ste.martinelli@gmail.com>\n"
"Language-Team: Italian "
"<https://hosted.weblate.org/projects/phpmyadmin/4-5/it/>\n"
@ -11286,8 +11286,8 @@ msgid "Enabled"
msgstr "Abilitata"
#: libraries/relation.lib.php:100
msgid "Configuration of pmadb… "
msgstr "Configurazione di pmadb... "
msgid "Configuration of pmadb…"
msgstr "Configurazione di pmadb"
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140
msgid "General relation features"
@ -12779,7 +12779,7 @@ msgstr "Revoca tutti i privilegi attivi agli utenti e dopo li cancella."
#: libraries/server_privileges.lib.php:3679
#: libraries/server_privileges.lib.php:3682
msgid "Drop the databases that have the same names as the users."
msgstr "Elimina i databases gli stessi nomi degli utenti."
msgstr "Elimina i database che hanno gli stessi nomi degli utenti."
#: libraries/server_privileges.lib.php:3825
msgid "No users selected for deleting!"

View File

@ -4,10 +4,10 @@ msgstr ""
"Project-Id-Version: phpMyAdmin 4.5.4-dev\n"
"Report-Msgid-Bugs-To: translators@phpmyadmin.net\n"
"POT-Creation-Date: 2016-01-14 09:16+0100\n"
"PO-Revision-Date: 2016-01-07 09:01+0000\n"
"Last-Translator: 初音ミクSiketyan <siketyan0130@gmail.com>\n"
"Language-Team: Japanese <https://hosted.weblate.org/projects/phpmyadmin/4-5/"
"ja/>\n"
"PO-Revision-Date: 2016-01-22 11:08+0000\n"
"Last-Translator: Masahiro Nishi <grooversmail@gmail.com>\n"
"Language-Team: Japanese "
"<https://hosted.weblate.org/projects/phpmyadmin/4-5/ja/>\n"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -949,10 +949,9 @@ msgstr ""
"のデータも削除されます!"
#: js/messages.php:65
#, fuzzy
#| msgid "Do you really want to delete the search \"%s\"?"
msgid "Do you really want to TRUNCATE the selected partition(s)?"
msgstr "本当に検索「%s」の削除を実行しますか?"
msgstr "選択したパーティションを本当に削除しますか?"
#: js/messages.php:66
#, fuzzy
@ -1071,10 +1070,9 @@ msgid "Preview SQL"
msgstr "SQLのプレビュー"
#: js/messages.php:113
#, fuzzy
#| msgid "in query"
msgid "Simulate query"
msgstr "行/クエリ"
msgstr "クエリを検証"
#: js/messages.php:114
#, fuzzy
@ -12150,7 +12148,7 @@ msgstr "有効"
#: libraries/relation.lib.php:100
#, fuzzy
#| msgid "Configuration saved."
msgid "Configuration of pmadb… "
msgid "Configuration of pmadb…"
msgstr "設定を保存しました。"
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140

View File

@ -12019,7 +12019,7 @@ msgstr "ჩართულია"
#: libraries/relation.lib.php:100
#, fuzzy
#| msgid "Configuration file"
msgid "Configuration of pmadb… "
msgid "Configuration of pmadb…"
msgstr "კონფიგურაციის ფაილი"
#: libraries/relation.lib.php:104 libraries/relation.lib.php:140

Some files were not shown because too many files have changed in this diff Show More