diff --git a/.gitignore b/.gitignore index 49c59becb..b4122b670 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ coverage.xml *~ .php_cs.cache *sw[op] +phpunit.xml diff --git a/.travis.yml b/.travis.yml index 9b0becf3a..70bc1369e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,33 +3,24 @@ language: php dist: trusty php: - - "5.4" - - "5.5" - - "5.6" - - "7.0" - - "7.1" - - "7.2" - - "hhvm-3.12" - - "hhvm-3.18" - - "hhvm-3.24" - - "nightly" + - 7.1 + - 7.2 + - 7.3 + - nightly matrix: fast_finish: true allow_failures: - - php: "nightly" + - php: nightly include: - - php: "7.1" + - php: 7.2 env: DOCS=yes - - php: "7.1" + - php: 7.1 env: REQUIRE="phpmyadmin/motranslator:^3.0" - - dist: precise - php: "5.3" sudo: false install: - - if [ "$TRAVIS_PHP_VERSION" = "5.3" ] ; then sed -i '/apigen/D' composer.json ; fi - if [ -n "$REQUIRE" ] ; then composer require "$REQUIRE" ; fi - composer install @@ -40,6 +31,6 @@ cache: directories: - $HOME/.composer/cache -script: - - if [ "$DOCS" != "yes" ] ; then ./vendor/bin/phpunit --configuration phpunit.xml ; fi - - if [ "$DOCS" = "yes" ] ; then ./vendor/bin/apigen generate --destination doc --source src/ ; fi +script: + - if [ "$DOCS" != "yes" ] ; then ./vendor/bin/phpunit --configuration phpunit.xml.dist ; fi + - if [ "$DOCS" = "yes" ] ; then ./vendor/bin/sami.php --no-interaction update ./tools/sami-config.php ; fi diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c23966df..98af7b845 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,29 @@ ## [Unreleased] +* Drop support for PHP 5.3, PHP 5.4, PHP 5.5, PHP 5.6, PHP 7.0 and HHVM + +## [4.3.1] - 2019-01-05 + +* Fixed incorrect error thrown on DEFAULT keyword in ALTER statement (#218) + +## [4.3.0] - 2018-12-25 + +* Add support for aliases on CASE expressions (#162 and #192) +* Add support for INDEX hints in SELECT statement (#199) +* Add support for LOCK and UNLOCK TABLES statement (#180) +* Add detection of extraneous comma in UPDATE statement (#160) +* Add detection of a missing comma between two ALTER operations (#189) +* Add missing support for STRAIGHT_JOIN (#196) +* Add support for end options in SET statement (#190) +* Fix building of RENAME statements (#201) +* Add support for PURGE statements (#207) +* Add support for COLLATE keyword (#190) + +## [4.2.5] - 2018-10-31 + +* Fix issue with CREATE OR REPLACE VIEW. + ## [4.2.4] - 2017-12-06 * Fix parsing of CREATE TABLE with per field COLLATE. @@ -312,4 +335,3 @@ __Breaking changes:__ ## [1.0.0] - 2015-08-20 * First release of this library. - diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..4c4029143 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at info@phpmyadmin.net. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/composer.json b/composer.json index 7ef31f21b..3ed7107f2 100644 --- a/composer.json +++ b/composer.json @@ -16,13 +16,13 @@ "source": "https://github.com/phpmyadmin/sql-parser" }, "require": { - "php": ">=5.3.0", + "php": "^7.1", "symfony/polyfill-mbstring": "^1.3" }, "require-dev": { - "apigen/apigen": "^4.1", + "sami/sami": "^4.0", "phpunit/php-code-coverage": "*", - "phpunit/phpunit": "~4.8 || ~5.7 || ~6.5" + "phpunit/phpunit": "^7.4" }, "conflict": { "phpmyadmin/motranslator": "<3.0" diff --git a/locale/fr/LC_MESSAGES/sqlparser.mo b/locale/fr/LC_MESSAGES/sqlparser.mo index 62fd9e78a..f348d3e13 100644 Binary files a/locale/fr/LC_MESSAGES/sqlparser.mo and b/locale/fr/LC_MESSAGES/sqlparser.mo differ diff --git a/locale/fr/LC_MESSAGES/sqlparser.po b/locale/fr/LC_MESSAGES/sqlparser.po index 2070d678e..84ec6cdd7 100644 --- a/locale/fr/LC_MESSAGES/sqlparser.po +++ b/locale/fr/LC_MESSAGES/sqlparser.po @@ -4,16 +4,16 @@ msgstr "" "Project-Id-Version: phpMyAdmin-docs 4.0.0-dev\n" "Report-Msgid-Bugs-To: translators@phpmyadmin.net\n" "POT-Creation-Date: 2017-08-21 12:54+0200\n" -"PO-Revision-Date: 2017-09-03 19:37+0000\n" +"PO-Revision-Date: 2018-12-23 05:01+0000\n" "Last-Translator: tmtisfree \n" -"Language-Team: French \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 2.17-dev\n" +"X-Generator: Weblate 3.4-dev\n" #: src/Component.php:43 src/Component.php:63 msgid "Not implemented yet." @@ -184,7 +184,7 @@ msgstr "Mot clé non reconnu." #: src/Statement.php:377 msgid "Keyword at end of statement." -msgstr "Mot-clé à la fin de l'énoncé." +msgstr "Mot clé à la fin de l'énoncé." #: src/Statement.php:503 msgid "Unexpected ordering of clauses." diff --git a/locale/gu/LC_MESSAGES/sqlparser.mo b/locale/gu/LC_MESSAGES/sqlparser.mo index b36a11078..84b897d15 100644 Binary files a/locale/gu/LC_MESSAGES/sqlparser.mo and b/locale/gu/LC_MESSAGES/sqlparser.mo differ diff --git a/locale/gu/LC_MESSAGES/sqlparser.po b/locale/gu/LC_MESSAGES/sqlparser.po index 58bf5e8c1..a5d00c0d2 100644 --- a/locale/gu/LC_MESSAGES/sqlparser.po +++ b/locale/gu/LC_MESSAGES/sqlparser.po @@ -8,34 +8,35 @@ msgstr "" "Project-Id-Version: SQL parser 0\n" "Report-Msgid-Bugs-To: translators@phpmyadmin.net\n" "POT-Creation-Date: 2017-08-21 12:54+0200\n" -"PO-Revision-Date: 2016-01-08 17:45+0000\n" -"Last-Translator: Nijraj Gelani \n" +"PO-Revision-Date: 2018-12-05 14:09+0000\n" +"Last-Translator: Hardik Jogadia \n" "Language-Team: Gujarati \n" +"sql-parser/gu/>\n" "Language: gu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 2.5-dev\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 3.4-dev\n" #: src/Component.php:43 src/Component.php:63 msgid "Not implemented yet." -msgstr "" +msgstr "હજુ સુધી અમલમાં નથી મુકાયુ." #: src/Components/AlterOperation.php:241 src/Statement.php:334 msgid "" "A new statement was found, but no delimiter between it and the previous one." msgstr "" +"નવો નિવેદન મળ્યો હતો, પરંતુ તે અને પાછલા એક વચ્ચે કોઈ વિભાજક અક્ષરો નથી મળયા." #: src/Components/AlterOperation.php:253 msgid "Unrecognized alter operation." -msgstr "" +msgstr "આ ફેરફાર માન્ય નથી." #: src/Components/Array2d.php:88 #, php-format msgid "%1$d values were expected, but found %2$d." -msgstr "" +msgstr "%1$d આ પ્રકાર ની values અપેક્ષિત હતી, પણ મળ્યું %2$d." #: src/Components/Array2d.php:111 msgid "An opening bracket followed by a set of values was expected." @@ -43,7 +44,7 @@ msgstr "" #: src/Components/ArrayObj.php:114 src/Components/CreateDefinition.php:201 msgid "An opening bracket was expected." -msgstr "" +msgstr "ઓપનિંગ બ્રેકેટ અપેક્ષિત હતું." #: src/Components/CaseExpression.php:135 src/Components/CaseExpression.php:164 #: src/Components/CaseExpression.php:176 src/Components/CaseExpression.php:190 @@ -58,11 +59,11 @@ msgstr "" #: src/Statements/ReplaceStatement.php:155 #: src/Statements/ReplaceStatement.php:182 msgid "Unexpected keyword." -msgstr "" +msgstr "અનપેક્ષિત કીવર્ડ." #: src/Components/CaseExpression.php:199 msgid "Unexpected end of CASE expression" -msgstr "" +msgstr "અનપેક્ષિત અંત CASE નિવેદન નો" #: src/Components/CreateDefinition.php:223 msgid "" @@ -76,15 +77,15 @@ msgstr "" #: src/Components/CreateDefinition.php:270 msgid "A comma or a closing bracket was expected." -msgstr "" +msgstr "અલ્પવિરામ અથવા કલોસિંગ બ્રેકેટની અપેક્ષા હતી." #: src/Components/CreateDefinition.php:286 msgid "A closing bracket was expected." -msgstr "" +msgstr "કલોસિંગ બ્રેકેટની અપેક્ષા હતી." #: src/Components/DataType.php:123 msgid "Unrecognized data type." -msgstr "" +msgstr "અનપેક્ષિત ડેટા પ્રકાર." #: src/Components/Expression.php:244 src/Components/Expression.php:394 msgid "An alias was expected." @@ -97,15 +98,15 @@ msgstr "" #: src/Components/Expression.php:364 msgid "Unexpected dot." -msgstr "" +msgstr "અનપેક્ષિત પૂર્ણ વિરામ." #: src/Components/ExpressionArray.php:102 msgid "An expression was expected." -msgstr "" +msgstr "નિવેદનની અપેક્ષા હતી." #: src/Components/Limit.php:86 src/Components/Limit.php:108 msgid "An offset was expected." -msgstr "" +msgstr "ઓફસેટ અપેક્ષિત હતી." #: src/Components/OptionsArray.php:143 #, php-format @@ -114,11 +115,11 @@ msgstr "" #: src/Components/RenameOperation.php:109 msgid "The old name of the table was expected." -msgstr "" +msgstr "ટેબલનુ જૂનું નામ અપેક્ષિત હતુ." #: src/Components/RenameOperation.php:119 msgid "Keyword \"TO\" was expected." -msgstr "" +msgstr "કીવર્ડ \"TO\" અપેક્ષિત હતો." #: src/Components/RenameOperation.php:135 msgid "The new name of the table was expected." diff --git a/locale/nb/LC_MESSAGES/sqlparser.mo b/locale/nb/LC_MESSAGES/sqlparser.mo index 4b2c743c5..e689627ad 100644 Binary files a/locale/nb/LC_MESSAGES/sqlparser.mo and b/locale/nb/LC_MESSAGES/sqlparser.mo differ diff --git a/locale/nb/LC_MESSAGES/sqlparser.po b/locale/nb/LC_MESSAGES/sqlparser.po index a935fb530..8dd7166b5 100644 --- a/locale/nb/LC_MESSAGES/sqlparser.po +++ b/locale/nb/LC_MESSAGES/sqlparser.po @@ -4,16 +4,16 @@ msgstr "" "Project-Id-Version: SQL parser 0\n" "Report-Msgid-Bugs-To: translators@phpmyadmin.net\n" "POT-Creation-Date: 2017-08-21 12:54+0200\n" -"PO-Revision-Date: 2018-04-03 16:38+0000\n" -"Last-Translator: Master3395 \n" +"PO-Revision-Date: 2019-01-08 01:07+0000\n" +"Last-Translator: Allan Nordhøy \n" "Language-Team: Norwegian Bokmål \n" +"phpmyadmin/sql-parser/nb_NO/>\n" "Language: nb\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 2.20-dev\n" +"X-Generator: Weblate 3.4-dev\n" #: src/Component.php:43 src/Component.php:63 msgid "Not implemented yet." @@ -26,10 +26,8 @@ msgstr "" "En ny uttalelse ble funnet, men ingen skilletegn mellom det og den forrige." #: src/Components/AlterOperation.php:253 -#, fuzzy -#| msgid "Iconic table operations" msgid "Unrecognized alter operation." -msgstr "Ikoniske tabelloperasjoner" +msgstr "Ukjent endringsoperasjon." #: src/Components/Array2d.php:88 #, php-format @@ -39,12 +37,12 @@ msgstr "%1$d verdier var forventet, men fant %2$d." #: src/Components/Array2d.php:111 #, fuzzy msgid "An opening bracket followed by a set of values was expected." -msgstr "en åpen brakett etterfulgt av ett sett verdier var forventet." +msgstr "En åpeningsklamme etterfulgt av ett sett verdier var forventet." #: src/Components/ArrayObj.php:114 src/Components/CreateDefinition.php:201 #, fuzzy msgid "An opening bracket was expected." -msgstr "En åpnings brakett var forventet." +msgstr "En åpningsklamme var forventet." #: src/Components/CaseExpression.php:135 src/Components/CaseExpression.php:164 #: src/Components/CaseExpression.php:176 src/Components/CaseExpression.php:190 @@ -62,7 +60,6 @@ msgid "Unexpected keyword." msgstr "Uventede karakterer på linje %sd." #: src/Components/CaseExpression.php:199 -#, fuzzy msgid "Unexpected end of CASE expression" msgstr "Uventet slutt av CASE-uttrykket" @@ -75,16 +72,14 @@ msgstr "" "et kolonnenavn uten tilbakesitater." #: src/Components/CreateDefinition.php:237 -#, fuzzy -#| msgid "Table name template" msgid "A symbol name was expected!" -msgstr "Tabellnavnmal" +msgstr "Et symbolnavn var forventet!" #: src/Components/CreateDefinition.php:270 #, fuzzy #| msgid "No tables selected." msgid "A comma or a closing bracket was expected." -msgstr "Ingen tabeller er valgt." +msgstr "Et komma eller lukkingsklamme var forventet." #: src/Components/CreateDefinition.php:286 msgid "A closing bracket was expected." @@ -95,29 +90,25 @@ msgid "Unrecognized data type." msgstr "Ukjent datatype." #: src/Components/Expression.php:244 src/Components/Expression.php:394 -#, fuzzy -#| msgid "No tables selected." msgid "An alias was expected." -msgstr "Ingen tabeller er valgt." +msgstr "Et alias ble forventet." #: src/Components/Expression.php:332 src/Components/Expression.php:351 #: src/Components/Expression.php:383 msgid "An alias was previously found." -msgstr "" +msgstr "Et alias ble tidligere funnet." #: src/Components/Expression.php:364 msgid "Unexpected dot." msgstr "Uventet dott." #: src/Components/ExpressionArray.php:102 -#, fuzzy -#| msgid "No rows selected" msgid "An expression was expected." -msgstr "Ingen rader valgt" +msgstr "Et uttrykk var forventet." #: src/Components/Limit.php:86 src/Components/Limit.php:108 msgid "An offset was expected." -msgstr "" +msgstr "En forskyvning var forventet." #: src/Components/OptionsArray.php:143 #, php-format @@ -125,72 +116,57 @@ msgid "This option conflicts with \"%1$s\"." msgstr "Denne operasjonen konflikter med \"%1$s\"." #: src/Components/RenameOperation.php:109 -#, fuzzy -#| msgid "The number of tables that are open." msgid "The old name of the table was expected." -msgstr "Antall åpne tabeller." +msgstr "Det gamle navnet på tabellen var forventet." #: src/Components/RenameOperation.php:119 msgid "Keyword \"TO\" was expected." -msgstr "" +msgstr "Søkeordet \"TIL\" var forventet." #: src/Components/RenameOperation.php:135 -#, fuzzy -#| msgid "The number of tables that are open." msgid "The new name of the table was expected." -msgstr "Antall åpne tabeller." +msgstr "Det nye navnet på tabellen var forventet." #: src/Components/RenameOperation.php:153 -#, fuzzy -#| msgid "The row has been deleted." msgid "A rename operation was expected." -msgstr "Raden er slettet." +msgstr "En navneenringsoperasjon var forventet." #: src/Components/SetOperation.php:117 -#, fuzzy -#| msgid "as regular expression" msgid "Missing expression." -msgstr "som \"regular expression\"" +msgstr "Manglende uttrykk." #: src/Lexer.php:237 -#, fuzzy -#| msgid "Unexpected characters on line %s." msgid "Unexpected character." -msgstr "Uventede karakterer på linje %s." +msgstr "Uventet karakter." #: src/Lexer.php:278 msgid "Expected whitespace(s) before delimiter." -msgstr "" +msgstr "Forventet blanktegn før skilletegn." #: src/Lexer.php:296 src/Lexer.php:314 msgid "Expected delimiter." -msgstr "" +msgstr "Forventet avgrensning." #: src/Lexer.php:843 -#, fuzzy, php-format -#| msgid "Table %1$s has been created." +#, php-format msgid "Ending quote %1$s was expected." -msgstr "Tabellen %1$s har blitt opprettet." +msgstr "Sluttsitat %1$s var forventet." #: src/Lexer.php:884 -#, fuzzy -#| msgid "Table name template" msgid "Variable name was expected." -msgstr "Tabellnavnmal" +msgstr "Variabelt navn var forventet." #: src/Parser.php:423 -#, fuzzy -#| msgid "At Beginning of Table" msgid "Unexpected beginning of statement." -msgstr "Ved begynnelsen av tabellen" +msgstr "Uventet begynnelse av uttalelsen." #: src/Parser.php:442 msgid "Unrecognized statement type." -msgstr "" +msgstr "Ukjent setningstype." #: src/Parser.php:527 msgid "No transaction was previously started." -msgstr "" +msgstr "Ingen transaksjon ble tidligere startet." #: src/Statement.php:242 src/Statements/DeleteStatement.php:254 #: src/Statements/DeleteStatement.php:306 @@ -198,65 +174,49 @@ msgstr "" #: src/Statements/InsertStatement.php:246 src/Statements/LoadStatement.php:261 #: src/Statements/LoadStatement.php:291 src/Statements/LoadStatement.php:310 #: src/Statements/ReplaceStatement.php:190 -#, fuzzy -#| msgid "Unexpected characters on line %s." msgid "Unexpected token." -msgstr "Uventede karakterer på linje %s." +msgstr "Uventet tegn." #: src/Statement.php:306 msgid "This type of clause was previously parsed." -msgstr "" +msgstr "Denne typen klausul ble tidligere analysert." #: src/Statement.php:366 msgid "Unrecognized keyword." -msgstr "" +msgstr "Ukjent nøkkelord." #: src/Statement.php:377 -#, fuzzy -#| msgid "At Beginning of Table" msgid "Keyword at end of statement." -msgstr "Ved begynnelsen av tabellen" +msgstr "Nøkkelord ved slutten av uttalelsen." #: src/Statement.php:503 -#, fuzzy -#| msgid "At Beginning of Table" msgid "Unexpected ordering of clauses." -msgstr "Ved begynnelsen av tabellen" +msgstr "Uventet rekkefølge av klausuler." #: src/Statements/CreateStatement.php:375 -#, fuzzy -#| msgid "The number of tables that are open." msgid "The name of the entity was expected." -msgstr "Antall åpne tabeller." +msgstr "Navnet på enheten var forventet." #: src/Statements/CreateStatement.php:430 -#, fuzzy -#| msgid "Table name template" msgid "A table name was expected." -msgstr "Tabellnavnmal" +msgstr "Et tabellnavn ble forventet." #: src/Statements/CreateStatement.php:438 -#, fuzzy -#| msgid "The row has been deleted." msgid "At least one column definition was expected." -msgstr "Raden er slettet." +msgstr "Minst en kolonnevariasjon ble forventet." #: src/Statements/CreateStatement.php:550 msgid "A \"RETURNS\" keyword was expected." -msgstr "" +msgstr "Et \"RETURNS\" søkeord ble forventet." #: src/Statements/DeleteStatement.php:314 msgid "This type of clause is not valid in Multi-table queries." -msgstr "" +msgstr "Denne typen klausul er ikke gyldig i Multi-tabell-spørringer." #: tests/Lexer/LexerTest.php:19 tests/Parser/ParserTest.php:58 -#, fuzzy -#| msgid "errors." msgid "error #1" -msgstr "feil." +msgstr "feil #1" #: tests/Lexer/LexerTest.php:46 tests/Parser/ParserTest.php:80 -#, fuzzy -#| msgid "Gather errors" msgid "strict error" -msgstr "Samle feilmeldinger" +msgstr "streng feil" diff --git a/locale/pt/LC_MESSAGES/sqlparser.mo b/locale/pt/LC_MESSAGES/sqlparser.mo index 0f11d03cf..d5401731f 100644 Binary files a/locale/pt/LC_MESSAGES/sqlparser.mo and b/locale/pt/LC_MESSAGES/sqlparser.mo differ diff --git a/locale/pt/LC_MESSAGES/sqlparser.po b/locale/pt/LC_MESSAGES/sqlparser.po index cbbccc8cc..5fadb3319 100644 --- a/locale/pt/LC_MESSAGES/sqlparser.po +++ b/locale/pt/LC_MESSAGES/sqlparser.po @@ -4,16 +4,16 @@ msgstr "" "Project-Id-Version: SQL parser 0\n" "Report-Msgid-Bugs-To: translators@phpmyadmin.net\n" "POT-Creation-Date: 2017-08-21 12:54+0200\n" -"PO-Revision-Date: 2017-01-16 01:33+0000\n" -"Last-Translator: Manuela Silva \n" +"PO-Revision-Date: 2018-10-08 21:32+0000\n" +"Last-Translator: ssantos \n" "Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 2.11-dev\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 3.2.1\n" #: src/Component.php:43 src/Component.php:63 msgid "Not implemented yet." @@ -23,25 +23,25 @@ msgstr "Ainda não foi implementado." msgid "" "A new statement was found, but no delimiter between it and the previous one." msgstr "" +"Uma nova instrução foi encontrada, mas nenhum delimitador entre ela e a " +"anterior." #: src/Components/AlterOperation.php:253 -#, fuzzy -#| msgid "Iconic table operations" msgid "Unrecognized alter operation." -msgstr "Tabela de operações em ícones" +msgstr "Operação de alteração não reconhecida." #: src/Components/Array2d.php:88 #, php-format msgid "%1$d values were expected, but found %2$d." -msgstr "" +msgstr "Eram esperados %1$d valores, mas foram encontrados %2$d." #: src/Components/Array2d.php:111 msgid "An opening bracket followed by a set of values was expected." -msgstr "" +msgstr "Uma abertura de chaveta seguida de um conjunto de valores era esperada." #: src/Components/ArrayObj.php:114 src/Components/CreateDefinition.php:201 msgid "An opening bracket was expected." -msgstr "" +msgstr "Uma abertura de chaveta era esperada." #: src/Components/CaseExpression.php:135 src/Components/CaseExpression.php:164 #: src/Components/CaseExpression.php:176 src/Components/CaseExpression.php:190 @@ -60,128 +60,110 @@ msgstr "Palavra-chave inesperada." #: src/Components/CaseExpression.php:199 msgid "Unexpected end of CASE expression" -msgstr "" +msgstr "Fim da expressão CASE inesperada" #: src/Components/CreateDefinition.php:223 msgid "" "A symbol name was expected! A reserved keyword can not be used as a column " "name without backquotes." msgstr "" +"Um nome de símbolo era esperado! Uma chave reservada não pode ser usada como " +"um nome de coluna sem as chaves." #: src/Components/CreateDefinition.php:237 -#, fuzzy -#| msgid "Table name template" msgid "A symbol name was expected!" -msgstr "Modelo de nome da tabela" +msgstr "Um nome do símbolo era esperado!" #: src/Components/CreateDefinition.php:270 -#, fuzzy -#| msgid "No tables selected." msgid "A comma or a closing bracket was expected." -msgstr "Nenhuma tabela selecionada." +msgstr "Uma vírgula ou um colchete de fechamento era esperado." #: src/Components/CreateDefinition.php:286 msgid "A closing bracket was expected." -msgstr "" +msgstr "Um colchete ou parenteses era esperado." #: src/Components/DataType.php:123 msgid "Unrecognized data type." -msgstr "" +msgstr "Tipo de dado desconhecido." #: src/Components/Expression.php:244 src/Components/Expression.php:394 -#, fuzzy -#| msgid "No tables selected." msgid "An alias was expected." -msgstr "Nenhuma tabela selecionada." +msgstr "Um alias era esperado." #: src/Components/Expression.php:332 src/Components/Expression.php:351 #: src/Components/Expression.php:383 msgid "An alias was previously found." -msgstr "" +msgstr "Um alias foi previamente encontrado." #: src/Components/Expression.php:364 msgid "Unexpected dot." -msgstr "" +msgstr "Ponto inesperado." #: src/Components/ExpressionArray.php:102 -#, fuzzy -#| msgid "No rows selected" msgid "An expression was expected." -msgstr "Nenhum registo(linha) seleccionado" +msgstr "Uma expressão era esperada." #: src/Components/Limit.php:86 src/Components/Limit.php:108 msgid "An offset was expected." -msgstr "" +msgstr "Um offset era esperado." #: src/Components/OptionsArray.php:143 #, php-format msgid "This option conflicts with \"%1$s\"." -msgstr "" +msgstr "Essa opção conflita com \"%1$s1\"." #: src/Components/RenameOperation.php:109 -#, fuzzy -#| msgid "Title of browser window when a table is selected." msgid "The old name of the table was expected." -msgstr "Título da janela do navegador quando uma tabela estiver selecionada." +msgstr "O nome antigo da tabela era esperado." #: src/Components/RenameOperation.php:119 msgid "Keyword \"TO\" was expected." -msgstr "" +msgstr "Palavra-chave \"TO\" era esperada." #: src/Components/RenameOperation.php:135 msgid "The new name of the table was expected." -msgstr "" +msgstr "O novo nome da tabela era esperado." #: src/Components/RenameOperation.php:153 -#, fuzzy -#| msgid "The row has been deleted." msgid "A rename operation was expected." -msgstr "Registo eliminado." +msgstr "Uma operação rename era esperada." #: src/Components/SetOperation.php:117 -#, fuzzy -#| msgid "as regular expression" msgid "Missing expression." -msgstr "como expressão regular" +msgstr "Faltando expressão." #: src/Lexer.php:237 -#, fuzzy -#| msgid "Unexpected characters on line %s." msgid "Unexpected character." -msgstr "Caracteres inesperados na linha %s." +msgstr "Caractere inesperado." #: src/Lexer.php:278 msgid "Expected whitespace(s) before delimiter." -msgstr "" +msgstr "Espaço(s) em Branco(s) esperado antes do delimitador." #: src/Lexer.php:296 src/Lexer.php:314 msgid "Expected delimiter." -msgstr "" +msgstr "Delimitador esperado." #: src/Lexer.php:843 -#, fuzzy, php-format +#, php-format msgid "Ending quote %1$s was expected." -msgstr "A tabela %s foi eliminada" +msgstr "Citação final %1$s1 era esperada." #: src/Lexer.php:884 -#, fuzzy -#| msgid "Table name template" msgid "Variable name was expected." -msgstr "Modelo de nome da tabela" +msgstr "Nome da variável era esperado." #: src/Parser.php:423 -#, fuzzy -#| msgid "At Beginning of Table" msgid "Unexpected beginning of statement." -msgstr "No Início da Tabela" +msgstr "Inesperado começo da declaração." #: src/Parser.php:442 msgid "Unrecognized statement type." -msgstr "" +msgstr "Tipo de declaração desconhecida." #: src/Parser.php:527 msgid "No transaction was previously started." -msgstr "" +msgstr "Nenhuma transação foi iniciada anteriormente." #: src/Statement.php:242 src/Statements/DeleteStatement.php:254 #: src/Statements/DeleteStatement.php:306 @@ -189,63 +171,49 @@ msgstr "" #: src/Statements/InsertStatement.php:246 src/Statements/LoadStatement.php:261 #: src/Statements/LoadStatement.php:291 src/Statements/LoadStatement.php:310 #: src/Statements/ReplaceStatement.php:190 -#, fuzzy -#| msgid "Unexpected characters on line %s." msgid "Unexpected token." -msgstr "Caracteres inesperados na linha %s." +msgstr "Token inesperado." #: src/Statement.php:306 msgid "This type of clause was previously parsed." -msgstr "" +msgstr "Este tipo de cláusula foi previamente analisado." #: src/Statement.php:366 msgid "Unrecognized keyword." -msgstr "" +msgstr "Palavra-chave desconhecida." #: src/Statement.php:377 -#, fuzzy -#| msgid "At Beginning of Table" msgid "Keyword at end of statement." -msgstr "No Início da Tabela" +msgstr "Palavra-chave no final da declaração." #: src/Statement.php:503 -#, fuzzy -#| msgid "At Beginning of Table" msgid "Unexpected ordering of clauses." -msgstr "No Início da Tabela" +msgstr "Ordenação inesperada de cláusulas." #: src/Statements/CreateStatement.php:375 msgid "The name of the entity was expected." -msgstr "" +msgstr "O nome da entidade era esperado." #: src/Statements/CreateStatement.php:430 -#, fuzzy -#| msgid "Table name template" msgid "A table name was expected." -msgstr "Modelo de nome da tabela" +msgstr "Um nome para a tabela era esperado." #: src/Statements/CreateStatement.php:438 -#, fuzzy -#| msgid "The row has been deleted." msgid "At least one column definition was expected." -msgstr "Registo eliminado." +msgstr "Pelo menos uma definição de coluna era esperada." #: src/Statements/CreateStatement.php:550 msgid "A \"RETURNS\" keyword was expected." -msgstr "" +msgstr "Uma palavra-chave \"RETURNS\" era esperada." #: src/Statements/DeleteStatement.php:314 msgid "This type of clause is not valid in Multi-table queries." -msgstr "" +msgstr "Esse tipo de clausula não é válida em queries Multi-tabela." #: tests/Lexer/LexerTest.php:19 tests/Parser/ParserTest.php:58 -#, fuzzy -#| msgid "Error" msgid "error #1" -msgstr "Erro" +msgstr "Erro #1" #: tests/Lexer/LexerTest.php:46 tests/Parser/ParserTest.php:80 -#, fuzzy -#| msgid "Gather errors" msgid "strict error" -msgstr "Reunir erros" +msgstr "Erro severo" diff --git a/locale/ro/LC_MESSAGES/sqlparser.mo b/locale/ro/LC_MESSAGES/sqlparser.mo index 600d612d1..9cf4b1661 100644 Binary files a/locale/ro/LC_MESSAGES/sqlparser.mo and b/locale/ro/LC_MESSAGES/sqlparser.mo differ diff --git a/locale/ro/LC_MESSAGES/sqlparser.po b/locale/ro/LC_MESSAGES/sqlparser.po index 038c3b503..92b2c7c59 100644 --- a/locale/ro/LC_MESSAGES/sqlparser.po +++ b/locale/ro/LC_MESSAGES/sqlparser.po @@ -4,45 +4,45 @@ msgstr "" "Project-Id-Version: SQL parser 0\n" "Report-Msgid-Bugs-To: translators@phpmyadmin.net\n" "POT-Creation-Date: 2017-08-21 12:54+0200\n" -"PO-Revision-Date: 2018-02-04 09:39+0000\n" -"Last-Translator: Cristian Gherman \n" -"Language-Team: Romanian \n" +"PO-Revision-Date: 2018-07-24 05:41+0000\n" +"Last-Translator: Dan Caragea \n" +"Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2;\n" -"X-Generator: Weblate 2.19-dev\n" +"X-Generator: Weblate 3.1-dev\n" #: src/Component.php:43 src/Component.php:63 msgid "Not implemented yet." -msgstr "Nu este inca implementat." +msgstr "Neimplementat încă." #: src/Components/AlterOperation.php:241 src/Statement.php:334 msgid "" "A new statement was found, but no delimiter between it and the previous one." msgstr "" -"O nouă operațiune a fost găsită, dar nu exista niciun delimitator între " +"A fost găsită o nouă activitate, dar nu există niciun delimitator între " "aceasta și cea anterioară." #: src/Components/AlterOperation.php:253 msgid "Unrecognized alter operation." -msgstr "Operațiune de alterare necunoscută." +msgstr "Activitate de modificare necunoscută." #: src/Components/Array2d.php:88 #, php-format msgid "%1$d values were expected, but found %2$d." -msgstr "Au fost gasite %2$d valori desi erau asteptate %1$d." +msgstr "Au fost așteptate %1$d valori, dar s-au găsit %2$d." #: src/Components/Array2d.php:111 msgid "An opening bracket followed by a set of values was expected." -msgstr "Erau de așteptat o paranteză deschisă urmată de o serie de valori." +msgstr "Era așteptată o paranteză de deschidere urmată de un set de valori." #: src/Components/ArrayObj.php:114 src/Components/CreateDefinition.php:201 msgid "An opening bracket was expected." -msgstr "O paranteza deschisa este necesara." +msgstr "Era așteptată o paranteza de deschidere." #: src/Components/CaseExpression.php:135 src/Components/CaseExpression.php:164 #: src/Components/CaseExpression.php:176 src/Components/CaseExpression.php:190 @@ -68,20 +68,20 @@ msgid "" "A symbol name was expected! A reserved keyword can not be used as a column " "name without backquotes." msgstr "" -"Un nume de simbol era de așteptat! Un cuvânt cheie rezervat nu poate fi " -"utilizat ca nume de coloană daca nu este incadrat in ghilimele." +"Era așteptat nume de simbol! Un cuvânt cheie rezervat nu poate fi folosit ca " +"nume de coloană fără ghilimele." #: src/Components/CreateDefinition.php:237 msgid "A symbol name was expected!" -msgstr "Un nume de simbol era de așteptat!" +msgstr "Era așteptat un nume de simbol!" #: src/Components/CreateDefinition.php:270 msgid "A comma or a closing bracket was expected." -msgstr "Erau de așteptat o virgulă sau o paranteză închisă." +msgstr "Era așteptată o virgulă sau o paranteză de închidere." #: src/Components/CreateDefinition.php:286 msgid "A closing bracket was expected." -msgstr "O paranteza inchisa este necesara." +msgstr "Era așteptată o paranteza de închidere." #: src/Components/DataType.php:123 msgid "Unrecognized data type." @@ -89,33 +89,33 @@ msgstr "Tip de date nerecunoscut." #: src/Components/Expression.php:244 src/Components/Expression.php:394 msgid "An alias was expected." -msgstr "Un alias era asteptat." +msgstr "Era așteptat un alias." #: src/Components/Expression.php:332 src/Components/Expression.php:351 #: src/Components/Expression.php:383 msgid "An alias was previously found." -msgstr "Un alias a fost deja gasit." +msgstr "A fost găsit anterior un alias." #: src/Components/Expression.php:364 msgid "Unexpected dot." -msgstr "Caracterul punct(.) nu era asteptat." +msgstr "Punct neașteptat." #: src/Components/ExpressionArray.php:102 msgid "An expression was expected." -msgstr "Era asteptata o expresie." +msgstr "Era așteptată o expresie." #: src/Components/Limit.php:86 src/Components/Limit.php:108 msgid "An offset was expected." -msgstr "O deplasare(offset) era asteptata." +msgstr "Era așteptat un decalaj." #: src/Components/OptionsArray.php:143 #, php-format msgid "This option conflicts with \"%1$s\"." -msgstr "Aceasta optiune intra in conflict cu \"%1$s\"." +msgstr "Aceasta opțiune intră în conflict cu „%1$s”." #: src/Components/RenameOperation.php:109 msgid "The old name of the table was expected." -msgstr "Numele vechi al tabelului este cerut." +msgstr "Era așteptat numele vechi al tabelului." #: src/Components/RenameOperation.php:119 msgid "Keyword \"TO\" was expected." @@ -123,37 +123,36 @@ msgstr "Cuvantul cheie \"TO\" este cerut." #: src/Components/RenameOperation.php:135 msgid "The new name of the table was expected." -msgstr "Numele nou al tabelului este cerut." +msgstr "Era așteptat numele nou al tabelului." #: src/Components/RenameOperation.php:153 msgid "A rename operation was expected." -msgstr "Este asteptata o operatiune de redenumire (rename)." +msgstr "Era așteptată o operație de redenumire." #: src/Components/SetOperation.php:117 msgid "Missing expression." -msgstr "Expresie lipsa." +msgstr "Lipsește expresia." #: src/Lexer.php:237 msgid "Unexpected character." -msgstr "Caracter neasteptat." +msgstr "Caracter neașteptat." #: src/Lexer.php:278 msgid "Expected whitespace(s) before delimiter." -msgstr "Se cer spatii (whitespace) inainte de delimitator." +msgstr "S-au așteptat spații goale înainte de delimitator." #: src/Lexer.php:296 src/Lexer.php:314 msgid "Expected delimiter." -msgstr "Se asteapta delimitator." +msgstr "A fost așteptat delimitatorul." #: src/Lexer.php:843 -#, fuzzy, php-format -#| msgid "Event %1$s has been created." +#, php-format msgid "Ending quote %1$s was expected." -msgstr "Evenimentul %1$s a fost creat." +msgstr "Erau așteptate ghilimele la sfârșit %1$s." #: src/Lexer.php:884 msgid "Variable name was expected." -msgstr "Numele variabilei era aşteptată." +msgstr "Era așteptat numele variabilei." #: src/Parser.php:423 msgid "Unexpected beginning of statement." @@ -161,11 +160,11 @@ msgstr "Început neașteptat al declarației." #: src/Parser.php:442 msgid "Unrecognized statement type." -msgstr "Tipul de declaraţie de nerecunoscut." +msgstr "Tip de activitate nerecunoscut." #: src/Parser.php:527 msgid "No transaction was previously started." -msgstr "Nici o tranzactie a fost început anterior." +msgstr "Nu a fost începută anterior nicio tranzacție." #: src/Statement.php:242 src/Statements/DeleteStatement.php:254 #: src/Statements/DeleteStatement.php:306 @@ -173,10 +172,8 @@ msgstr "Nici o tranzactie a fost început anterior." #: src/Statements/InsertStatement.php:246 src/Statements/LoadStatement.php:261 #: src/Statements/LoadStatement.php:291 src/Statements/LoadStatement.php:310 #: src/Statements/ReplaceStatement.php:190 -#, fuzzy -#| msgid "Unexpected characters on line %s." msgid "Unexpected token." -msgstr "Simbol neașteptat." +msgstr "Token neașteptat." #: src/Statement.php:306 msgid "This type of clause was previously parsed." @@ -187,34 +184,24 @@ msgid "Unrecognized keyword." msgstr "Cuvânt cheie nerecunoscut." #: src/Statement.php:377 -#, fuzzy -#| msgid "At Beginning of Table" msgid "Keyword at end of statement." msgstr "Cuvânt cheie la sfârșitul declarației." #: src/Statement.php:503 -#, fuzzy -#| msgid "At Beginning of Table" msgid "Unexpected ordering of clauses." -msgstr "Ordonarea neașteptată a clauzelor." +msgstr "Ordonare neașteptată a clauzelor." #: src/Statements/CreateStatement.php:375 -#, fuzzy -#| msgid "The number of tables that are open." msgid "The name of the entity was expected." -msgstr "Numele entității era așteptat." +msgstr "Era așteptat numele entității." #: src/Statements/CreateStatement.php:430 -#, fuzzy -#| msgid "Table name template" msgid "A table name was expected." -msgstr "Un nume de tabel era așteptat." +msgstr "Era așteptat un nume de tabel." #: src/Statements/CreateStatement.php:438 -#, fuzzy -#| msgid "The row has been deleted." msgid "At least one column definition was expected." -msgstr "Cel puțin o definiție a coloanei era așteptată." +msgstr "Era așteptată cel puțin o definiție a coloanei." #: src/Statements/CreateStatement.php:550 msgid "A \"RETURNS\" keyword was expected." @@ -222,16 +209,12 @@ msgstr "Un cuvânt cheie \"RETURNS\" era de aşteptat." #: src/Statements/DeleteStatement.php:314 msgid "This type of clause is not valid in Multi-table queries." -msgstr "Acest tip de clauză nu este validă în interogări multi-tabel." +msgstr "Acest tip de clauză nu este valid în interogările mai multor tabele." #: tests/Lexer/LexerTest.php:19 tests/Parser/ParserTest.php:58 -#, fuzzy -#| msgid "Error" msgid "error #1" -msgstr "eroarea #1" +msgstr "eroare #1" #: tests/Lexer/LexerTest.php:46 tests/Parser/ParserTest.php:80 -#, fuzzy -#| msgid "Gather errors" msgid "strict error" msgstr "eroare strictă" diff --git a/locale/si/LC_MESSAGES/sqlparser.mo b/locale/si/LC_MESSAGES/sqlparser.mo index 667b0fcdc..ce5d946ab 100644 Binary files a/locale/si/LC_MESSAGES/sqlparser.mo and b/locale/si/LC_MESSAGES/sqlparser.mo differ diff --git a/locale/si/LC_MESSAGES/sqlparser.po b/locale/si/LC_MESSAGES/sqlparser.po index 0b751f80c..8a94a2525 100644 --- a/locale/si/LC_MESSAGES/sqlparser.po +++ b/locale/si/LC_MESSAGES/sqlparser.po @@ -4,20 +4,20 @@ msgstr "" "Project-Id-Version: SQL parser 0\n" "Report-Msgid-Bugs-To: translators@phpmyadmin.net\n" "POT-Creation-Date: 2017-08-21 12:54+0200\n" -"PO-Revision-Date: 2016-01-06 03:53+0000\n" -"Last-Translator: Isuru Abeywardana \n" +"PO-Revision-Date: 2018-10-01 14:35+0000\n" +"Last-Translator: Menuka Ishan \n" "Language-Team: Sinhala \n" +"sql-parser/si/>\n" "Language: si\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 2.5-dev\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 3.2-dev\n" #: src/Component.php:43 src/Component.php:63 msgid "Not implemented yet." -msgstr "" +msgstr "තවම නිර්මාණය කර නොමැත." #: src/Components/AlterOperation.php:241 src/Statement.php:334 msgid "" @@ -25,10 +25,8 @@ msgid "" msgstr "" #: src/Components/AlterOperation.php:253 -#, fuzzy -#| msgid "Iconic table operations" msgid "Unrecognized alter operation." -msgstr "අයිකන සහිත වගු මෙහෙයුම්" +msgstr "හදුනානොගත් වෙනස් කිරීමේ මෙහෙයුමක්." #: src/Components/Array2d.php:88 #, php-format @@ -62,7 +60,7 @@ msgstr "%s වන පේළියේ අනපේක්ෂිත අනුලක #: src/Components/CaseExpression.php:199 msgid "Unexpected end of CASE expression" -msgstr "" +msgstr "'CASE' ප්‍රකාශය නොසිතු ලෙස අවසන් විය." #: src/Components/CreateDefinition.php:223 msgid "" @@ -71,30 +69,24 @@ msgid "" msgstr "" #: src/Components/CreateDefinition.php:237 -#, fuzzy -#| msgid "Table name template" msgid "A symbol name was expected!" -msgstr "ගොනු නාම ටෙම්ප්ලේටය" +msgstr "සංකේත නාමයක් බලාපොරොත්තු වේ!" #: src/Components/CreateDefinition.php:270 -#, fuzzy -#| msgid "No databases selected." msgid "A comma or a closing bracket was expected." -msgstr "දත්තගබඩාවක් තෝරාගෙන නොමැත." +msgstr "කොමාවක් හෝ අවසන් කිරීමේ වරහනක් බලාපොරොත්තු වේ." #: src/Components/CreateDefinition.php:286 msgid "A closing bracket was expected." -msgstr "" +msgstr "අවසන් කිරීමේ වරහනක් බලාපොරොත්තු වේ." #: src/Components/DataType.php:123 msgid "Unrecognized data type." msgstr "" #: src/Components/Expression.php:244 src/Components/Expression.php:394 -#, fuzzy -#| msgid "No databases selected." msgid "An alias was expected." -msgstr "දත්තගබඩාවක් තෝරාගෙන නොමැත." +msgstr "අනවර්ථ නාමයක් බලාපොරොත්තු වේ." #: src/Components/Expression.php:332 src/Components/Expression.php:351 #: src/Components/Expression.php:383 @@ -103,13 +95,11 @@ msgstr "" #: src/Components/Expression.php:364 msgid "Unexpected dot." -msgstr "" +msgstr "බලාපොරොත්තු නොවූ ඩොට් සලකුණක්." #: src/Components/ExpressionArray.php:102 -#, fuzzy -#| msgid "No rows selected" msgid "An expression was expected." -msgstr "පේළි කිසිවක් තෝරගෙන නැත" +msgstr "ප්‍රකාශයක් බලපොරොත්තු වේ." #: src/Components/Limit.php:86 src/Components/Limit.php:108 msgid "An offset was expected." diff --git a/locale/th/LC_MESSAGES/sqlparser.mo b/locale/th/LC_MESSAGES/sqlparser.mo index 5dc0cd643..42a74f888 100644 Binary files a/locale/th/LC_MESSAGES/sqlparser.mo and b/locale/th/LC_MESSAGES/sqlparser.mo differ diff --git a/locale/th/LC_MESSAGES/sqlparser.po b/locale/th/LC_MESSAGES/sqlparser.po index 5ecb46cde..85c441b49 100644 --- a/locale/th/LC_MESSAGES/sqlparser.po +++ b/locale/th/LC_MESSAGES/sqlparser.po @@ -4,16 +4,16 @@ msgstr "" "Project-Id-Version: SQL parser 0\n" "Report-Msgid-Bugs-To: translators@phpmyadmin.net\n" "POT-Creation-Date: 2017-08-21 12:54+0200\n" -"PO-Revision-Date: 2017-04-17 14:49+0000\n" -"Last-Translator: Pongsathorn Sraouthai \n" -"Language-Team: Thai \n" +"PO-Revision-Date: 2018-08-17 10:42+0000\n" +"Last-Translator: Anusuk Sangubon \n" +"Language-Team: Thai \n" "Language: th\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 2.14-dev\n" +"X-Generator: Weblate 3.2-dev\n" #: src/Component.php:43 src/Component.php:63 msgid "Not implemented yet." @@ -22,7 +22,7 @@ msgstr "ยังไม่มีการดำเนินการ" #: src/Components/AlterOperation.php:241 src/Statement.php:334 msgid "" "A new statement was found, but no delimiter between it and the previous one." -msgstr "ตรวจพบประพจน์ใหม่ แต่ไม่มีตัวคั่นระหว่างตัวมันและก่อนหน้านั้น" +msgstr "ตรวจพบประพจน์ใหม่ แต่ไม่มีตัวคั่นระหว่างข้อความนี้กับข้อความก่อนหน้า" #: src/Components/AlterOperation.php:253 msgid "Unrecognized alter operation." diff --git a/locale/ug/LC_MESSAGES/sqlparser.mo b/locale/ug/LC_MESSAGES/sqlparser.mo index 607d07367..d8bd2e8a5 100644 Binary files a/locale/ug/LC_MESSAGES/sqlparser.mo and b/locale/ug/LC_MESSAGES/sqlparser.mo differ diff --git a/locale/ug/LC_MESSAGES/sqlparser.po b/locale/ug/LC_MESSAGES/sqlparser.po index 5cd98da6e..c9eb73eb6 100644 --- a/locale/ug/LC_MESSAGES/sqlparser.po +++ b/locale/ug/LC_MESSAGES/sqlparser.po @@ -7,16 +7,16 @@ msgstr "" "Project-Id-Version: SQL parser 0\n" "Report-Msgid-Bugs-To: translators@phpmyadmin.net\n" "POT-Creation-Date: 2017-08-21 12:54+0200\n" -"PO-Revision-Date: 2015-10-15 11:03+0200\n" -"Last-Translator: Michal Čihař \n" -"Language-Team: Uighur \n" +"PO-Revision-Date: 2018-06-08 01:43+0000\n" +"Last-Translator: ۋولقان \n" +"Language-Team: Uyghur \n" "Language: ug\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 2.5-dev\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 3.0\n" #: src/Component.php:43 src/Component.php:63 msgid "Not implemented yet." @@ -233,10 +233,8 @@ msgid "This type of clause is not valid in Multi-table queries." msgstr "" #: tests/Lexer/LexerTest.php:19 tests/Parser/ParserTest.php:58 -#, fuzzy -#| msgid "Error" msgid "error #1" -msgstr "خاتالىق" +msgstr "خاتالىق #1" #: tests/Lexer/LexerTest.php:46 tests/Parser/ParserTest.php:80 #, fuzzy diff --git a/locale/vi/LC_MESSAGES/sqlparser.mo b/locale/vi/LC_MESSAGES/sqlparser.mo index d68197a88..cf651106b 100644 Binary files a/locale/vi/LC_MESSAGES/sqlparser.mo and b/locale/vi/LC_MESSAGES/sqlparser.mo differ diff --git a/locale/vi/LC_MESSAGES/sqlparser.po b/locale/vi/LC_MESSAGES/sqlparser.po index f58d80982..cf9f6e132 100644 --- a/locale/vi/LC_MESSAGES/sqlparser.po +++ b/locale/vi/LC_MESSAGES/sqlparser.po @@ -9,8 +9,8 @@ msgstr "" "Project-Id-Version: SQL parser 0\n" "Report-Msgid-Bugs-To: translators@phpmyadmin.net\n" "POT-Creation-Date: 2017-08-21 12:54+0200\n" -"PO-Revision-Date: 2017-03-25 13:13+0000\n" -"Last-Translator: Vuong Phan \n" +"PO-Revision-Date: 2018-06-30 00:46+0000\n" +"Last-Translator: Name \n" "Language-Team: Vietnamese \n" "Language: vi\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 2.12\n" +"X-Generator: Weblate 3.1-dev\n" #: src/Component.php:43 src/Component.php:63 msgid "Not implemented yet." @@ -71,6 +71,8 @@ msgid "" "A symbol name was expected! A reserved keyword can not be used as a column " "name without backquotes." msgstr "" +"Cần tên biểu tượng. Một từ khoá truy ngược không thể được sử dụng như là một " +"tên cột mà không có các ngoặc sau." #: src/Components/CreateDefinition.php:237 #, fuzzy diff --git a/locale/zh_CN/LC_MESSAGES/sqlparser.mo b/locale/zh_CN/LC_MESSAGES/sqlparser.mo index 9e737f3a4..700ea4a22 100644 Binary files a/locale/zh_CN/LC_MESSAGES/sqlparser.mo and b/locale/zh_CN/LC_MESSAGES/sqlparser.mo differ diff --git a/locale/zh_CN/LC_MESSAGES/sqlparser.po b/locale/zh_CN/LC_MESSAGES/sqlparser.po index 40c3aaf17..45f4f6e43 100644 --- a/locale/zh_CN/LC_MESSAGES/sqlparser.po +++ b/locale/zh_CN/LC_MESSAGES/sqlparser.po @@ -4,8 +4,8 @@ msgstr "" "Project-Id-Version: SQL parser 0\n" "Report-Msgid-Bugs-To: translators@phpmyadmin.net\n" "POT-Creation-Date: 2017-08-21 12:54+0200\n" -"PO-Revision-Date: 2017-05-25 08:10+0000\n" -"Last-Translator: TobbyKwok \n" +"PO-Revision-Date: 2018-08-02 07:35+0000\n" +"Last-Translator: popcorner \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_CN\n" @@ -13,7 +13,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 2.14.1\n" +"X-Generator: Weblate 3.1.1\n" #: src/Component.php:43 src/Component.php:63 msgid "Not implemented yet." @@ -22,26 +22,24 @@ msgstr "还未实现." #: src/Components/AlterOperation.php:241 src/Statement.php:334 msgid "" "A new statement was found, but no delimiter between it and the previous one." -msgstr "" +msgstr "发现了一个新的声明,但它与前一声明之间没有分隔符。" #: src/Components/AlterOperation.php:253 -#, fuzzy -#| msgid "Iconic table operations" msgid "Unrecognized alter operation." -msgstr "数据表操作显示" +msgstr "无法识别的变更(alter)操作。" #: src/Components/Array2d.php:88 #, php-format msgid "%1$d values were expected, but found %2$d." -msgstr "" +msgstr "应有%1$d个值,但查找到了%2$d个。" #: src/Components/Array2d.php:111 msgid "An opening bracket followed by a set of values was expected." -msgstr "" +msgstr "应该有一个开头括号后面跟着一组值。" #: src/Components/ArrayObj.php:114 src/Components/CreateDefinition.php:201 msgid "An opening bracket was expected." -msgstr "" +msgstr "应该有一个左括号。" #: src/Components/CaseExpression.php:135 src/Components/CaseExpression.php:164 #: src/Components/CaseExpression.php:176 src/Components/CaseExpression.php:190 @@ -55,138 +53,113 @@ msgstr "" #: src/Statements/InsertStatement.php:217 src/Statements/LoadStatement.php:258 #: src/Statements/ReplaceStatement.php:155 #: src/Statements/ReplaceStatement.php:182 -#, fuzzy -#| msgid "Unexpected characters on line %s." msgid "Unexpected keyword." -msgstr "第 %s 行有不应出现的字符。" +msgstr "不应出现的关键词。" #: src/Components/CaseExpression.php:199 msgid "Unexpected end of CASE expression" -msgstr "" +msgstr "CASE表达式意外结束" #: src/Components/CreateDefinition.php:223 msgid "" "A symbol name was expected! A reserved keyword can not be used as a column " "name without backquotes." -msgstr "" +msgstr "应该有一个符号名称!保留的关键字不能用作没有反引号的列名。" #: src/Components/CreateDefinition.php:237 -#, fuzzy -#| msgid "Table name template" msgid "A symbol name was expected!" -msgstr "表名称模板" +msgstr "应该有一个符号名称!" #: src/Components/CreateDefinition.php:270 -#, fuzzy -#| msgid "No databases selected." msgid "A comma or a closing bracket was expected." -msgstr "没有已选择的数据库。" +msgstr "应该是有逗号或结束括号。" #: src/Components/CreateDefinition.php:286 msgid "A closing bracket was expected." -msgstr "" +msgstr "应有一个右括号。" #: src/Components/DataType.php:123 msgid "Unrecognized data type." -msgstr "" +msgstr "无法识别的数据类型。" #: src/Components/Expression.php:244 src/Components/Expression.php:394 -#, fuzzy -#| msgid "No databases selected." msgid "An alias was expected." -msgstr "没有已选择的数据库。" +msgstr "应该有一个别名。" #: src/Components/Expression.php:332 src/Components/Expression.php:351 #: src/Components/Expression.php:383 msgid "An alias was previously found." -msgstr "" +msgstr "之前发现了一个别名。" #: src/Components/Expression.php:364 msgid "Unexpected dot." -msgstr "" +msgstr "不应出现的点。" #: src/Components/ExpressionArray.php:102 -#, fuzzy -#| msgid "No rows selected" msgid "An expression was expected." -msgstr "没有选中任何行" +msgstr "应该为一个表达式。" #: src/Components/Limit.php:86 src/Components/Limit.php:108 msgid "An offset was expected." -msgstr "" +msgstr "应该为一个偏移。" #: src/Components/OptionsArray.php:143 #, php-format msgid "This option conflicts with \"%1$s\"." -msgstr "" +msgstr "此选项与“%1$s”冲突。" #: src/Components/RenameOperation.php:109 -#, fuzzy -#| msgid "The number of tables that are open." msgid "The old name of the table was expected." -msgstr "打开的数据表个数。" +msgstr "需要有表的旧名称。" #: src/Components/RenameOperation.php:119 msgid "Keyword \"TO\" was expected." -msgstr "" +msgstr "应为关键词“TO”。" #: src/Components/RenameOperation.php:135 -#, fuzzy -#| msgid "The number of tables that are open." msgid "The new name of the table was expected." -msgstr "打开的数据表个数。" +msgstr "应有表的新名称。" #: src/Components/RenameOperation.php:153 -#, fuzzy -#| msgid "The row has been deleted." msgid "A rename operation was expected." -msgstr "已删除该行。" +msgstr "应进行重命名操作。" #: src/Components/SetOperation.php:117 -#, fuzzy -#| msgid "as regular expression" msgid "Missing expression." -msgstr "使用正则表达式" +msgstr "缺少正则表达式。" #: src/Lexer.php:237 -#, fuzzy -#| msgid "Unexpected characters on line %s." msgid "Unexpected character." -msgstr "第 %s 行有不应出现的字符。" +msgstr "缺少字符。" #: src/Lexer.php:278 msgid "Expected whitespace(s) before delimiter." -msgstr "" +msgstr "分隔符之前应有空格。" #: src/Lexer.php:296 src/Lexer.php:314 msgid "Expected delimiter." -msgstr "" +msgstr "应有分隔符。" #: src/Lexer.php:843 -#, fuzzy, php-format -#| msgid "Event %1$s has been created." +#, php-format msgid "Ending quote %1$s was expected." -msgstr "已创建事件 %1$s 。" +msgstr "应有结束引号 %1$s。" #: src/Lexer.php:884 -#, fuzzy -#| msgid "Table name template" msgid "Variable name was expected." -msgstr "表名称模板" +msgstr "应有变量名。" #: src/Parser.php:423 -#, fuzzy -#| msgid "At Beginning of Table" msgid "Unexpected beginning of statement." -msgstr "于表开头" +msgstr "不应出现的开始声明。" #: src/Parser.php:442 msgid "Unrecognized statement type." -msgstr "" +msgstr "无法识别的声明形式。" #: src/Parser.php:527 msgid "No transaction was previously started." -msgstr "" +msgstr "之前没有开始任何事务。" #: src/Statement.php:242 src/Statements/DeleteStatement.php:254 #: src/Statements/DeleteStatement.php:306 @@ -194,65 +167,49 @@ msgstr "" #: src/Statements/InsertStatement.php:246 src/Statements/LoadStatement.php:261 #: src/Statements/LoadStatement.php:291 src/Statements/LoadStatement.php:310 #: src/Statements/ReplaceStatement.php:190 -#, fuzzy -#| msgid "Unexpected characters on line %s." msgid "Unexpected token." -msgstr "第 %s 行有不应出现的字符。" +msgstr "意外的标记." #: src/Statement.php:306 msgid "This type of clause was previously parsed." -msgstr "" +msgstr "之前已解析此类型的子句。" #: src/Statement.php:366 msgid "Unrecognized keyword." -msgstr "不能识别的关键词" +msgstr "不能识别的关键词。" #: src/Statement.php:377 -#, fuzzy -#| msgid "At Beginning of Table" msgid "Keyword at end of statement." -msgstr "于表开头" +msgstr "声明结尾处的关键字。" #: src/Statement.php:503 -#, fuzzy -#| msgid "At Beginning of Table" msgid "Unexpected ordering of clauses." -msgstr "于表开头" +msgstr "错误的语句顺序。" #: src/Statements/CreateStatement.php:375 -#, fuzzy -#| msgid "The number of tables that are open." msgid "The name of the entity was expected." -msgstr "打开的数据表个数。" +msgstr "应有该实体的名称。" #: src/Statements/CreateStatement.php:430 -#, fuzzy -#| msgid "Table name template" msgid "A table name was expected." -msgstr "表名称模板" +msgstr "应有表名。" #: src/Statements/CreateStatement.php:438 -#, fuzzy -#| msgid "The row has been deleted." msgid "At least one column definition was expected." -msgstr "已删除该行。" +msgstr "至少应有一个字段定义。" #: src/Statements/CreateStatement.php:550 msgid "A \"RETURNS\" keyword was expected." -msgstr "" +msgstr "应有“RETURNS”关键字。" #: src/Statements/DeleteStatement.php:314 msgid "This type of clause is not valid in Multi-table queries." -msgstr "" +msgstr "此类型的子句在多表查询中无效。" #: tests/Lexer/LexerTest.php:19 tests/Parser/ParserTest.php:58 -#, fuzzy -#| msgid "errors." msgid "error #1" -msgstr "个错误。" +msgstr "错误 #1" #: tests/Lexer/LexerTest.php:46 tests/Parser/ParserTest.php:80 -#, fuzzy -#| msgid "Gather errors" msgid "strict error" -msgstr "收集错误" +msgstr "严格错误" diff --git a/locale/zh_TW/LC_MESSAGES/sqlparser.mo b/locale/zh_TW/LC_MESSAGES/sqlparser.mo index 357eaa79c..ebe8e5ca8 100644 Binary files a/locale/zh_TW/LC_MESSAGES/sqlparser.mo and b/locale/zh_TW/LC_MESSAGES/sqlparser.mo differ diff --git a/locale/zh_TW/LC_MESSAGES/sqlparser.po b/locale/zh_TW/LC_MESSAGES/sqlparser.po index 43707a27e..61bbf5e6f 100644 --- a/locale/zh_TW/LC_MESSAGES/sqlparser.po +++ b/locale/zh_TW/LC_MESSAGES/sqlparser.po @@ -4,8 +4,8 @@ msgstr "" "Project-Id-Version: SQL parser 0\n" "Report-Msgid-Bugs-To: translators@phpmyadmin.net\n" "POT-Creation-Date: 2017-08-21 12:54+0200\n" -"PO-Revision-Date: 2017-03-21 02:29+0000\n" -"Last-Translator: mao \n" +"PO-Revision-Date: 2018-11-29 06:08+0000\n" +"Last-Translator: Walter Cheuk \n" "Language-Team: Chinese (Traditional) \n" "Language: zh_TW\n" @@ -13,7 +13,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 2.12\n" +"X-Generator: Weblate 3.3-dev\n" #: src/Component.php:43 src/Component.php:63 msgid "Not implemented yet." @@ -179,10 +179,8 @@ msgid "Unrecognized keyword." msgstr "無法辨識的關鍵字。" #: src/Statement.php:377 -#, fuzzy -#| msgid "Unexpected beginning of statement." msgid "Keyword at end of statement." -msgstr "預期之外的陳述句開頭。" +msgstr "陳述句結尾的關鍵字。" #: src/Statement.php:503 msgid "Unexpected ordering of clauses." diff --git a/phpunit.xml b/phpunit.xml.dist similarity index 96% rename from phpunit.xml rename to phpunit.xml.dist index d96b96d7a..36faf5035 100644 --- a/phpunit.xml +++ b/phpunit.xml.dist @@ -9,8 +9,7 @@ convertNoticesToExceptions="true" convertWarningsToExceptions="true" processIsolation="false" - stopOnFailure="false" - syntaxCheck="false"> + stopOnFailure="false"> diff --git a/src/Components/AlterOperation.php b/src/Components/AlterOperation.php index 9383eca84..e3893f7f0 100644 --- a/src/Components/AlterOperation.php +++ b/src/Components/AlterOperation.php @@ -236,13 +236,23 @@ public static function parse(Parser $parser, TokensList $list, array $options = // We have reached the end of ALTER operation and suddenly found // a start to new statement, but have not find a delimiter between them - if (!($token->value == 'SET' && $list->tokens[$list->idx - 1]->value == 'CHARACTER')) { + if (!($token->value === 'SET' && $list->tokens[$list->idx - 1]->value === 'CHARACTER')) { $parser->error( 'A new statement was found, but no delimiter between it and the previous one.', $token ); break; } + } elseif (array_key_exists($token->value, self::$DB_OPTIONS) + || (array_key_exists($token->value, self::$TABLE_OPTIONS) + && !self::checkIfColumnDefinitionKeyword($token->value)) + ) { + // This alter operation has finished, which means a comma was missing before start of new alter operation + $parser->error( + 'Missing comma before start of a new alter operation.', + $token + ); + break; } $ret->unknown[] = $token; } @@ -276,4 +286,17 @@ public static function build($component, array $options = array()) return $ret; } + + /** + * Check if token's value is one of the common keywords + * between column and table alteration + * + * @param string $tokenValue Value of current token + */ + private static function checkIfColumnDefinitionKeyword($tokenValue) { + $common_options = array('AUTO_INCREMENT', 'COMMENT', 'DEFAULT'); + // Since AUTO_INCREMENT and COMMENT can be used for + // both table as well as a specific column in the table + return in_array($tokenValue, $common_options); + } } diff --git a/src/Components/Array2d.php b/src/Components/Array2d.php index 92d8b1694..984179c37 100644 --- a/src/Components/Array2d.php +++ b/src/Components/Array2d.php @@ -82,7 +82,7 @@ public static function parse(Parser $parser, TokensList $list, array $options = $arrCount = count($arr->values); if ($count === -1) { $count = $arrCount; - } elseif ($arrCount != $count) { + } elseif ($arrCount !== $count) { $parser->error( sprintf( Translator::gettext('%1$d values were expected, but found %2$d.'), diff --git a/src/Components/CaseExpression.php b/src/Components/CaseExpression.php index 111eb042e..ab9076874 100644 --- a/src/Components/CaseExpression.php +++ b/src/Components/CaseExpression.php @@ -7,6 +7,7 @@ namespace PhpMyAdmin\SqlParser\Components; use PhpMyAdmin\SqlParser\Component; +use PhpMyAdmin\SqlParser\Context; use PhpMyAdmin\SqlParser\Parser; use PhpMyAdmin\SqlParser\Token; use PhpMyAdmin\SqlParser\TokensList; @@ -55,6 +56,13 @@ class CaseExpression extends Component */ public $else_result; + /** + * The alias of this CASE statement. + * + * @var string + */ + public $alias; + /** * The sub-expression. * @@ -70,8 +78,9 @@ public function __construct() } /** - * @param Parser $parser the parser that serves as context - * @param TokensList $list the list of tokens that are being parsed + * @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 * * @return CaseExpression */ @@ -111,29 +120,28 @@ public static function parse(Parser $parser, TokensList $list, array $options = } if ($state === 0) { - if ($token->type === Token::TYPE_KEYWORD - && $token->keyword === 'WHEN' - ) { - ++$list->idx; // Skip 'WHEN' - $new_condition = Condition::parse($parser, $list); - $type = 1; - $state = 1; - $ret->conditions[] = $new_condition; - } elseif ($token->type === Token::TYPE_KEYWORD - && $token->keyword === 'ELSE' - ) { - ++$list->idx; // Skip 'ELSE' - $ret->else_result = Expression::parse($parser, $list); - $state = 0; // last clause of CASE expression - } elseif ($token->type === Token::TYPE_KEYWORD - && $token->keyword === 'END' - ) { - $state = 3; // end of CASE expression - ++$list->idx; - break; - } elseif ($token->type === Token::TYPE_KEYWORD) { - $parser->error('Unexpected keyword.', $token); - break; + if ($token->type === Token::TYPE_KEYWORD) { + switch($token->keyword) { + case 'WHEN': + ++$list->idx; // Skip 'WHEN' + $new_condition = Condition::parse($parser, $list); + $type = 1; + $state = 1; + $ret->conditions[] = $new_condition; + break; + case 'ELSE': + ++$list->idx; // Skip 'ELSE' + $ret->else_result = Expression::parse($parser, $list); + $state = 0; // last clause of CASE expression + break; + case 'END': + $state = 3; // end of CASE expression + ++$list->idx; + break 2; + default: + $parser->error('Unexpected keyword.', $token); + break 2; + } } else { $ret->value = Expression::parse($parser, $list); $type = 0; @@ -141,28 +149,27 @@ public static function parse(Parser $parser, TokensList $list, array $options = } } elseif ($state === 1) { if ($type === 0) { - if ($token->type === Token::TYPE_KEYWORD - && $token->keyword === 'WHEN' - ) { - ++$list->idx; // Skip 'WHEN' - $new_value = Expression::parse($parser, $list); - $state = 2; - $ret->compare_values[] = $new_value; - } elseif ($token->type === Token::TYPE_KEYWORD - && $token->keyword === 'ELSE' - ) { - ++$list->idx; // Skip 'ELSE' - $ret->else_result = Expression::parse($parser, $list); - $state = 0; // last clause of CASE expression - } elseif ($token->type === Token::TYPE_KEYWORD - && $token->keyword === 'END' - ) { - $state = 3; // end of CASE expression - ++$list->idx; - break; - } elseif ($token->type === Token::TYPE_KEYWORD) { - $parser->error('Unexpected keyword.', $token); - break; + if ($token->type === Token::TYPE_KEYWORD) { + switch($token->keyword) { + case 'WHEN': + ++$list->idx; // Skip 'WHEN' + $new_value = Expression::parse($parser, $list); + $state = 2; + $ret->compare_values[] = $new_value; + break; + case 'ELSE': + ++$list->idx; // Skip 'ELSE' + $ret->else_result = Expression::parse($parser, $list); + $state = 0; // last clause of CASE expression + break; + case 'END': + $state = 3; // end of CASE expression + ++$list->idx; + break 2; + default: + $parser->error('Unexpected keyword.', $token); + break 2; + } } } else { if ($token->type === Token::TYPE_KEYWORD @@ -200,6 +207,64 @@ public static function parse(Parser $parser, TokensList $list, array $options = $list->tokens[$list->idx - 1] ); } else { + // Parse for alias of CASE expression + $asFound = false; + for (; $list->idx < $list->count; ++$list->idx) { + $token = $list->tokens[$list->idx]; + + // End of statement. + if ($token->type === Token::TYPE_DELIMITER) { + break; + } + + // Skipping whitespaces and comments. + if (($token->type === Token::TYPE_WHITESPACE) + || ($token->type === Token::TYPE_COMMENT) + ) { + continue; + } + + // Handle optional AS keyword before alias + if ($token->type === Token::TYPE_KEYWORD + && $token->keyword === 'AS') { + if ($asFound || !empty($ret->alias)) { + $parser->error('Potential duplicate alias of CASE expression.', $token); + break; + } + $asFound = true; + continue; + } + + if ($asFound + && $token->type === Token::TYPE_KEYWORD + && ($token->flags & Token::FLAG_KEYWORD_RESERVED || $token->flags & Token::FLAG_KEYWORD_FUNCTION)) { + $parser->error('An alias expected after AS but got ' . $token->value, $token); + $asFound = false; + break; + } + + if ($asFound + || $token->type === Token::TYPE_STRING + || ($token->type === Token::TYPE_SYMBOL && !$token->flags & Token::FLAG_SYMBOL_VARIABLE) + || $token->type === Token::TYPE_NONE + ) { + // 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; + $asFound = false; + + continue; + } + + break; + } + if ($asFound) { + $parser->error('An alias was expected after AS.', $list->tokens[$list->idx - 1]); + } + $ret->expr = self::build($ret); } @@ -240,6 +305,10 @@ public static function build($component, array $options = array()) } $ret .= 'END'; + if ($component->alias) { + $ret .= ' AS ' . Context::escape($component->alias); + } + return $ret; } } diff --git a/src/Components/Condition.php b/src/Components/Condition.php index 99ab34c7e..2be0abd49 100644 --- a/src/Components/Condition.php +++ b/src/Components/Condition.php @@ -142,7 +142,7 @@ public static function parse(Parser $parser, TokensList $list, array $options = // Conditions are delimited by logical operators. if (in_array($token->value, static::$DELIMITERS, true)) { - if (($betweenBefore) && ($token->value === 'AND')) { + if ($betweenBefore && ($token->value === 'AND')) { // The syntax of keyword `BETWEEN` is hard-coded. $betweenBefore = false; } else { @@ -170,7 +170,7 @@ public static function parse(Parser $parser, TokensList $list, array $options = if ($token->value === 'BETWEEN') { $betweenBefore = true; } - if (($brackets === 0) && (empty(static::$ALLOWED_KEYWORDS[$token->value]))) { + if (($brackets === 0) && empty(static::$ALLOWED_KEYWORDS[$token->value])) { break; } } @@ -179,7 +179,7 @@ public static function parse(Parser $parser, TokensList $list, array $options = if ($token->value === '(') { ++$brackets; } elseif ($token->value === ')') { - if ($brackets == 0) { + if ($brackets === 0) { break; } --$brackets; diff --git a/src/Components/CreateDefinition.php b/src/Components/CreateDefinition.php index f85ad0f3b..21ddae92b 100644 --- a/src/Components/CreateDefinition.php +++ b/src/Components/CreateDefinition.php @@ -259,7 +259,7 @@ public static function parse(Parser $parser, TokensList $list, array $options = } $state = 5; } elseif ($state === 5) { - if ((!empty($expr->type)) || (!empty($expr->key))) { + if (!empty($expr->type) || !empty($expr->key)) { $ret[] = $expr; } $expr = new self(); @@ -281,7 +281,7 @@ public static function parse(Parser $parser, TokensList $list, array $options = } // Last iteration was not saved. - if ((!empty($expr->type)) || (!empty($expr->key))) { + if (!empty($expr->type) || !empty($expr->key)) { $ret[] = $expr; } @@ -315,7 +315,7 @@ public static function build($component, array $options = array()) $tmp .= 'CONSTRAINT '; } - if ((isset($component->name)) && ($component->name !== '')) { + if (isset($component->name) && ($component->name !== '')) { $tmp .= Context::escape($component->name) . ' '; } diff --git a/src/Components/DataType.php b/src/Components/DataType.php index 52d8775d2..51f04fa6f 100644 --- a/src/Components/DataType.php +++ b/src/Components/DataType.php @@ -153,7 +153,7 @@ public static function parse(Parser $parser, TokensList $list, array $options = */ public static function build($component, array $options = array()) { - $name = (empty($options['lowercase'])) ? + $name = empty($options['lowercase']) ? $component->name : strtolower($component->name); $parameters = ''; diff --git a/src/Components/Expression.php b/src/Components/Expression.php index cce797f7b..5350e360c 100644 --- a/src/Components/Expression.php +++ b/src/Components/Expression.php @@ -215,8 +215,8 @@ public static function parse(Parser $parser, TokensList $list, array $options = } if ($token->type === Token::TYPE_KEYWORD) { - if (($brackets > 0) && (empty($ret->subquery)) - && (!empty(Parser::$STATEMENT_PARSERS[$token->keyword])) + if (($brackets > 0) && empty($ret->subquery) + && !empty(Parser::$STATEMENT_PARSERS[$token->keyword]) ) { // A `(` was previously found and this keyword is the // beginning of a statement, so this is a subquery. @@ -282,7 +282,7 @@ public static function parse(Parser $parser, TokensList $list, array $options = } if ($token->type === Token::TYPE_OPERATOR) { - if ((!empty($options['breakOnParentheses'])) + if (!empty($options['breakOnParentheses']) && (($token->value === '(') || ($token->value === ')')) ) { // No brackets were expected. @@ -290,7 +290,7 @@ public static function parse(Parser $parser, TokensList $list, array $options = } if ($token->value === '(') { ++$brackets; - if ((empty($ret->function)) && ($prev[1] !== null) + 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) @@ -298,23 +298,25 @@ public static function parse(Parser $parser, TokensList $list, array $options = ) { $ret->function = $prev[1]->value; } - } elseif ($token->value === ')' && $brackets == 0) { - // Not our bracket - break; } elseif ($token->value === ')') { - --$brackets; if ($brackets === 0) { - 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; + // Not our bracket + break; + } else { + --$brackets; + if ($brackets === 0) { + 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; + } + } elseif ($brackets < 0) { + // $parser->error('Unexpected closing bracket.', $token); + // $brackets = 0; break; } - } elseif ($brackets < 0) { - // $parser->error('Unexpected closing bracket.', $token); - // $brackets = 0; - break; } } elseif ($token->value === ',') { // Expressions are comma-delimited. @@ -362,7 +364,7 @@ public static function parse(Parser $parser, TokensList $list, array $options = // 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)) { + if (!empty($ret->database) || $dot) { $parser->error('Unexpected dot.', $token); } $ret->database = $ret->table; @@ -426,13 +428,13 @@ public static function build($component, array $options = array()) $ret = $component->expr; } else { $fields = array(); - if ((isset($component->database)) && ($component->database !== '')) { + if (isset($component->database) && ($component->database !== '')) { $fields[] = $component->database; } - if ((isset($component->table)) && ($component->table !== '')) { + if (isset($component->table) && ($component->table !== '')) { $fields[] = $component->table; } - if ((isset($component->column)) && ($component->column !== '')) { + if (isset($component->column) && ($component->column !== '')) { $fields[] = $component->column; } $ret = implode('.', Context::escape($fields)); diff --git a/src/Components/IndexHint.php b/src/Components/IndexHint.php new file mode 100644 index 000000000..9534d2d28 --- /dev/null +++ b/src/Components/IndexHint.php @@ -0,0 +1,193 @@ +type = $type; + $this->indexOrKey = $indexOrKey; + $this->for = $for; + $this->indexes = $indexes; + } + + /** + * @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 + * + * @return IndexHint|Component[] + */ + public static function parse(Parser $parser, TokensList $list, array $options = array()) + { + $ret = array(); + $expr = new self(); + $expr->type = isset($options['type']) ? $options['type'] : null; + /** + * The state of the parser. + * + * Below are the states of the parser. + * 0 ----------------- [ USE/IGNORE/FORCE ]-----------------> 1 + * 1 -------------------- [ INDEX/KEY ] --------------------> 2 + * 2 ----------------------- [ FOR ] -----------------------> 3 + * 2 -------------------- [ expr_list ] --------------------> 0 + * 3 -------------- [ JOIN/GROUP BY/ORDER BY ] -------------> 4 + * 4 -------------------- [ expr_list ] --------------------> 0 + * @var int + */ + $state = 0; + + // By design, the parser will parse first token after the keyword. So, the keyword + // must be analyzed too, in order to determine the type of this index hint. + if ($list->idx > 0) { + --$list->idx; + } + for (; $list->idx < $list->count; ++$list->idx) { + /** + * Token parsed at this moment. + * + * @var Token + */ + $token = $list->tokens[$list->idx]; + + // End of statement. + if ($token->type === Token::TYPE_DELIMITER) { + break; + } + // Skipping whitespaces and comments. + if (($token->type === Token::TYPE_WHITESPACE) || ($token->type === Token::TYPE_COMMENT)) { + continue; + } + + switch ($state) { + case 0: + if ($token->type === Token::TYPE_KEYWORD) { + if ($token->keyword === 'USE' || $token->keyword === 'IGNORE' || $token->keyword === 'FORCE') { + $expr->type = $token->keyword; + $state = 1; + } else { + break 2; + } + } + break; + case 1: + if ($token->type === Token::TYPE_KEYWORD) { + if ($token->keyword === 'INDEX' || $token->keyword === 'KEY') { + $expr->indexOrKey = $token->keyword; + } else { + $parser->error('Unexpected keyword.', $token); + } + $state = 2; + } else { + // we expect the token to be a keyword + $parser->error('Unexpected token.', $token); + } + break; + case 2: + if ($token->type === Token::TYPE_KEYWORD && $token->keyword === 'FOR') { + $state = 3; + } else { + $expr->indexes = ExpressionArray::parse($parser, $list); + $state = 0; + $ret[] = $expr; + $expr = new self(); + } + break; + case 3: + if ($token->type === Token::TYPE_KEYWORD) { + if ($token->keyword === 'JOIN' || $token->keyword === 'GROUP BY' || $token->keyword === 'ORDER BY') { + $expr->for = $token->keyword; + } else { + $parser->error('Unexpected keyword.', $token); + } + $state = 4; + } else { + // we expect the token to be a keyword + $parser->error('Unexpected token.', $token); + } + break; + case 4: + $expr->indexes = ExpressionArray::parse($parser, $list); + $state = 0; + $ret[] = $expr; + $expr = new self(); + break; + } + } + --$list->idx; + + return $ret; + } + + /** + * @param ArrayObj|ArrayObj[] $component the component to be built + * @param array $options parameters for building + * + * @return string + */ + public static function build($component, array $options = array()) + { + if (is_array($component)) { + return implode(' ', $component); + } + + $ret = $component->type . ' ' . $component->indexOrKey . ' '; + if ($component->for !== null) { + $ret .= 'FOR ' . $component->for . ' '; + } + return $ret . ExpressionArray::build($component->indexes); + } +} diff --git a/src/Components/IntoKeyword.php b/src/Components/IntoKeyword.php index 17615f6cb..c0fa390cf 100644 --- a/src/Components/IntoKeyword.php +++ b/src/Components/IntoKeyword.php @@ -207,10 +207,10 @@ public static function parse(Parser $parser, TokensList $list, array $options = $ret->dest = $token->value; $state = 3; - } elseif ($state == 3) { + } elseif ($state === 3) { $ret->parseFileOptions($parser, $list, $token->value); $state = 4; - } elseif ($state == 4) { + } elseif ($state === 4) { if ($token->type === Token::TYPE_KEYWORD && $token->keyword !== 'LINES') { break; } @@ -237,11 +237,7 @@ public function parseFileOptions(Parser $parser, TokensList $list, $keyword = 'F static::$FIELDS_OPTIONS ); - if ($keyword === 'FIELDS') { - $this->fields_keyword = true; - } else { - $this->fields_keyword = false; - } + $this->fields_keyword = ($keyword === 'FIELDS'); } else { // parse line options $this->lines_options = OptionsArray::parse( @@ -272,7 +268,7 @@ public static function build($component, array $options = array()) $fields_options_str = OptionsArray::build($component->fields_options); if (trim($fields_options_str) !== '') { - $ret .= ($component->fields_keyword) ? ' FIELDS' : ' COLUMNS'; + $ret .= $component->fields_keyword ? ' FIELDS' : ' COLUMNS'; $ret .= ' ' . $fields_options_str; } diff --git a/src/Components/JoinKeyword.php b/src/Components/JoinKeyword.php index 55b69ae06..786092dd9 100644 --- a/src/Components/JoinKeyword.php +++ b/src/Components/JoinKeyword.php @@ -151,7 +151,7 @@ public static function parse(Parser $parser, TokensList $list, array $options = if ($state === 0) { if (($token->type === Token::TYPE_KEYWORD) - && (!empty(static::$JOINS[$token->keyword])) + && !empty(static::$JOINS[$token->keyword]) ) { $expr->type = static::$JOINS[$token->keyword]; $state = 1; @@ -163,22 +163,25 @@ public static function parse(Parser $parser, TokensList $list, array $options = $state = 2; } elseif ($state === 2) { if ($token->type === Token::TYPE_KEYWORD) { - if ($token->keyword === 'ON') { - $state = 3; - } elseif ($token->keyword === 'USING') { - $state = 4; - } else { - if (($token->type === Token::TYPE_KEYWORD) - && (!empty(static::$JOINS[$token->keyword])) - ) { - $ret[] = $expr; - $expr = new self(); - $expr->type = static::$JOINS[$token->keyword]; - $state = 1; - } else { - /* Next clause is starting */ - break; - } + switch($token->keyword) { + case 'ON': + $state = 3; + break; + case 'USING': + $state = 4; + break; + default: + if (!empty(static::$JOINS[$token->keyword]) + ) { + $ret[] = $expr; + $expr = new self(); + $expr->type = static::$JOINS[$token->keyword]; + $state = 1; + } else { + /* Next clause is starting */ + break 2; + } + break; } } } elseif ($state === 3) { diff --git a/src/Components/LockExpression.php b/src/Components/LockExpression.php new file mode 100644 index 000000000..644e3ca92 --- /dev/null +++ b/src/Components/LockExpression.php @@ -0,0 +1,203 @@ + 1 + * 1 ---------------- [ lock_type ] ----------------> 2 + * 2 -------------------- [ , ] --------------------> break + * + * @var int + */ + $state = 0; + + $prevToken = null; + + for (; $list->idx < $list->count; ++$list->idx) { + /** + * Token parsed at this moment. + * + * @var Token + */ + $token = $list->tokens[$list->idx]; + + // End of statement. + if ($token->type === Token::TYPE_DELIMITER + || ($token->type === Token::TYPE_OPERATOR + && $token->value === ',') + ) { + break; + } + + if ($state === 0) { + $ret->table = Expression::parse($parser, $list, array('parseField' => 'table')); + $state = 1; + } elseif ($state === 1) { + // parse lock type + $ret->type = self::parseLockType($parser, $list); + $state = 2; + } + $prevToken = $token; + } + + // 2 is the only valid end state + if ($state !== 2) { + $parser->error('Unexpected end of LOCK expression.', $prevToken); + } + + --$list->idx; + + return $ret; + } + + /** + * @param LockExpression|LockExpression[] $component the component to be built + * @param array $options parameters for building + * + * @return string + */ + public static function build($component, array $options = array()) + { + if (is_array($component)) { + return implode(', ', $component); + } + + return $component->table . ' ' . $component->type; + } + + private static function parseLockType(Parser $parser, TokensList $list) { + $lockType = ''; + + /** + * The state of the parser while parsing for lock type. + * + * Below are the states of the parser. + * + * 0 ---------------- [ READ ] -----------------> 1 + * 0 ------------- [ LOW_PRIORITY ] ------------> 2 + * 0 ---------------- [ WRITE ] ----------------> 3 + * 1 ---------------- [ LOCAL ] ----------------> 3 + * 2 ---------------- [ WRITE ] ----------------> 3 + * + * @var int + */ + $state = 0; + + $prevToken = null; + + for (; $list->idx < $list->count; ++$list->idx) { + /** + * Token parsed at this moment. + * + * @var Token + */ + $token = $list->tokens[$list->idx]; + + // End of statement. + if ($token->type === Token::TYPE_DELIMITER + || ($token->type === Token::TYPE_OPERATOR + && $token->value === ',') + ) { + --$list->idx; + break; + } + + // Skipping whitespaces and comments. + if ($token->type === Token::TYPE_WHITESPACE || $token->type === Token::TYPE_COMMENT) { + continue; + } + + // We only expect keywords + if ($token->type !== Token::TYPE_KEYWORD) { + $parser->error('Unexpected token.', $token); + break; + } + + if ($state === 0) { + if ($token->keyword === 'READ') { + $state = 1; + } elseif ($token->keyword === 'LOW_PRIORITY') { + $state = 2; + } elseif ($token->keyword === 'WRITE') { + $state = 3; + } else { + $parser->error('Unexpected keyword.', $token); + break; + } + $lockType .= $token->keyword; + } elseif ($state === 1) { + if ($token->keyword === 'LOCAL') { + $lockType .= ' ' . $token->keyword; + $state = 3; + } else { + $parser->error('Unexpected keyword.', $token); + break; + } + } elseif ($state === 2) { + if ($token->keyword === 'WRITE') { + $lockType .= ' ' . $token->keyword; + $state = 3; // parsing over + } else { + $parser->error('Unexpected keyword.', $token); + break; + } + } + + $prevToken = $token; + } + + // Only two possible end states + if ($state !== 1 && $state !== 3) { + $parser->error('Unexpected end of Lock expression.', $prevToken); + } + + return $lockType; + } +} diff --git a/src/Components/OptionsArray.php b/src/Components/OptionsArray.php index 871772b5e..fd02d222c 100644 --- a/src/Components/OptionsArray.php +++ b/src/Components/OptionsArray.php @@ -247,10 +247,10 @@ public static function parse(Parser $parser, TokensList $list, array $options = */ if ($state === 1 && $lastOption - && ($lastOption[1] == 'expr' - || $lastOption[1] == 'var' - || $lastOption[1] == 'var=' - || $lastOption[1] == 'expr=') + && ($lastOption[1] === 'expr' + || $lastOption[1] === 'var' + || $lastOption[1] === 'var=' + || $lastOption[1] === 'expr=') ) { $parser->error( sprintf( diff --git a/src/Components/ParameterDefinition.php b/src/Components/ParameterDefinition.php index 82a3567cc..1f810f5aa 100644 --- a/src/Components/ParameterDefinition.php +++ b/src/Components/ParameterDefinition.php @@ -138,7 +138,7 @@ public static function parse(Parser $parser, TokensList $list, array $options = } // Last iteration was not saved. - if ((isset($expr->name)) && ($expr->name !== '')) { + if (isset($expr->name) && ($expr->name !== '')) { $ret[] = $expr; } diff --git a/src/Components/RenameOperation.php b/src/Components/RenameOperation.php index 2e3d6ef9a..e9bd9ce96 100644 --- a/src/Components/RenameOperation.php +++ b/src/Components/RenameOperation.php @@ -68,7 +68,7 @@ public static function parse(Parser $parser, TokensList $list, array $options = * * 1 ------------------------[ TO ]-----------------------> 2 * - * 2 ---------------------[ old name ]--------------------> 3 + * 2 ---------------------[ new name ]--------------------> 3 * * 3 ------------------------[ , ]------------------------> 0 * 3 -----------------------[ else ]----------------------> (END) diff --git a/src/Components/SetOperation.php b/src/Components/SetOperation.php index 83f2e552b..2945a8e41 100644 --- a/src/Components/SetOperation.php +++ b/src/Components/SetOperation.php @@ -64,15 +64,22 @@ public static function parse(Parser $parser, TokensList $list, array $options = * * Below are the states of the parser. * - * 0 -------------------[ column name ]-------------------> 1 - * + * 0 ---------------------[ col_name ]--------------------> 0 + * 0 ------------------------[ = ]------------------------> 1 + * 1 -----------------------[ value ]---------------------> 1 * 1 ------------------------[ , ]------------------------> 0 - * 1 ----------------------[ value ]----------------------> 1 * * @var int */ $state = 0; + /** + * Token when the parser has seen the latest comma + * + * @var Token + */ + $commaLastSeenAt = null; + for (; $list->idx < $list->count; ++$list->idx) { /** * Token parsed at this moment. @@ -94,7 +101,7 @@ public static function parse(Parser $parser, TokensList $list, array $options = // No keyword is expected. if (($token->type === Token::TYPE_KEYWORD) && ($token->flags & Token::FLAG_KEYWORD_RESERVED) - && ($state == 0) + && ($state === 0) ) { break; } @@ -104,6 +111,8 @@ public static function parse(Parser $parser, TokensList $list, array $options = $state = 1; } elseif ($token->value !== ',') { $expr->column .= $token->token; + } elseif ($token->value === ',') { + $commaLastSeenAt = $token; } } elseif ($state === 1) { $tmp = Expression::parse( @@ -113,7 +122,7 @@ public static function parse(Parser $parser, TokensList $list, array $options = 'breakOnAlias' => true, ) ); - if ($tmp == null) { + if (is_null($tmp)) { $parser->error('Missing expression.', $token); break; } @@ -122,11 +131,16 @@ public static function parse(Parser $parser, TokensList $list, array $options = $ret[] = $expr; $expr = new self(); $state = 0; + $commaLastSeenAt = null; } } - --$list->idx; + // We saw a comma, but didn't see a column-value pair after it + if ($commaLastSeenAt !== null) { + $parser->error('Unexpected token.', $commaLastSeenAt); + } + return $ret; } diff --git a/src/Components/UnionKeyword.php b/src/Components/UnionKeyword.php index 4aa0f94e0..2de5126fe 100644 --- a/src/Components/UnionKeyword.php +++ b/src/Components/UnionKeyword.php @@ -26,8 +26,8 @@ class UnionKeyword extends Component public static function build($component, array $options = array()) { $tmp = array(); - foreach ($component as $component) { - $tmp[] = $component[0] . ' ' . $component[1]; + foreach ($component as $componentPart) { + $tmp[] = $componentPart[0] . ' ' . $componentPart[1]; } return implode(' ', $tmp); diff --git a/src/Context.php b/src/Context.php index 4aaa956b6..869a9bb7e 100644 --- a/src/Context.php +++ b/src/Context.php @@ -255,10 +255,8 @@ public static function isKeyword($str, $isReserved = false) $str = strtoupper($str); if (isset(static::$KEYWORDS[$str])) { - if ($isReserved) { - if (!(static::$KEYWORDS[$str] & Token::FLAG_KEYWORD_RESERVED)) { - return null; - } + if ($isReserved && !(static::$KEYWORDS[$str] & Token::FLAG_KEYWORD_RESERVED)) { + return null; } return static::$KEYWORDS[$str]; @@ -315,21 +313,21 @@ public static function isWhitespace($str) public static function isComment($str, $end = false) { $len = strlen($str); - if ($len == 0) { + if ($len === 0) { return null; } if ($str[0] === '#') { return Token::FLAG_COMMENT_BASH; } elseif (($len > 1) && ($str[0] === '/') && ($str[1] === '*')) { - return (($len > 2) && ($str[2] == '!')) ? + return (($len > 2) && ($str[2] === '!')) ? Token::FLAG_COMMENT_MYSQL_CMD : Token::FLAG_COMMENT_C; } elseif (($len > 1) && ($str[0] === '*') && ($str[1] === '/')) { return Token::FLAG_COMMENT_C; } elseif (($len > 2) && ($str[0] === '-') - && ($str[1] === '-') && (static::isWhitespace($str[2])) + && ($str[1] === '-') && static::isWhitespace($str[2]) ) { return Token::FLAG_COMMENT_SQL; - } elseif (($len == 2) && $end && ($str[0] === '-') && ($str[1] === '-')) { + } elseif (($len === 2) && $end && ($str[0] === '-') && ($str[1] === '-')) { return Token::FLAG_COMMENT_SQL; } @@ -384,7 +382,7 @@ public static function isNumber($str) */ public static function isSymbol($str) { - if (strlen($str) == 0) { + if (strlen($str) === 0) { return null; } if ($str[0] === '@') { @@ -410,7 +408,7 @@ public static function isSymbol($str) */ public static function isString($str) { - if (strlen($str) == 0) { + if (strlen($str) === 0) { return null; } if ($str[0] === '\'') { diff --git a/src/Lexer.php b/src/Lexer.php index f5972d8e4..ef1ca68d7 100644 --- a/src/Lexer.php +++ b/src/Lexer.php @@ -883,7 +883,7 @@ public function parseSymbol() if ($this->last < $this->len) { if (($str = $this->parseString('`')) === null) { - if (($str = static::parseUnknown()) === null) { + if (($str = $this->parseUnknown()) === null) { $this->error( 'Variable name was expected.', $this->str[$this->last], diff --git a/src/Parser.php b/src/Parser.php index 11196ef7e..ec8637adb 100644 --- a/src/Parser.php +++ b/src/Parser.php @@ -86,6 +86,13 @@ class Parser extends Core 'COMMIT' => 'PhpMyAdmin\\SqlParser\\Statements\\TransactionStatement', 'ROLLBACK' => 'PhpMyAdmin\\SqlParser\\Statements\\TransactionStatement', 'START TRANSACTION' => 'PhpMyAdmin\\SqlParser\\Statements\\TransactionStatement', + + 'PURGE' => 'PhpMyAdmin\\SqlParser\\Statements\\PurgeStatement', + + // Lock statements + // https://dev.mysql.com/doc/refman/5.7/en/lock-tables.html + 'LOCK' => 'PhpMyAdmin\\SqlParser\\Statements\\LockStatement', + 'UNLOCK' => 'PhpMyAdmin\\SqlParser\\Statements\\LockStatement', ); /** @@ -170,6 +177,10 @@ class Parser extends Core 'field' => 'fields', 'options' => array('parseField' => 'table'), ), + 'FORCE' => array( + 'class' => 'PhpMyAdmin\\SqlParser\\Components\\IndexHint', + 'field' => 'index_hints', + ), 'FROM' => array( 'class' => 'PhpMyAdmin\\SqlParser\\Components\\ExpressionArray', 'field' => 'from', @@ -183,6 +194,10 @@ class Parser extends Core 'class' => 'PhpMyAdmin\\SqlParser\\Components\\Condition', 'field' => 'having', ), + 'IGNORE' => array( + 'class' => 'PhpMyAdmin\\SqlParser\\Components\\IndexHint', + 'field' => 'index_hints', + ), 'INTO' => array( 'class' => 'PhpMyAdmin\\SqlParser\\Components\\IntoKeyword', 'field' => 'into', @@ -244,6 +259,10 @@ class Parser extends Core 'class' => 'PhpMyAdmin\\SqlParser\\Components\\JoinKeyword', 'field' => 'join', ), + 'STRAIGHT_JOIN' => array( + 'class' => 'PhpMyAdmin\\SqlParser\\Components\\JoinKeyword', + 'field' => 'join', + ), 'LIMIT' => array( 'class' => 'PhpMyAdmin\\SqlParser\\Components\\Limit', 'field' => 'limit', @@ -297,6 +316,10 @@ class Parser extends Core 'field' => 'tables', 'options' => array('parseField' => 'table'), ), + 'USE' => array( + 'class' => 'PhpMyAdmin\\SqlParser\\Components\\IndexHint', + 'field' => 'index_hints', + ), 'VALUE' => array( 'class' => 'PhpMyAdmin\\SqlParser\\Components\\Array2d', 'field' => 'values', @@ -340,7 +363,7 @@ class Parser extends Core */ public function __construct($list = null, $strict = false) { - if ((is_string($list)) || ($list instanceof UtfString)) { + if (is_string($list) || ($list instanceof UtfString)) { $lexer = new Lexer($list, $strict); $this->list = $lexer->list; } elseif ($list instanceof TokensList) { @@ -488,7 +511,7 @@ public function parse() $prevLastIdx = $list->idx; // Handles unions. - if ((!empty($unionType)) + if (!empty($unionType) && ($lastStatement instanceof SelectStatement) && ($statement instanceof SelectStatement) ) { diff --git a/src/Statement.php b/src/Statement.php index f7ed9ab85..6eb42c748 100644 --- a/src/Statement.php +++ b/src/Statement.php @@ -260,7 +260,7 @@ public function parse(Parser $parser, TokensList $list) // ON DUPLICATE KEY UPDATE ... // has to be parsed in parent statement (INSERT or REPLACE) // so look for it and break - if ($this instanceof \PhpMyAdmin\SqlParser\Statements\SelectStatement + if ($this instanceof Statements\SelectStatement && $token->value === 'ON' ) { ++$list->idx; // Skip ON @@ -303,8 +303,8 @@ public function parse(Parser $parser, TokensList $list) $options = array(); // Looking for duplicated clauses. - if ((!empty(Parser::$KEYWORD_PARSERS[$token->value])) - || (!empty(Parser::$STATEMENT_PARSERS[$token->value])) + if (!empty(Parser::$KEYWORD_PARSERS[$token->value]) + || !empty(Parser::$STATEMENT_PARSERS[$token->value]) ) { if (!empty($parsedClauses[$token->value])) { $parser->error( @@ -327,8 +327,8 @@ public function parse(Parser $parser, TokensList $list) // Checking if this is the beginning of the statement. if (!empty(Parser::$STATEMENT_PARSERS[$token->keyword])) { - if ((!empty(static::$CLAUSES)) // Undefined for some statements. - && (empty(static::$CLAUSES[$token->value])) + if (!empty(static::$CLAUSES) // Undefined for some statements. + && empty(static::$CLAUSES[$token->value]) ) { // Some keywords (e.g. `SET`) may be the beginning of a // statement and a clause. @@ -354,12 +354,23 @@ public function parse(Parser $parser, TokensList $list) $parsedOptions = true; } } elseif ($class === null) { - // Handle special end options in Select statement - // See Statements\SelectStatement::$END_OPTIONS - if ($this instanceof \PhpMyAdmin\SqlParser\Statements\SelectStatement + if ($this instanceof Statements\SelectStatement && ($token->value === 'FOR UPDATE' || $token->value === 'LOCK IN SHARE MODE') ) { + // Handle special end options in Select statement + // See Statements\SelectStatement::$END_OPTIONS + $this->end_options = OptionsArray::parse( + $parser, + $list, + static::$END_OPTIONS + ); + } elseif ($this instanceof Statements\SetStatement + && ($token->value === 'COLLATE' + || $token->value === 'DEFAULT') + ) { + // Handle special end options in SET statement + // See Statements\SetStatement::$END_OPTIONS $this->end_options = OptionsArray::parse( $parser, $list, @@ -451,9 +462,7 @@ public function validateClauseOrder($parser, $list) { $clauses = array_flip(array_keys($this->getClauses())); - if (empty($clauses) - || count($clauses) == 0 - ) { + if (empty($clauses) || count($clauses) === 0) { return true; } @@ -488,8 +497,19 @@ public function validateClauseOrder($parser, $list) $clauseType ); + if ($clauseStartIdx !== -1 + && $this instanceof Statements\SelectStatement + && ($clauseType === 'FORCE' + || $clauseType === 'IGNORE' + || $clauseType === 'USE') + ) { + // TODO: ordering of clauses in a SELECT statement with + // Index hints is not supported + return true; + } + // Handle ordering of Multiple Joins in a query - if ($clauseStartIdx != -1) { + if ($clauseStartIdx !== -1) { if ($minJoin === 0 && stripos($clauseType, 'JOIN')) { // First JOIN clause is detected $minJoin = $maxJoin = $clauseStartIdx; @@ -501,7 +521,7 @@ public function validateClauseOrder($parser, $list) } } - if ($clauseStartIdx != -1 && $clauseStartIdx < $minIdx) { + if ($clauseStartIdx !== -1 && $clauseStartIdx < $minIdx) { if ($minJoin === 0 || $error === 1) { $token = $list->tokens[$clauseStartIdx]; $parser->error( @@ -512,7 +532,7 @@ public function validateClauseOrder($parser, $list) return false; } $minIdx = $clauseStartIdx; - } elseif ($clauseStartIdx != -1) { + } elseif ($clauseStartIdx !== -1) { $minIdx = $clauseStartIdx; } diff --git a/src/Statements/CreateStatement.php b/src/Statements/CreateStatement.php index ee7bd00e9..65cdbbb26 100644 --- a/src/Statements/CreateStatement.php +++ b/src/Statements/CreateStatement.php @@ -37,7 +37,7 @@ class CreateStatement extends Statement 'TEMPORARY' => 1, // CREATE VIEW - 'OR REPLACE' => array(2, 'var='), + 'OR REPLACE' => 2, 'ALGORITHM' => array(3, 'var='), // `DEFINER` is also used for `CREATE FUNCTION / PROCEDURE` 'DEFINER' => array(4, 'expr='), @@ -279,41 +279,43 @@ public function build() . OptionsArray::build($this->options) . ' ' . Expression::build($this->name) . ' ' . OptionsArray::build($this->entityOptions); - } elseif ($this->options->has('TABLE') && !is_null($this->select)) { - return 'CREATE ' - . OptionsArray::build($this->options) . ' ' - . Expression::build($this->name) . ' ' - . $this->select->build(); - } elseif ($this->options->has('TABLE') && !is_null($this->like)) { - return 'CREATE ' - . OptionsArray::build($this->options) . ' ' - . Expression::build($this->name) . ' LIKE ' - . Expression::build($this->like); } elseif ($this->options->has('TABLE')) { - $partition = ''; + if (!is_null($this->select)) { + return 'CREATE ' + . OptionsArray::build($this->options) . ' ' + . Expression::build($this->name) . ' ' + . $this->select->build(); + } elseif (!is_null($this->like)) { + return 'CREATE ' + . OptionsArray::build($this->options) . ' ' + . Expression::build($this->name) . ' LIKE ' + . Expression::build($this->like); + } else { + $partition = ''; + + if (!empty($this->partitionBy)) { + $partition .= "\nPARTITION BY " . $this->partitionBy; + } + if (!empty($this->partitionsNum)) { + $partition .= "\nPARTITIONS " . $this->partitionsNum; + } + if (!empty($this->subpartitionBy)) { + $partition .= "\nSUBPARTITION BY " . $this->subpartitionBy; + } + if (!empty($this->subpartitionsNum)) { + $partition .= "\nSUBPARTITIONS " . $this->subpartitionsNum; + } + if (!empty($this->partitions)) { + $partition .= "\n" . PartitionDefinition::build($this->partitions); + } - if (!empty($this->partitionBy)) { - $partition .= "\nPARTITION BY " . $this->partitionBy; - } - if (!empty($this->partitionsNum)) { - $partition .= "\nPARTITIONS " . $this->partitionsNum; - } - if (!empty($this->subpartitionBy)) { - $partition .= "\nSUBPARTITION BY " . $this->subpartitionBy; + return 'CREATE ' + . OptionsArray::build($this->options) . ' ' + . Expression::build($this->name) . ' ' + . $fields + . OptionsArray::build($this->entityOptions) + . $partition; } - if (!empty($this->subpartitionsNum)) { - $partition .= "\nSUBPARTITIONS " . $this->subpartitionsNum; - } - if (!empty($this->partitions)) { - $partition .= "\n" . PartitionDefinition::build($this->partitions); - } - - return 'CREATE ' - . OptionsArray::build($this->options) . ' ' - . Expression::build($this->name) . ' ' - . $fields - . OptionsArray::build($this->entityOptions) - . $partition; } elseif ($this->options->has('VIEW')) { return 'CREATE ' . OptionsArray::build($this->options) . ' ' @@ -327,8 +329,8 @@ public function build() . OptionsArray::build($this->entityOptions) . ' ' . 'ON ' . Expression::build($this->table) . ' ' . 'FOR EACH ROW ' . TokensList::build($this->body); - } elseif (($this->options->has('PROCEDURE')) - || ($this->options->has('FUNCTION')) + } elseif ($this->options->has('PROCEDURE') + || $this->options->has('FUNCTION') ) { $tmp = ''; if ($this->options->has('FUNCTION')) { @@ -370,7 +372,7 @@ public function parse(Parser $parser, TokensList $list) ) ); - if ((!isset($this->name)) || ($this->name === '')) { + if (!isset($this->name) || ($this->name === '')) { $parser->error( 'The name of the entity was expected.', $list->tokens[$list->idx] @@ -386,7 +388,7 @@ public function parse(Parser $parser, TokensList $list) */ $token = $list->tokens[$list->idx]; $nextidx = $list->idx + 1; - while ($nextidx < $list->count && $list->tokens[$nextidx]->type == Token::TYPE_WHITESPACE) { + while ($nextidx < $list->count && $list->tokens[$nextidx]->type === Token::TYPE_WHITESPACE) { ++$nextidx; } @@ -396,150 +398,148 @@ public function parse(Parser $parser, TokensList $list) $list, static::$DB_OPTIONS ); - } elseif ($this->options->has('TABLE') - && ($token->type == Token::TYPE_KEYWORD) - && ($token->keyword == 'SELECT') - ) { - /* CREATE TABLE ... SELECT */ - $this->select = new SelectStatement($parser, $list); - } elseif ($this->options->has('TABLE') - && ($token->type == Token::TYPE_KEYWORD) && ($token->keyword == 'AS') - && ($list->tokens[$nextidx]->type == Token::TYPE_KEYWORD) - && ($list->tokens[$nextidx]->value == 'SELECT') - ) { - /* CREATE TABLE ... AS SELECT */ - $list->idx = $nextidx; - $this->select = new SelectStatement($parser, $list); - } elseif ($this->options->has('TABLE') - && $token->type == Token::TYPE_KEYWORD - && $token->keyword == 'LIKE' - ) { - /* CREATE TABLE `new_tbl` LIKE 'orig_tbl' */ - $list->idx = $nextidx; - $this->like = Expression::parse( - $parser, - $list, - array( - 'parseField' => 'table', - 'breakOnAlias' => true, - ) - ); - // The 'LIKE' keyword was found, but no table_name was found next to it - if ($this->like == null) { - $parser->error( - 'A table name was expected.', - $list->tokens[$list->idx] - ); - } } elseif ($this->options->has('TABLE')) { - $this->fields = CreateDefinition::parse($parser, $list); - if (empty($this->fields)) { - $parser->error( - 'At least one column definition was expected.', - $list->tokens[$list->idx] + if (($token->type === Token::TYPE_KEYWORD) + && ($token->keyword === 'SELECT')) { + /* CREATE TABLE ... SELECT */ + $this->select = new SelectStatement($parser, $list); + } elseif (($token->type === Token::TYPE_KEYWORD) && ($token->keyword === 'AS') + && ($list->tokens[$nextidx]->type === Token::TYPE_KEYWORD) + && ($list->tokens[$nextidx]->value === 'SELECT')) { + /* CREATE TABLE ... AS SELECT */ + $list->idx = $nextidx; + $this->select = new SelectStatement($parser, $list); + } elseif ($token->type === Token::TYPE_KEYWORD + && $token->keyword === 'LIKE') { + /* CREATE TABLE `new_tbl` LIKE 'orig_tbl' */ + $list->idx = $nextidx; + $this->like = Expression::parse( + $parser, + $list, + array( + 'parseField' => 'table', + 'breakOnAlias' => true, + ) ); - } - ++$list->idx; + // The 'LIKE' keyword was found, but no table_name was found next to it + if (is_null($this->like)) { + $parser->error( + 'A table name was expected.', + $list->tokens[$list->idx] + ); + } + } else { + $this->fields = CreateDefinition::parse($parser, $list); + if (empty($this->fields)) { + $parser->error( + 'At least one column definition was expected.', + $list->tokens[$list->idx] + ); + } + ++$list->idx; - $this->entityOptions = OptionsArray::parse( - $parser, - $list, - static::$TABLE_OPTIONS - ); + $this->entityOptions = OptionsArray::parse( + $parser, + $list, + static::$TABLE_OPTIONS + ); - /** - * The field that is being filled (`partitionBy` or - * `subpartitionBy`). - * - * @var string - */ - $field = null; - - /** - * The number of brackets. `false` means no bracket was found - * previously. At least one bracket is required to validate the - * expression. - * - * @var int|bool - */ - $brackets = false; - - /* - * Handles partitions. - */ - for (; $list->idx < $list->count; ++$list->idx) { /** - * Token parsed at this moment. + * The field that is being filled (`partitionBy` or + * `subpartitionBy`). * - * @var Token + * @var string */ - $token = $list->tokens[$list->idx]; + $field = null; - // End of statement. - if ($token->type === Token::TYPE_DELIMITER) { - break; - } - - // Skipping comments. - if ($token->type === Token::TYPE_COMMENT) { - continue; - } + /** + * The number of brackets. `false` means no bracket was found + * previously. At least one bracket is required to validate the + * expression. + * + * @var int|bool + */ + $brackets = false; - if (($token->type === Token::TYPE_KEYWORD) && ($token->keyword === 'PARTITION BY')) { - $field = 'partitionBy'; - $brackets = false; - } elseif (($token->type === Token::TYPE_KEYWORD) && ($token->keyword === 'SUBPARTITION BY')) { - $field = 'subpartitionBy'; - $brackets = false; - } elseif (($token->type === Token::TYPE_KEYWORD) && ($token->keyword === 'PARTITIONS')) { - $token = $list->getNextOfType(Token::TYPE_NUMBER); - --$list->idx; // `getNextOfType` also advances one position. - $this->partitionsNum = $token->value; - } elseif (($token->type === Token::TYPE_KEYWORD) && ($token->keyword === 'SUBPARTITIONS')) { - $token = $list->getNextOfType(Token::TYPE_NUMBER); - --$list->idx; // `getNextOfType` also advances one position. - $this->subpartitionsNum = $token->value; - } elseif (!empty($field)) { - /* - * Handling the content of `PARTITION BY` and `SUBPARTITION BY`. + /* + * Handles partitions. + */ + for (; $list->idx < $list->count; ++$list->idx) { + /** + * Token parsed at this moment. + * + * @var Token */ + $token = $list->tokens[$list->idx]; - // Counting brackets. - if (($token->type === Token::TYPE_OPERATOR) && ($token->value === '(')) { - // This is used instead of `++$brackets` because, - // initially, `$brackets` is `false` cannot be - // incremented. - $brackets = $brackets + 1; - } elseif (($token->type === Token::TYPE_OPERATOR) && ($token->value === ')')) { - --$brackets; + // End of statement. + if ($token->type === Token::TYPE_DELIMITER) { + break; } - // Building the expression used for partitioning. - $this->$field .= ($token->type === Token::TYPE_WHITESPACE) ? ' ' : $token->token; - - // Last bracket was read, the expression ended. - // Comparing with `0` and not `false`, because `false` means - // that no bracket was found and at least one must is - // required. - if ($brackets === 0) { - $this->$field = trim($this->$field); - $field = null; + // Skipping comments. + if ($token->type === Token::TYPE_COMMENT) { + continue; } - } elseif (($token->type === Token::TYPE_OPERATOR) && ($token->value === '(')) { - if (!empty($this->partitionBy)) { - $this->partitions = ArrayObj::parse( - $parser, - $list, - array( - 'type' => 'PhpMyAdmin\\SqlParser\\Components\\PartitionDefinition', - ) - ); + + if (($token->type === Token::TYPE_KEYWORD) && ($token->keyword === 'PARTITION BY')) { + $field = 'partitionBy'; + $brackets = false; + } elseif (($token->type === Token::TYPE_KEYWORD) && ($token->keyword === 'SUBPARTITION BY')) { + $field = 'subpartitionBy'; + $brackets = false; + } elseif (($token->type === Token::TYPE_KEYWORD) && ($token->keyword === 'PARTITIONS')) { + $token = $list->getNextOfType(Token::TYPE_NUMBER); + --$list->idx; // `getNextOfType` also advances one position. + $this->partitionsNum = $token->value; + } elseif (($token->type === Token::TYPE_KEYWORD) && ($token->keyword === 'SUBPARTITIONS')) { + $token = $list->getNextOfType(Token::TYPE_NUMBER); + --$list->idx; // `getNextOfType` also advances one position. + $this->subpartitionsNum = $token->value; + } elseif (!empty($field)) { + /* + * Handling the content of `PARTITION BY` and `SUBPARTITION BY`. + */ + + // Counting brackets. + if ($token->type === Token::TYPE_OPERATOR) { + if ($token->value === '(') { + // This is used instead of `++$brackets` because, + // initially, `$brackets` is `false` cannot be + // incremented. + $brackets = $brackets + 1; + } elseif ($token->value === ')') { + --$brackets; + } + } + + // Building the expression used for partitioning. + $this->$field .= ($token->type === Token::TYPE_WHITESPACE) ? ' ' : $token->token; + + // Last bracket was read, the expression ended. + // Comparing with `0` and not `false`, because `false` means + // that no bracket was found and at least one must is + // required. + if ($brackets === 0) { + $this->$field = trim($this->$field); + $field = null; + } + } elseif (($token->type === Token::TYPE_OPERATOR) && ($token->value === '(')) { + if (!empty($this->partitionBy)) { + $this->partitions = ArrayObj::parse( + $parser, + $list, + array( + 'type' => 'PhpMyAdmin\\SqlParser\\Components\\PartitionDefinition', + ) + ); + } + break; } - break; } } - } elseif (($this->options->has('PROCEDURE')) - || ($this->options->has('FUNCTION')) + } elseif ($this->options->has('PROCEDURE') + || $this->options->has('FUNCTION') ) { $this->parameters = ParameterDefinition::parse($parser, $list); if ($this->options->has('FUNCTION')) { diff --git a/src/Statements/DeleteStatement.php b/src/Statements/DeleteStatement.php index bf47cd871..7ff00254e 100644 --- a/src/Statements/DeleteStatement.php +++ b/src/Statements/DeleteStatement.php @@ -142,25 +142,25 @@ public function build() { $ret = 'DELETE ' . OptionsArray::build($this->options); - if ($this->columns != null && count($this->columns) > 0) { + if (!is_null($this->columns) && count($this->columns) > 0) { $ret .= ' ' . ExpressionArray::build($this->columns); } - if ($this->from != null && count($this->from) > 0) { + if (!is_null($this->from) && count($this->from) > 0) { $ret .= ' FROM ' . ExpressionArray::build($this->from); } - if ($this->join != null && count($this->join) > 0) { + if (!is_null($this->join) && count($this->join) > 0) { $ret .= ' ' . JoinKeyword::build($this->join); } - if ($this->using != null && count($this->using) > 0) { + if (!is_null($this->using) && count($this->using) > 0) { $ret .= ' USING ' . ExpressionArray::build($this->using); } - if ($this->where != null && count($this->where) > 0) { + if (!is_null($this->where) && count($this->where) > 0) { $ret .= ' WHERE ' . Condition::build($this->where); } - if ($this->order != null && count($this->order) > 0) { + if (!is_null($this->order) && count($this->order) > 0) { $ret .= ' ORDER BY ' . ExpressionArray::build($this->order); } - if ($this->limit != null && strlen($this->limit) > 0) { + if (!is_null($this->limit) && strlen($this->limit) > 0) { $ret .= ' LIMIT ' . Limit::build($this->limit); } @@ -221,87 +221,83 @@ public function parse(Parser $parser, TokensList $list) } if ($state === 0) { - if ($token->type === Token::TYPE_KEYWORD - && $token->keyword !== 'FROM' - ) { - $parser->error('Unexpected keyword.', $token); - break; - } elseif ($token->type === Token::TYPE_KEYWORD - && $token->keyword === 'FROM' - ) { - ++$list->idx; // Skip 'FROM' - $this->from = ExpressionArray::parse($parser, $list); + if ($token->type === Token::TYPE_KEYWORD) { + if ($token->keyword !== 'FROM') { + $parser->error('Unexpected keyword.', $token); + break; + } else { + ++$list->idx; // Skip 'FROM' + $this->from = ExpressionArray::parse($parser, $list); - $state = 2; + $state = 2; + } } else { $this->columns = ExpressionArray::parse($parser, $list); $state = 1; } } elseif ($state === 1) { - if ($token->type === Token::TYPE_KEYWORD - && $token->keyword !== 'FROM' - ) { - $parser->error('Unexpected keyword.', $token); - break; - } elseif ($token->type === Token::TYPE_KEYWORD - && $token->keyword === 'FROM' - ) { - ++$list->idx; // Skip 'FROM' - $this->from = ExpressionArray::parse($parser, $list); + if ($token->type === Token::TYPE_KEYWORD) { + if ($token->keyword !== 'FROM') { + $parser->error('Unexpected keyword.', $token); + break; + } else { + ++$list->idx; // Skip 'FROM' + $this->from = ExpressionArray::parse($parser, $list); - $state = 2; + $state = 2; + } } else { $parser->error('Unexpected token.', $token); break; } } elseif ($state === 2) { - if ($token->type === Token::TYPE_KEYWORD - && stripos($token->keyword, 'JOIN') !== false - ) { - ++$list->idx; - $this->join = JoinKeyword::parse($parser, $list); + if ($token->type === Token::TYPE_KEYWORD) { + if (stripos($token->keyword, 'JOIN') !== false) { + ++$list->idx; + $this->join = JoinKeyword::parse($parser, $list); - // remain in state = 2 - } elseif ($token->type === Token::TYPE_KEYWORD - && $token->keyword === 'USING' - ) { - ++$list->idx; // Skip 'USING' - $this->using = ExpressionArray::parse($parser, $list); - $state = 3; + // remain in state = 2 + } + else { + switch($token->keyword) { + case 'USING': + ++$list->idx; // Skip 'USING' + $this->using = ExpressionArray::parse($parser, $list); + $state = 3; - $multiTable = true; - } elseif ($token->type === Token::TYPE_KEYWORD - && $token->keyword === 'WHERE' - ) { - ++$list->idx; // Skip 'WHERE' - $this->where = Condition::parse($parser, $list); - $state = 4; - } elseif ($token->type === Token::TYPE_KEYWORD - && $token->keyword === 'ORDER BY' - ) { - ++$list->idx; // Skip 'ORDER BY' - $this->order = OrderKeyword::parse($parser, $list); - $state = 5; - } elseif ($token->type === Token::TYPE_KEYWORD - && $token->keyword === 'LIMIT' - ) { - ++$list->idx; // Skip 'LIMIT' - $this->limit = Limit::parse($parser, $list); - $state = 6; - } elseif ($token->type === Token::TYPE_KEYWORD) { - $parser->error('Unexpected keyword.', $token); - break; + $multiTable = true; + break; + case 'WHERE': + ++$list->idx; // Skip 'WHERE' + $this->where = Condition::parse($parser, $list); + $state = 4; + break; + case 'ORDER BY': + ++$list->idx; // Skip 'ORDER BY' + $this->order = OrderKeyword::parse($parser, $list); + $state = 5; + break; + case 'LIMIT': + ++$list->idx; // Skip 'LIMIT' + $this->limit = Limit::parse($parser, $list); + $state = 6; + break; + default: + $parser->error('Unexpected keyword.', $token); + break 2; + } + } } } elseif ($state === 3) { - if ($token->type === Token::TYPE_KEYWORD - && $token->keyword === 'WHERE' - ) { - ++$list->idx; // Skip 'WHERE' - $this->where = Condition::parse($parser, $list); - $state = 4; - } elseif ($token->type === Token::TYPE_KEYWORD) { - $parser->error('Unexpected keyword.', $token); - break; + if ($token->type === Token::TYPE_KEYWORD) { + if ($token->keyword === 'WHERE') { + ++$list->idx; // Skip 'WHERE' + $this->where = Condition::parse($parser, $list); + $state = 4; + } else { + $parser->error('Unexpected keyword.', $token); + break; + } } else { $parser->error('Unexpected token.', $token); break; @@ -317,32 +313,33 @@ public function parse(Parser $parser, TokensList $list) break; } - if ($token->type === Token::TYPE_KEYWORD - && $token->keyword === 'ORDER BY' - ) { - ++$list->idx; // Skip 'ORDER BY' - $this->order = OrderKeyword::parse($parser, $list); - $state = 5; - } elseif ($token->type === Token::TYPE_KEYWORD - && $token->keyword === 'LIMIT' - ) { - ++$list->idx; // Skip 'LIMIT' - $this->limit = Limit::parse($parser, $list); - $state = 6; - } elseif ($token->type === Token::TYPE_KEYWORD) { - $parser->error('Unexpected keyword.', $token); - break; + if ($token->type === Token::TYPE_KEYWORD) { + switch($token->keyword) { + case 'ORDER BY': + ++$list->idx; // Skip 'ORDER BY' + $this->order = OrderKeyword::parse($parser, $list); + $state = 5; + break; + case 'LIMIT': + ++$list->idx; // Skip 'LIMIT' + $this->limit = Limit::parse($parser, $list); + $state = 6; + break; + default: + $parser->error('Unexpected keyword.', $token); + break 2; + } } } elseif ($state === 5) { - if ($token->type === Token::TYPE_KEYWORD - && $token->keyword === 'LIMIT' - ) { - ++$list->idx; // Skip 'LIMIT' - $this->limit = Limit::parse($parser, $list); - $state = 6; - } elseif ($token->type === Token::TYPE_KEYWORD) { - $parser->error('Unexpected keyword.', $token); - break; + if ($token->type === Token::TYPE_KEYWORD) { + if ($token->keyword === 'LIMIT') { + ++$list->idx; // Skip 'LIMIT' + $this->limit = Limit::parse($parser, $list); + $state = 6; + } else { + $parser->error('Unexpected keyword.', $token); + break; + } } } } diff --git a/src/Statements/InsertStatement.php b/src/Statements/InsertStatement.php index 1bdf73b47..312b4e049 100644 --- a/src/Statements/InsertStatement.php +++ b/src/Statements/InsertStatement.php @@ -113,15 +113,15 @@ public function build() $ret = 'INSERT ' . $this->options . ' INTO ' . $this->into; - if ($this->values != null && count($this->values) > 0) { + if (!is_null($this->values) && count($this->values) > 0) { $ret .= ' VALUES ' . Array2d::build($this->values); - } elseif ($this->set != null && count($this->set) > 0) { + } elseif (!is_null($this->set) && count($this->set) > 0) { $ret .= ' SET ' . SetOperation::build($this->set); - } elseif ($this->select != null && strlen($this->select) > 0) { + } elseif (!is_null($this->select) && strlen($this->select) > 0) { $ret .= ' ' . $this->select->build(); } - if ($this->onDuplicateSet != null && count($this->onDuplicateSet) > 0) { + if (!is_null($this->onDuplicateSet) && count($this->onDuplicateSet) > 0) { $ret .= ' ON DUPLICATE KEY UPDATE ' . SetOperation::build($this->onDuplicateSet); } @@ -229,7 +229,7 @@ public function parse(Parser $parser, TokensList $list) ); break; } - } elseif ($state == 2) { + } elseif ($state === 2) { $lastCount = $miniState; if ($miniState === 1 && $token->keyword === 'ON') { diff --git a/src/Statements/LoadStatement.php b/src/Statements/LoadStatement.php index 13b68e7cc..45ad05fb0 100644 --- a/src/Statements/LoadStatement.php +++ b/src/Statements/LoadStatement.php @@ -270,15 +270,13 @@ public function parse(Parser $parser, TokensList $list) ); $state = 1; } elseif ($state === 1) { - if (($token->type === Token::TYPE_KEYWORD) - && ($token->keyword === 'REPLACE' - || $token->keyword === 'IGNORE') - ) { - $this->replace_ignore = trim($token->keyword); - } elseif ($token->type === Token::TYPE_KEYWORD - && $token->keyword === 'INTO' - ) { - $state = 2; + if ($token->type === Token::TYPE_KEYWORD) { + if ($token->keyword === 'REPLACE' + || $token->keyword === 'IGNORE') { + $this->replace_ignore = trim($token->keyword); + } elseif ($token->keyword === 'INTO') { + $state = 2; + } } } elseif ($state === 2) { if ($token->type === Token::TYPE_KEYWORD diff --git a/src/Statements/LockStatement.php b/src/Statements/LockStatement.php new file mode 100644 index 000000000..2ba70c4ee --- /dev/null +++ b/src/Statements/LockStatement.php @@ -0,0 +1,128 @@ +tokens[$list->idx]->value === 'UNLOCK') { + // this is in fact an UNLOCK statement + $this->isLock = false; + } + ++$list->idx; // Skipping `LOCK`. + + /** + * The state of the parser. + * + * Below are the states of the parser. + * + * 0 ---------------- [ TABLES ] -----------------> 1 + * 1 -------------- [ lock_expr ] ----------------> 2 + * 2 ------------------ [ , ] --------------------> 1 + * + * @var int + */ + $state = 0; + + /** + * Previous parsed token + */ + $prevToken = null; + + for (; $list->idx < $list->count; ++$list->idx) { + /** + * Token parsed at this moment. + * + * @var Token + */ + $token = $list->tokens[$list->idx]; + + // End of statement. + if ($token->type === Token::TYPE_DELIMITER) { + break; + } + + // Skipping whitespaces and comments. + if (($token->type === Token::TYPE_WHITESPACE) || ($token->type === Token::TYPE_COMMENT)) { + continue; + } + + if ($state === 0) { + if ($token->type === Token::TYPE_KEYWORD) { + if ($token->keyword !== 'TABLES') { + $parser->error('Unexpected keyword.', $token); + break; + } + $state = 1; + continue; + } else { + $parser->error('Unexpected token.', $token); + break; + } + } elseif ($state === 1) { + if (!$this->isLock) { + // UNLOCK statement should not have any more tokens + $parser->error('Unexpected token.', $token); + break; + } + $this->locked[] = LockExpression::parse($parser, $list); + $state = 2; + } elseif ($state === 2) { + if ($token->value === ',') { + // move over to parsing next lock expression + $state = 1; + } + } + + $prevToken = $token; + } + + if ($state !== 2 && $prevToken != null) { + $parser->error('Unexpected end of LOCK statement.', $prevToken); + } + } + + /** + * @return string + */ + public function build() + { + return trim(($this->isLock ? 'LOCK' : 'UNLOCK') + . ' TABLES ' . LockExpression::build($this->locked)); + } +} diff --git a/src/Statements/PurgeStatement.php b/src/Statements/PurgeStatement.php new file mode 100644 index 000000000..03748135c --- /dev/null +++ b/src/Statements/PurgeStatement.php @@ -0,0 +1,143 @@ +log_type . ' ' . 'LOGS ' + . ($this->end_option !== null ? ($this->end_option . ' ' . $this->end_expr) : ''); + return trim($ret); + } + + /** + * @param Parser $parser the instance that requests parsing + * @param TokensList $list the list of tokens to be parsed + */ + public function parse(Parser $parser, TokensList $list) + { + ++$list->idx; // Skipping `PURGE`. + + /** + * The state of the parser. + * + * @var int + */ + $state = 0; + + for (; $list->idx < $list->count; ++$list->idx) { + /** + * Token parsed at this moment. + * + * @var Token + */ + $token = $list->tokens[$list->idx]; + + // End of statement. + if ($token->type === Token::TYPE_DELIMITER) { + break; + } + + // Skipping whitespaces and comments. + if (($token->type === Token::TYPE_WHITESPACE) || ($token->type === Token::TYPE_COMMENT)) { + continue; + } + + switch ($state) { + case 0: + // parse `{ BINARY | MASTER }` + $this->log_type = self::parseExpectedKeyword($parser, $token, array('BINARY', 'MASTER')); + break; + case 1: + // parse `LOGS` + self::parseExpectedKeyword($parser, $token, array('LOGS')); + break; + case 2: + // parse `{ TO | BEFORE }` + $this->end_option = self::parseExpectedKeyword($parser, $token, array('TO', 'BEFORE')); + break; + case 3: + // parse `expr` + $this->end_expr = Expression::parse($parser, $list, array()); + break; + default: + $parser->error('Unexpected token.', $token); + break; + } + $state++; + $prevToken = $token; + } + + // Only one possible end state + if ($state != 4) { + $parser->error('Unexpected token.', $prevToken); + } + } + + /** + * Parse expected keyword (or throw relevant error) + * + * @param Parser $parser the instance that requests parsing + * @param Token $token token to be parsed + * @param Array $expected_keywords array of possibly expected keywords at this point + */ + private static function parseExpectedKeyword($parser, $token, $expected_keywords) + { + if ($token->type === Token::TYPE_KEYWORD) { + if (in_array($token->keyword, $expected_keywords)) { + return $token->keyword; + } else { + $parser->error('Unexpected keyword', $token); + } + } else { + $parser->error('Unexpected token.', $token); + } + return null; + } +} diff --git a/src/Statements/RenameStatement.php b/src/Statements/RenameStatement.php index 90533c20c..e1bcf0d22 100644 --- a/src/Statements/RenameStatement.php +++ b/src/Statements/RenameStatement.php @@ -47,4 +47,12 @@ public function before(Parser $parser, TokensList $list, Token $token) $list->getNextOfTypeAndValue(Token::TYPE_KEYWORD, 'TABLE'); } } + + /** + * @return string + */ + public function build() + { + return 'RENAME TABLE ' . RenameOperation::build($this->renames); + } } diff --git a/src/Statements/ReplaceStatement.php b/src/Statements/ReplaceStatement.php index 59d66aed9..40b11948d 100644 --- a/src/Statements/ReplaceStatement.php +++ b/src/Statements/ReplaceStatement.php @@ -89,11 +89,11 @@ public function build() { $ret = 'REPLACE ' . $this->options . ' INTO ' . $this->into; - if ($this->values != null && count($this->values) > 0) { + if (!is_null($this->values) && count($this->values) > 0) { $ret .= ' VALUES ' . Array2d::build($this->values); - } elseif ($this->set != null && count($this->set) > 0) { + } elseif (!is_null($this->set) && count($this->set) > 0) { $ret .= ' SET ' . SetOperation::build($this->set); - } elseif ($this->select != null && strlen($this->select) > 0) { + } elseif (!is_null($this->select) && strlen($this->select) > 0) { $ret .= ' ' . $this->select->build(); } diff --git a/src/Statements/SelectStatement.php b/src/Statements/SelectStatement.php index cd1d628b5..fbcae48eb 100644 --- a/src/Statements/SelectStatement.php +++ b/src/Statements/SelectStatement.php @@ -91,6 +91,9 @@ class SelectStatement extends Statement '_SELECT' => array('SELECT', 1), 'INTO' => array('INTO', 3), 'FROM' => array('FROM', 3), + 'FORCE' => array('FORCE', 1), + 'USE' => array('USE', 1), + 'IGNORE' => array('IGNORE', 3), 'PARTITION' => array('PARTITION', 3), 'JOIN' => array('JOIN', 1), @@ -135,6 +138,13 @@ class SelectStatement extends Statement */ public $from = array(); + /** + * Index hints + * + * @var IndexHint[] + */ + public $index_hints; + /** * Partitions used as source for this statement. * @@ -226,8 +236,7 @@ public function getClauses() // statement. if (!empty($this->union)) { $clauses = static::$CLAUSES; - unset($clauses['ORDER BY']); - unset($clauses['LIMIT']); + unset($clauses['ORDER BY'], $clauses['LIMIT']); $clauses['ORDER BY'] = array('ORDER BY', 3); $clauses['LIMIT'] = array('LIMIT', 3); diff --git a/src/Statements/SetStatement.php b/src/Statements/SetStatement.php index 007134f34..ef3a0c134 100644 --- a/src/Statements/SetStatement.php +++ b/src/Statements/SetStatement.php @@ -28,6 +28,7 @@ class SetStatement extends Statement */ public static $CLAUSES = array( 'SET' => array('SET', 3), + '_END_OPTIONS' => array('_END_OPTIONS', 1), ); /** @@ -42,6 +43,11 @@ class SetStatement extends Statement 'PASSWORD' => array(3, 'expr'), ); + public static $END_OPTIONS = array( + 'COLLATE' => array(1, 'var'), + 'DEFAULT' => 1 + ); + /** * Options used in current statement. * @@ -49,6 +55,15 @@ class SetStatement extends Statement */ public $options; + /** + * The end options of this query. + * + * @var OptionsArray + * + * @see static::$END_OPTIONS + */ + public $end_options; + /** * The updated values. * @@ -61,7 +76,10 @@ class SetStatement extends Statement */ public function build() { - return 'SET ' . OptionsArray::build($this->options) - . ' ' . SetOperation::build($this->set); + $ret = 'SET ' . OptionsArray::build($this->options) + . ' ' . SetOperation::build($this->set) + . ' ' . OptionsArray::build($this->end_options); + + return trim($ret); } } diff --git a/src/Statements/TransactionStatement.php b/src/Statements/TransactionStatement.php index c2bb30388..cfdc25cb7 100644 --- a/src/Statements/TransactionStatement.php +++ b/src/Statements/TransactionStatement.php @@ -82,12 +82,12 @@ public function parse(Parser $parser, TokensList $list) parent::parse($parser, $list); // Checks the type of this query. - if (($this->options->has('START TRANSACTION')) - || ($this->options->has('BEGIN')) + if ($this->options->has('START TRANSACTION') + || $this->options->has('BEGIN') ) { $this->type = self::TYPE_BEGIN; - } elseif (($this->options->has('COMMIT')) - || ($this->options->has('ROLLBACK')) + } elseif ($this->options->has('COMMIT') + || $this->options->has('ROLLBACK') ) { $this->type = self::TYPE_END; } diff --git a/src/Token.php b/src/Token.php index 4d028bfac..077c2c22f 100644 --- a/src/Token.php +++ b/src/Token.php @@ -295,20 +295,20 @@ public function extract() return $str; case self::TYPE_SYMBOL: $str = $this->token; - if ((isset($str[0])) && ($str[0] === '@')) { + if (isset($str[0]) && ($str[0] === '@')) { // `mb_strlen($str)` must be used instead of `null` because // in PHP 5.3- the `null` parameter isn't handled correctly. $str = mb_substr( $str, - ((!empty($str[1])) && ($str[1] === '@')) ? 2 : 1, + (!empty($str[1]) && ($str[1] === '@')) ? 2 : 1, mb_strlen($str), 'UTF-8' ); } - if ((isset($str[0])) && ($str[0] === ':')) { + if (isset($str[0]) && ($str[0] === ':')) { $str = mb_substr($str, 1, mb_strlen($str), 'UTF-8'); } - if ((isset($str[0])) && (($str[0] === '`') + if (isset($str[0]) && (($str[0] === '`') || ($str[0] === '"') || ($str[0] === '\'')) ) { $quote = $str[0]; diff --git a/src/Utils/BufferedQuery.php b/src/Utils/BufferedQuery.php index b333fa340..ee0dca48f 100644 --- a/src/Utils/BufferedQuery.php +++ b/src/Utils/BufferedQuery.php @@ -191,7 +191,7 @@ public function extract($end = false) * treated differently, because of the preceding backslash, it will * be ignored. */ - if ((($this->status & static::STATUS_COMMENT) == 0) && ($this->query[$i] === '\\')) { + if ((($this->status & static::STATUS_COMMENT) === 0) && ($this->query[$i] === '\\')) { $this->current .= $this->query[$i] . $this->query[++$i]; continue; } @@ -261,22 +261,21 @@ public function extract($end = false) $this->status = static::STATUS_COMMENT_BASH; $this->current .= $this->query[$i]; continue; - } elseif (($i + 2 < $len) - && ($this->query[$i] === '-') - && ($this->query[$i + 1] === '-') - && (Context::isWhitespace($this->query[$i + 2])) - ) { - $this->status = static::STATUS_COMMENT_SQL; - $this->current .= $this->query[$i]; - continue; - } elseif (($i + 2 < $len) - && ($this->query[$i] === '/') - && ($this->query[$i + 1] === '*') - && ($this->query[$i + 2] !== '!') - ) { - $this->status = static::STATUS_COMMENT_C; - $this->current .= $this->query[$i]; - continue; + } elseif ($i + 2 < $len) { + if (($this->query[$i] === '-') + && ($this->query[$i + 1] === '-') + && Context::isWhitespace($this->query[$i + 2])) { + $this->status = static::STATUS_COMMENT_SQL; + $this->current .= $this->query[$i]; + continue; + } + elseif (($this->query[$i] === '/') + && ($this->query[$i + 1] === '*') + && ($this->query[$i + 2] !== '!')) { + $this->status = static::STATUS_COMMENT_C; + $this->current .= $this->query[$i]; + continue; + } } /* @@ -301,7 +300,7 @@ public function extract($end = false) && (($this->query[$i + 6] === 'T') || ($this->query[$i + 6] === 't')) && (($this->query[$i + 7] === 'E') || ($this->query[$i + 7] === 'e')) && (($this->query[$i + 8] === 'R') || ($this->query[$i + 8] === 'r')) - && (Context::isWhitespace($this->query[$i + 9])) + && Context::isWhitespace($this->query[$i + 9]) ) { // Saving the current index to be able to revert any parsing // done in this block. @@ -309,7 +308,7 @@ public function extract($end = false) $i += 9; // Skipping `DELIMITER`. // Skipping whitespaces. - while (($i < $len) && (Context::isWhitespace($this->query[$i]))) { + while (($i < $len) && Context::isWhitespace($this->query[$i])) { ++$i; } @@ -320,9 +319,9 @@ public function extract($end = false) } // Checking if the delimiter definition ended. - if (($delimiter != '') - && ((($i < $len) && (Context::isWhitespace($this->query[$i]))) - || (($i === $len) && ($end))) + if (($delimiter !== '') + && ((($i < $len) && Context::isWhitespace($this->query[$i])) + || (($i === $len) && $end)) ) { // Saving the delimiter. $this->setDelimiter($delimiter); @@ -393,7 +392,7 @@ public function extract($end = false) $this->current .= $this->query[$i]; } - if (($end) && ($i === $len)) { + if ($end && ($i === $len)) { // If the end of the buffer was reached, the buffer is emptied and // the current statement that was extracted is returned. $ret = $this->current; diff --git a/src/Utils/CLI.php b/src/Utils/CLI.php index d412789c6..3dc48a6c7 100644 --- a/src/Utils/CLI.php +++ b/src/Utils/CLI.php @@ -120,7 +120,7 @@ public function runLint() $lexer = new Lexer($params['q'], false); $parser = new Parser($lexer->list); $errors = Error::get(array($lexer, $parser)); - if (count($errors) == 0) { + if (count($errors) === 0) { return 0; } $output = Error::format($errors); diff --git a/src/Utils/Formatter.php b/src/Utils/Formatter.php index df260e7da..c41c69cc5 100644 --- a/src/Utils/Formatter.php +++ b/src/Utils/Formatter.php @@ -412,8 +412,8 @@ public function formatList($list) } // Checking if this clause ended. - if ($tmp = static::isClause($curr)) { - if (($tmp == 2 || $this->options['clause_newline']) && empty(self::$SHORT_CLAUSES[$lastClause])) { + if ($isClause = static::isClause($curr)) { + if (($isClause === 2 || $this->options['clause_newline']) && empty(self::$SHORT_CLAUSES[$lastClause])) { $lineEnded = true; if ($this->options['parts_newline'] && $indent > 0) { --$indent; @@ -424,8 +424,8 @@ public function formatList($list) // Inline JOINs if (($prev->type === Token::TYPE_KEYWORD && isset(JoinKeyword::$JOINS[$prev->value])) || (in_array($curr->value, array('ON', 'USING'), true) && isset(JoinKeyword::$JOINS[$list->tokens[$list->idx - 2]->value])) - || (isset($list->tokens[$list->idx - 4]) && isset(JoinKeyword::$JOINS[$list->tokens[$list->idx - 4]->value])) - || (isset($list->tokens[$list->idx - 6]) && isset(JoinKeyword::$JOINS[$list->tokens[$list->idx - 6]->value])) + || isset($list->tokens[$list->idx - 4], JoinKeyword::$JOINS[$list->tokens[$list->idx - 4]->value]) + || isset($list->tokens[$list->idx - 6], JoinKeyword::$JOINS[$list->tokens[$list->idx - 6]->value]) ) { $lineEnded = false; } @@ -433,7 +433,7 @@ public function formatList($list) // Indenting BEGIN ... END blocks. if ($prev->type === Token::TYPE_KEYWORD && $prev->keyword === 'BEGIN') { $lineEnded = true; - array_push($blocksIndentation, $indent); + $blocksIndentation[] = $indent; ++$indent; } elseif ($curr->type === Token::TYPE_KEYWORD && $curr->keyword === 'END') { $lineEnded = true; @@ -460,14 +460,14 @@ public function formatList($list) // Brackets are indented only if the length of the fragment between // them is longer than 30 characters. if ($prev->type === Token::TYPE_OPERATOR && $prev->value === '(') { - array_push($blocksIndentation, $indent); + $blocksIndentation[] = $indent; $shortGroup = true; if (static::getGroupLength($list) > 30) { ++$indent; $lineEnded = true; $shortGroup = false; } - array_push($blocksLineEndings, $lineEnded); + $blocksLineEndings[] = $lineEnded; } elseif ($curr->type === Token::TYPE_OPERATOR && $curr->value === ')') { $indent = array_pop($blocksIndentation); $lineEnded |= array_pop($blocksLineEndings); @@ -554,7 +554,7 @@ public function toString($token) if ($this->options['type'] === 'html') { return '' . htmlspecialchars($text, ENT_NOQUOTES) . ''; } elseif ($this->options['type'] === 'cli') { - if ($prev != $format['cli']) { + if ($prev !== $format['cli']) { $prev = $format['cli']; return $format['cli'] . $this->escapeConsole($text); @@ -568,7 +568,7 @@ public function toString($token) } if ($this->options['type'] === 'cli') { - if ($prev != "\x1b[39m") { + if ($prev !== "\x1b[39m") { $prev = "\x1b[39m"; return "\x1b[39m" . $this->escapeConsole($text); @@ -633,7 +633,7 @@ public static function getGroupLength($list) ++$count; } elseif ($list->tokens[$idx]->value === ')') { --$count; - if ($count == 0) { + if ($count === 0) { break; } } diff --git a/src/Utils/Misc.php b/src/Utils/Misc.php index 9374db336..387600fac 100644 --- a/src/Utils/Misc.php +++ b/src/Utils/Misc.php @@ -29,8 +29,8 @@ class Misc public static function getAliases($statement, $database) { if (!($statement instanceof SelectStatement) - || (empty($statement->expr)) - || (empty($statement->from)) + || empty($statement->expr) + || empty($statement->from) ) { return array(); } @@ -55,11 +55,11 @@ public static function getAliases($statement, $database) } foreach ($expressions as $expr) { - if ((!isset($expr->table)) || ($expr->table === '')) { + if (!isset($expr->table) || ($expr->table === '')) { continue; } - $thisDb = ((isset($expr->database)) && ($expr->database !== '')) ? + $thisDb = (isset($expr->database) && ($expr->database !== '')) ? $expr->database : $database; if (!isset($retval[$thisDb])) { @@ -71,7 +71,7 @@ public static function getAliases($statement, $database) if (!isset($retval[$thisDb]['tables'][$expr->table])) { $retval[$thisDb]['tables'][$expr->table] = array( - 'alias' => ((isset($expr->alias)) && ($expr->alias !== '')) ? + 'alias' => (isset($expr->alias) && ($expr->alias !== '')) ? $expr->alias : null, 'columns' => array(), ); @@ -84,16 +84,15 @@ public static function getAliases($statement, $database) } foreach ($statement->expr as $expr) { - if ((!isset($expr->column)) || ($expr->column === '') - || (!isset($expr->alias)) || ($expr->alias === '') + if (!isset($expr->column, $expr->alias) || ($expr->column === '') || ($expr->alias === '') ) { continue; } - $thisDb = ((isset($expr->database)) && ($expr->database !== '')) ? + $thisDb = (isset($expr->database) && ($expr->database !== '')) ? $expr->database : $database; - if ((isset($expr->table)) && ($expr->table !== '')) { + if (isset($expr->table) && ($expr->table !== '')) { $thisTable = isset($tables[$thisDb][$expr->table]) ? $tables[$thisDb][$expr->table] : $expr->table; $retval[$thisDb]['tables'][$thisTable]['columns'][$expr->column] = $expr->alias; diff --git a/src/Utils/Query.php b/src/Utils/Query.php index 0115bbf83..b43a35e1f 100644 --- a/src/Utils/Query.php +++ b/src/Utils/Query.php @@ -228,11 +228,11 @@ private static function _getFlagsSelect($statement, $flags) $flags['distinct'] = true; } - if ((!empty($statement->group)) || (!empty($statement->having))) { + if (!empty($statement->group) || !empty($statement->having)) { $flags['is_group'] = true; } - if ((!empty($statement->into)) + if (!empty($statement->into) && ($statement->into->type === 'OUTFILE') ) { $flags['is_export'] = true; @@ -258,7 +258,7 @@ private static function _getFlagsSelect($statement, $flags) } } - if ((!empty($statement->procedure)) + if (!empty($statement->procedure) && ($statement->procedure->name === 'ANALYSE') ) { $flags['is_analyse'] = true; @@ -330,8 +330,8 @@ public static function getFlags($statement, $all = false) $flags['querytype'] = 'DROP'; $flags['reload'] = true; - if (($statement->options->has('DATABASE') - || ($statement->options->has('SCHEMA'))) + if ($statement->options->has('DATABASE') + || $statement->options->has('SCHEMA') ) { $flags['drop_database'] = true; } @@ -415,8 +415,7 @@ public static function getAll($query) // Finding tables' aliases and their associated real names. $tableAliases = array(); foreach ($statement->from as $expr) { - if ((isset($expr->table)) && ($expr->table !== '') - && (isset($expr->alias)) && ($expr->alias !== '') + if (isset($expr->table, $expr->alias) && ($expr->table !== '') && ($expr->alias !== '') ) { $tableAliases[$expr->alias] = array( $expr->table, @@ -429,13 +428,13 @@ public static function getAll($query) // Sometimes, this is not possible because the tables aren't defined // explicitly (e.g. SELECT * FROM film, SELECT film_id FROM film). foreach ($statement->expr as $expr) { - if ((isset($expr->table)) && ($expr->table !== '')) { + if (isset($expr->table) && ($expr->table !== '')) { if (isset($tableAliases[$expr->table])) { $arr = $tableAliases[$expr->table]; } else { $arr = array( $expr->table, - ((isset($expr->database)) && ($expr->database !== '')) ? + (isset($expr->database) && ($expr->database !== '')) ? $expr->database : null, ); } @@ -452,10 +451,10 @@ public static function getAll($query) // extracted from the FROM clause. if (empty($ret['select_tables'])) { foreach ($statement->from as $expr) { - if ((isset($expr->table)) && ($expr->table !== '')) { + if (isset($expr->table) && ($expr->table !== '')) { $arr = array( $expr->table, - ((isset($expr->database)) && ($expr->database !== '')) ? + (isset($expr->database) && ($expr->database !== '')) ? $expr->database : null, ); if (!in_array($arr, $ret['select_tables'])) { @@ -627,14 +626,14 @@ public static function getClause($statement, $list, $clause, $type = 0, $skipFir } } - if ($brackets == 0) { + if ($brackets === 0) { // Checking if the section was changed. if (($token->type === Token::TYPE_KEYWORD) - && (isset($clauses[$token->keyword])) + && isset($clauses[$token->keyword]) && ($clauses[$token->keyword] >= $currIdx) ) { $currIdx = $clauses[$token->keyword]; - if (($skipFirst) && ($currIdx == $clauseIdx)) { + if ($skipFirst && ($currIdx === $clauseIdx)) { // This token is skipped (not added to the old // clause) because it will be replaced. continue; @@ -727,12 +726,12 @@ public static function replaceClauses($statement, $list, array $ops) $ret .= static::getClause($statement, $list, $ops[0][0], -1) . ' '; // Doing replacements. - for ($i = 0; $i < $count; ++$i) { - $ret .= $ops[$i][1] . ' '; + foreach ($ops as $i => $clause) { + $ret .= $clause[1] . ' '; // Adding everything between this and next replacement. if ($i + 1 !== $count) { - $ret .= static::getClause($statement, $list, $ops[$i][0], $ops[$i + 1][0]) . ' '; + $ret .= static::getClause($statement, $list, $clause[0], $ops[$i + 1][0]) . ' '; } } @@ -780,7 +779,7 @@ public static function getFirstStatement($query, $delimiter = null) $statement .= $token->token; - if (($token->type === Token::TYPE_DELIMITER) && (!empty($token->token))) { + if (($token->type === Token::TYPE_DELIMITER) && !empty($token->token)) { $delimiter = $token->token; $fullStatement = true; break; @@ -844,9 +843,9 @@ public static function getClauseStartOffset($statement, $list, $clause) } } - if ($brackets == 0) { + if ($brackets === 0) { if (($token->type === Token::TYPE_KEYWORD) - && (isset($clauses[$token->keyword])) + && isset($clauses[$token->keyword]) && ($clause === $token->keyword) ) { return $i; diff --git a/src/Utils/Table.php b/src/Utils/Table.php index 762497409..b90c17a9c 100644 --- a/src/Utils/Table.php +++ b/src/Utils/Table.php @@ -26,7 +26,7 @@ class Table */ public static function getForeignKeys($statement) { - if ((empty($statement->fields)) + if (empty($statement->fields) || (!is_array($statement->fields)) || (!$statement->options->has('TABLE')) ) { @@ -36,7 +36,7 @@ public static function getForeignKeys($statement) $ret = array(); foreach ($statement->fields as $field) { - if ((empty($field->key)) || ($field->key->type !== 'FOREIGN KEY')) { + if (empty($field->key) || ($field->key->type !== 'FOREIGN KEY')) { continue; } @@ -55,11 +55,11 @@ public static function getForeignKeys($statement) $tmp['ref_table_name'] = $field->references->table->table; $tmp['ref_index_list'] = $field->references->columns; - if (($opt = $field->references->options->has('ON UPDATE'))) { + if ($opt = $field->references->options->has('ON UPDATE')) { $tmp['on_update'] = str_replace(' ', '_', $opt); } - if (($opt = $field->references->options->has('ON DELETE'))) { + if ($opt = $field->references->options->has('ON DELETE')) { $tmp['on_delete'] = str_replace(' ', '_', $opt); } @@ -83,7 +83,7 @@ public static function getForeignKeys($statement) */ public static function getFields($statement) { - if ((empty($statement->fields)) + if (empty($statement->fields) || (!is_array($statement->fields)) || (!$statement->options->has('TABLE')) ) { @@ -110,20 +110,20 @@ public static function getFields($statement) } } - if (($option = $field->options->has('DEFAULT'))) { + if ($option = $field->options->has('DEFAULT')) { $ret[$field->name]['default_value'] = $option; if ($option === 'CURRENT_TIMESTAMP') { $ret[$field->name]['default_current_timestamp'] = true; } } - if (($option = $field->options->has('ON UPDATE'))) { + if ($option = $field->options->has('ON UPDATE')) { if ($option === 'CURRENT_TIMESTAMP') { $ret[$field->name]['on_update_current_timestamp'] = true; } } - if (($option = $field->options->has('AS'))) { + if ($option = $field->options->has('AS')) { $ret[$field->name]['generated'] = true; $ret[$field->name]['expr'] = $option; } diff --git a/src/Utils/Tokens.php b/src/Utils/Tokens.php index 6520a7939..76ab14c84 100644 --- a/src/Utils/Tokens.php +++ b/src/Utils/Tokens.php @@ -30,34 +30,34 @@ class Tokens public static function match(Token $token, array $pattern) { // Token. - if ((isset($pattern['token'])) + if (isset($pattern['token']) && ($pattern['token'] !== $token->token) ) { return false; } // Value. - if ((isset($pattern['value'])) + if (isset($pattern['value']) && ($pattern['value'] !== $token->value) ) { return false; } - if ((isset($pattern['value_str'])) - && (strcasecmp($pattern['value_str'], $token->value)) + if (isset($pattern['value_str']) + && strcasecmp($pattern['value_str'], $token->value) ) { return false; } // Type. - if ((isset($pattern['type'])) + if (isset($pattern['type']) && ($pattern['type'] !== $token->type) ) { return false; } // Flags. - if ((isset($pattern['flags'])) + if (isset($pattern['flags']) && (($pattern['flags'] & $token->flags) === 0) ) { return false; diff --git a/tests/Builder/CreateStatementTest.php b/tests/Builder/CreateStatementTest.php index 9a9900bcc..eee093d01 100644 --- a/tests/Builder/CreateStatementTest.php +++ b/tests/Builder/CreateStatementTest.php @@ -271,6 +271,18 @@ public function testBuilderView() 'SELECT id, first_name FROM employee WHERE id = 1 ', $stmt->build() ); + + $parser = new Parser( + 'CREATE OR REPLACE VIEW myView (vid, vfirstname) AS ' . + 'SELECT id, first_name FROM employee WHERE id = 1' + ); + $stmt = $parser->statements[0]; + + $this->assertEquals( + 'CREATE OR REPLACE VIEW myView (vid, vfirstname) AS ' . + 'SELECT id, first_name FROM employee WHERE id = 1 ', + $stmt->build() + ); } public function testBuilderTrigger() diff --git a/tests/Builder/LockStatementTest.php b/tests/Builder/LockStatementTest.php new file mode 100644 index 000000000..b0b4d38e7 --- /dev/null +++ b/tests/Builder/LockStatementTest.php @@ -0,0 +1,68 @@ +statements[0]; + + $this->assertEquals($query, $stmt->build()); + + /* Assertion 2 */ + $query = 'LOCK TABLES table1 AS `t1` READ'; + + $parser = new Parser($query); + $stmt = $parser->statements[0]; + + $this->assertEquals($query, $stmt->build()); + + /* Assertion 3 */ + $query = 'LOCK TABLES table1 AS `t1` LOW_PRIORITY WRITE'; + + $parser = new Parser($query); + $stmt = $parser->statements[0]; + + $this->assertEquals($query, $stmt->build()); + + /* Assertion 4 */ + $query = 'LOCK TABLES table1 AS `t1` WRITE'; + + $parser = new Parser($query); + $stmt = $parser->statements[0]; + + $this->assertEquals($query, $stmt->build()); + + /* Assertion 5 */ + $query = 'LOCK TABLES table1 AS `t1` READ LOCAL, table2 AS `t2` WRITE'; + + $parser = new Parser($query); + $stmt = $parser->statements[0]; + + $this->assertEquals($query, $stmt->build()); + + /* Assertion 6 */ + $query = 'LOCK TABLES table1 READ LOCAL, table2 AS `t2` WRITE'; + + $parser = new Parser($query); + $stmt = $parser->statements[0]; + + $this->assertEquals($query, $stmt->build()); + + /* Assertion 7 */ + $query = 'UNLOCK TABLES'; + + $parser = new Parser($query); + $stmt = $parser->statements[0]; + + $this->assertEquals($query, $stmt->build()); + } +} diff --git a/tests/Builder/PurgeStatementTest.php b/tests/Builder/PurgeStatementTest.php new file mode 100644 index 000000000..caa165239 --- /dev/null +++ b/tests/Builder/PurgeStatementTest.php @@ -0,0 +1,22 @@ +statements[0]; + $this->assertEquals($query, $stmt->build()); + + $query = 'PURGE BINARY LOGS BEFORE \'2008-04-02 22:46:26\''; + $parser = new Parser($query); + $stmt = $parser->statements[0]; + $this->assertEquals($query, $stmt->build()); + } +} diff --git a/tests/Builder/RenameStatementTest.php b/tests/Builder/RenameStatementTest.php new file mode 100644 index 000000000..97852abfb --- /dev/null +++ b/tests/Builder/RenameStatementTest.php @@ -0,0 +1,42 @@ +statements[0]; + $this->assertEquals( + $query, + $stmt->build() + ); + + $query = 'RENAME TABLE current_db.tbl_name TO other_db.tbl_name'; + $parser = new Parser( + $query + ); + $stmt = $parser->statements[0]; + $this->assertEquals( + $query, + $stmt->build() + ); + + $query = 'RENAME TABLE old_table1 TO new_table1, old_table2 TO new_table2, old_table3 TO new_table3'; + $parser = new Parser( + $query + ); + $stmt = $parser->statements[0]; + $this->assertEquals( + $query, + $stmt->build() + ); + } +} diff --git a/tests/Builder/SelectStatementTest.php b/tests/Builder/SelectStatementTest.php index f9db69e01..614c56137 100644 --- a/tests/Builder/SelectStatementTest.php +++ b/tests/Builder/SelectStatementTest.php @@ -102,4 +102,16 @@ public function testBuildGroupBy() $stmt->build() ); } + + public function testBuildIndexHint() + { + $query = 'SELECT * FROM address FORCE INDEX (idx_fk_city_id) IGNORE KEY FOR GROUP BY (a, b,c) WHERE city_id<0 '; + $parser = new Parser($query); + $stmt = $parser->statements[0]; + + $this->assertEquals( + $query, + $stmt->build() + ); + } } diff --git a/tests/Builder/SetStatementTest.php b/tests/Builder/SetStatementTest.php index f6f669a58..746e92f72 100644 --- a/tests/Builder/SetStatementTest.php +++ b/tests/Builder/SetStatementTest.php @@ -10,35 +10,57 @@ class SetStatementTest extends TestCase public function testBuilderView() { /* Assertion 1 */ - $query = 'SET CHARACTER SET \'utf8\';'; + $query = 'SET CHARACTER SET \'utf8\''; $parser = new Parser($query); $stmt = $parser->statements[0]; $this->assertEquals( - 'SET CHARACTER SET \'utf8\' ', + $query, $stmt->build() ); /* Assertion 2 */ - $query = 'SET CHARSET \'utf8\';'; + $query = 'SET CHARSET \'utf8\''; $parser = new Parser($query); $stmt = $parser->statements[0]; $this->assertEquals( - 'SET CHARSET \'utf8\' ', + $query, $stmt->build() ); /* Assertion 3 */ - $query = 'SET NAMES \'utf8\';'; + $query = 'SET NAMES \'utf8\''; $parser = new Parser($query); $stmt = $parser->statements[0]; $this->assertEquals( - 'SET NAMES \'utf8\' ', + $query, + $stmt->build() + ); + + /* Assertion 4 */ + $query = 'SET NAMES \'utf8\' COLLATE \'utf8_general_ci\''; + + $parser = new Parser($query); + $stmt = $parser->statements[0]; + + $this->assertEquals( + 'SET NAMES \'utf8\' COLLATE \'utf8_general_ci\'', + $stmt->build() + ); + + /* Assertion 5 */ + $query = 'SET NAMES \'utf8\' DEFAULT'; + + $parser = new Parser($query); + $stmt = $parser->statements[0]; + + $this->assertEquals( + 'SET NAMES \'utf8\' DEFAULT', $stmt->build() ); } diff --git a/tests/Components/CaseExpressionTest.php b/tests/Components/CaseExpressionTest.php index afe5e6095..475486f3a 100644 --- a/tests/Components/CaseExpressionTest.php +++ b/tests/Components/CaseExpressionTest.php @@ -83,4 +83,32 @@ public function testParseBuild6() 'CASE WHEN 1=1 THEN "Some" WHEN 1=2 THEN "SomeOther" END' ); } + + public function testParseBuild7() + { + $caseExprQuery = 'case when 1=1 then "Some" ' + . 'when 1=2 then "SomeOther" end AS foo'; + $component = CaseExpression::parse( + new Parser(), + $this->getTokensList($caseExprQuery) + ); + $this->assertEquals( + CaseExpression::build($component), + 'CASE WHEN 1=1 THEN "Some" WHEN 1=2 THEN "SomeOther" END AS `foo`' + ); + } + + public function testParseBuild8() + { + $caseExprQuery = 'case when 1=1 then "Some" ' + . 'when 1=2 then "SomeOther" end foo'; + $component = CaseExpression::parse( + new Parser(), + $this->getTokensList($caseExprQuery) + ); + $this->assertEquals( + CaseExpression::build($component), + 'CASE WHEN 1=1 THEN "Some" WHEN 1=2 THEN "SomeOther" END AS `foo`' + ); + } } diff --git a/tests/Components/CreateDefinitionTest.php b/tests/Components/CreateDefinitionTest.php index b14708c61..3683e290d 100644 --- a/tests/Components/CreateDefinitionTest.php +++ b/tests/Components/CreateDefinitionTest.php @@ -38,7 +38,7 @@ public function testParseErr1() public function testParseErr2() { $parser = new Parser(); - $component = CreateDefinition::parse( + CreateDefinition::parse( $parser, $this->getTokensList(')') ); diff --git a/tests/Components/LimitTest.php b/tests/Components/LimitTest.php index 466a19913..e78f5ffad 100644 --- a/tests/Components/LimitTest.php +++ b/tests/Components/LimitTest.php @@ -3,7 +3,6 @@ namespace PhpMyAdmin\SqlParser\Tests\Components; use PhpMyAdmin\SqlParser\Components\Limit; -use PhpMyAdmin\SqlParser\Parser; use PhpMyAdmin\SqlParser\Tests\TestCase; class LimitTest extends TestCase diff --git a/tests/Components/LockExpressionTest.php b/tests/Components/LockExpressionTest.php new file mode 100644 index 000000000..56654a6de --- /dev/null +++ b/tests/Components/LockExpressionTest.php @@ -0,0 +1,71 @@ +getTokensList('table1 AS t1 READ LOCAL')); + $this->assertNotNull($component->table); + $this->assertEquals($component->table->table, 'table1'); + $this->assertEquals($component->table->alias, 't1'); + $this->assertEquals($component->type, 'READ LOCAL'); + } + + public function testParse2() + { + $component = LockExpression::parse(new Parser(), $this->getTokensList('table1 LOW_PRIORITY WRITE')); + $this->assertNotNull($component->table); + $this->assertEquals($component->table->table, 'table1'); + $this->assertEquals($component->type, 'LOW_PRIORITY WRITE'); + } + + /** + * @dataProvider testParseErrProvider + * + * @param mixed $expr + * @param mixed $error + */ + public function testParseErr($expr, $error) + { + $parser = new Parser(); + LockExpression::parse($parser, $this->getTokensList($expr)); + $errors = $this->getErrorsAsArray($parser); + $this->assertEquals($errors[0][0], $error); + } + + public function testParseErrProvider() + { + return array( + array( + 'table1 AS t1', + 'Unexpected end of LOCK expression.', + ), + array( + 'table1 AS t1 READ WRITE', + 'Unexpected keyword.', + ), + array( + 'table1 AS t1 READ 2', + 'Unexpected token.', + ), + ); + } + + public function testBuild() + { + $component = array( + LockExpression::parse(new Parser(), $this->getTokensList('table1 AS t1 READ LOCAL')), + LockExpression::parse(new Parser(), $this->getTokensList('table2 LOW_PRIORITY WRITE')), + ); + $this->assertEquals( + LockExpression::build($component), + 'table1 AS `t1` READ LOCAL, table2 LOW_PRIORITY WRITE' + ); + } +} diff --git a/tests/Parser/AlterStatementTest.php b/tests/Parser/AlterStatementTest.php index 33de19d85..3582bf353 100644 --- a/tests/Parser/AlterStatementTest.php +++ b/tests/Parser/AlterStatementTest.php @@ -25,6 +25,10 @@ public function testAlterProvider() array('parser/parseAlter4'), array('parser/parseAlter5'), array('parser/parseAlter6'), + array('parser/parseAlter7'), + array('parser/parseAlter8'), + array('parser/parseAlterErr'), + array('parser/parseAlterErr2'), ); } } diff --git a/tests/Parser/LockStatementTest.php b/tests/Parser/LockStatementTest.php new file mode 100644 index 000000000..3458e0a24 --- /dev/null +++ b/tests/Parser/LockStatementTest.php @@ -0,0 +1,41 @@ +runParserTest($test); + } + + public function testLockProvider() + { + return array( + array('parser/parseLock1'), + array('parser/parseLock2'), + array('parser/parseLock3'), + array('parser/parseLock4'), + array('parser/parseLock5'), + array('parser/parseLockErr1'), + array('parser/parseLockErr2'), + array('parser/parseLockErr3'), + array('parser/parseLockErr4'), + array('parser/parseLockErr5'), + array('parser/parseLockErr6'), + array('parser/parseLockErr7'), + array('parser/parseLockErr8'), + array('parser/parseLockErr9'), + array('parser/parseLockErr10'), + array('parser/parseUnlock1'), + array('parser/parseUnlockErr1'), + ); + } +} diff --git a/tests/Parser/PurgeStatementTest.php b/tests/Parser/PurgeStatementTest.php new file mode 100644 index 000000000..dd67dc6df --- /dev/null +++ b/tests/Parser/PurgeStatementTest.php @@ -0,0 +1,31 @@ +runParserTest($test); + } + + public function testPurgeProvider() + { + return array( + array('parser/parsePurge'), + array('parser/parsePurge2'), + array('parser/parsePurge3'), + array('parser/parsePurge4'), + array('parser/parsePurgeErr'), + array('parser/parsePurgeErr2'), + array('parser/parsePurgeErr3'), + ); + } +} diff --git a/tests/Parser/SelectStatementTest.php b/tests/Parser/SelectStatementTest.php index 42fb955c7..55b80ecce 100644 --- a/tests/Parser/SelectStatementTest.php +++ b/tests/Parser/SelectStatementTest.php @@ -51,6 +51,16 @@ public function testSelectProvider() array('parser/parseSelectCaseErr3'), array('parser/parseSelectCaseErr4'), array('parser/parseSelectCaseErr5'), + array('parser/parseSelectCaseAlias1'), + array('parser/parseSelectCaseAlias2'), + array('parser/parseSelectCaseAlias3'), + array('parser/parseSelectCaseAlias4'), + array('parser/parseSelectCaseAlias5'), + array('parser/parseSelectCaseAlias6'), + array('parser/parseSelectCaseAliasErr1'), + array('parser/parseSelectCaseAliasErr2'), + array('parser/parseSelectCaseAliasErr3'), + array('parser/parseSelectCaseAliasErr4'), array('parser/parseSelectIntoOptions1'), array('parser/parseSelectIntoOptions2'), array('parser/parseSelectIntoOptions3'), @@ -69,6 +79,12 @@ public function testSelectProvider() array('parser/parseSelectEndOptionsErr'), array('parser/parseSelectUnion'), array('parser/parseSelectUnion2'), + array('parser/parseSelectIndexHint1'), + array('parser/parseSelectIndexHint2'), + array('parser/parseSelectIndexHintErr1'), + array('parser/parseSelectIndexHintErr2'), + array('parser/parseSelectIndexHintErr3'), + array('parser/parseSelectIndexHintErr4'), ); } } diff --git a/tests/Parser/UpdateStatementTest.php b/tests/Parser/UpdateStatementTest.php index 3c442fefe..1d6c923e6 100644 --- a/tests/Parser/UpdateStatementTest.php +++ b/tests/Parser/UpdateStatementTest.php @@ -22,6 +22,7 @@ public function testUpdateProvider() array('parser/parseUpdate'), array('parser/parseUpdate2'), array('parser/parseUpdate3'), + array('parser/parseUpdateErr'), ); } } diff --git a/tests/Utils/BufferedQueryTest.php b/tests/Utils/BufferedQueryTest.php index 182c1ab5f..731fc0ef2 100644 --- a/tests/Utils/BufferedQueryTest.php +++ b/tests/Utils/BufferedQueryTest.php @@ -39,7 +39,7 @@ public function testExtract( // Feeding chunks and extracting queries. $i = 0; while ($i < $count) { - if (($stmt = $bq->extract())) { + if ($stmt = $bq->extract()) { $statements[] = $stmt; } else { $bq->query .= $chunks[$i++]; @@ -47,7 +47,7 @@ public function testExtract( } // Feeding ended, extracting remaining queries. - while (($stmt = $bq->extract(true))) { + while ($stmt = $bq->extract(true)) { $statements[] = $stmt; } diff --git a/tests/data/parser/parseAlter7.in b/tests/data/parser/parseAlter7.in new file mode 100644 index 000000000..5921e763a --- /dev/null +++ b/tests/data/parser/parseAlter7.in @@ -0,0 +1 @@ +ALTER TABLE `tbl` CHANGE `uid` `uid` INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT, CHANGE `field_1` `field_2` INT( 10 ) UNSIGNED NOT NULL \ No newline at end of file diff --git a/tests/data/parser/parseAlter7.out b/tests/data/parser/parseAlter7.out new file mode 100644 index 000000000..3dcd6f012 --- /dev/null +++ b/tests/data/parser/parseAlter7.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:135:"ALTER TABLE `tbl` CHANGE `uid` `uid` INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT, CHANGE `field_1` `field_2` INT( 10 ) UNSIGNED NOT NULL";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:135:"ALTER TABLE `tbl` CHANGE `uid` `uid` INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT, CHANGE `field_1` `field_2` INT( 10 ) UNSIGNED NOT NULL";s:3:"len";i:135;s:4:"last";i:135;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:43:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"ALTER";s:5:"value";s:5:"ALTER";s:7:"keyword";s:5:"ALTER";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:5;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"TABLE";s:5:"value";s:5:"TABLE";s:7:"keyword";s:5:"TABLE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:6;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:11;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"`tbl`";s:5:"value";s:3:"tbl";s:7:"keyword";N;s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:12;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:17;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"CHANGE";s:5:"value";s:6:"CHANGE";s:7:"keyword";s:6:"CHANGE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:18;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:24;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"`uid`";s:5:"value";s:3:"uid";s:7:"keyword";N;s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:25;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:30;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"`uid`";s:5:"value";s:3:"uid";s:7:"keyword";N;s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:31;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:36;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"INT";s:5:"value";s:3:"INT";s:7:"keyword";s:3:"INT";s:4:"type";i:1;s:5:"flags";i:11;s:8:"position";i:37;}i:13;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:40;}i:14;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:41;}i:15;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"10";s:5:"value";i:10;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:42;}i:16;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:44;}i:17;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:45;}i:18;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:46;}i:19;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:8:"UNSIGNED";s:5:"value";s:8:"UNSIGNED";s:7:"keyword";s:8:"UNSIGNED";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:47;}i:20;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:55;}i:21;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:8:"NOT NULL";s:5:"value";s:8:"NOT NULL";s:7:"keyword";s:8:"NOT NULL";s:4:"type";i:1;s:5:"flags";i:7;s:8:"position";i:56;}i:22;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:64;}i:23;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:14:"AUTO_INCREMENT";s:5:"value";s:14:"AUTO_INCREMENT";s:7:"keyword";s:14:"AUTO_INCREMENT";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:65;}i:24;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:",";s:5:"value";s:1:",";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:79;}i:25;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:80;}i:26;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"CHANGE";s:5:"value";s:6:"CHANGE";s:7:"keyword";s:6:"CHANGE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:81;}i:27;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:87;}i:28;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:9:"`field_1`";s:5:"value";s:7:"field_1";s:7:"keyword";N;s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:88;}i:29;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:97;}i:30;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:9:"`field_2`";s:5:"value";s:7:"field_2";s:7:"keyword";N;s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:98;}i:31;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:107;}i:32;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"INT";s:5:"value";s:3:"INT";s:7:"keyword";s:3:"INT";s:4:"type";i:1;s:5:"flags";i:11;s:8:"position";i:108;}i:33;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:111;}i:34;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:112;}i:35;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"10";s:5:"value";i:10;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:113;}i:36;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:115;}i:37;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:116;}i:38;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:117;}i:39;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:8:"UNSIGNED";s:5:"value";s:8:"UNSIGNED";s:7:"keyword";s:8:"UNSIGNED";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:118;}i:40;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:126;}i:41;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:8:"NOT NULL";s:5:"value";s:8:"NOT NULL";s:7:"keyword";s:8:"NOT NULL";s:4:"type";i:1;s:5:"flags";i:7;s:8:"position";i:127;}i:42;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:43;s:3:"idx";i:43;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Statements\AlterStatement":5:{s:5:"table";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:3:"tbl";s:6:"column";N;s:4:"expr";s:5:"`tbl`";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:7:"altered";a:2:{i:0;O:46:"PhpMyAdmin\SqlParser\Components\AlterOperation":3:{s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:1;s:6:"CHANGE";}}s:5:"field";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:3:"uid";s:4:"expr";s:5:"`uid`";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:7:"unknown";a:14:{i:0;r:79;i:1;r:86;i:2;r:93;i:3;r:100;i:4;r:107;i:5;r:114;i:6;r:121;i:7;r:128;i:8;r:135;i:9;r:142;i:10;r:149;i:11;r:156;i:12;r:163;i:13;r:170;}}i:1;O:46:"PhpMyAdmin\SqlParser\Components\AlterOperation":3:{s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:1;s:6:"CHANGE";}}s:5:"field";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:7:"field_1";s:4:"expr";s:9:"`field_1`";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:7:"unknown";a:12:{i:0;r:219;i:1;r:226;i:2;r:233;i:3;r:240;i:4;r:247;i:5;r:254;i:6;r:261;i:7;r:268;i:8;r:275;i:9;r:282;i:10;r:289;i:11;r:296;}}}s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:3;s:5:"TABLE";}}s:5:"first";i:0;s:4:"last";i:42;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}} \ No newline at end of file diff --git a/tests/data/parser/parseAlter8.in b/tests/data/parser/parseAlter8.in new file mode 100644 index 000000000..17b72cbaf --- /dev/null +++ b/tests/data/parser/parseAlter8.in @@ -0,0 +1 @@ +ALTER TABLE `api_tab_user` CHANGE `rank_id` `rank_id` INT(4) NOT NULL DEFAULT '4'; \ No newline at end of file diff --git a/tests/data/parser/parseAlter8.out b/tests/data/parser/parseAlter8.out new file mode 100644 index 000000000..8766a08ab --- /dev/null +++ b/tests/data/parser/parseAlter8.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:82:"ALTER TABLE `api_tab_user` CHANGE `rank_id` `rank_id` INT(4) NOT NULL DEFAULT '4';";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:82:"ALTER TABLE `api_tab_user` CHANGE `rank_id` `rank_id` INT(4) NOT NULL DEFAULT '4';";s:3:"len";i:82;s:4:"last";i:82;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:24:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"ALTER";s:5:"value";s:5:"ALTER";s:7:"keyword";s:5:"ALTER";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:5;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"TABLE";s:5:"value";s:5:"TABLE";s:7:"keyword";s:5:"TABLE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:6;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:11;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:14:"`api_tab_user`";s:5:"value";s:12:"api_tab_user";s:7:"keyword";N;s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:12;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:26;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"CHANGE";s:5:"value";s:6:"CHANGE";s:7:"keyword";s:6:"CHANGE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:27;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:33;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:9:"`rank_id`";s:5:"value";s:7:"rank_id";s:7:"keyword";N;s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:34;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:43;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:9:"`rank_id`";s:5:"value";s:7:"rank_id";s:7:"keyword";N;s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:44;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:53;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"INT";s:5:"value";s:3:"INT";s:7:"keyword";s:3:"INT";s:4:"type";i:1;s:5:"flags";i:11;s:8:"position";i:54;}i:13;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:57;}i:14;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"4";s:5:"value";i:4;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:58;}i:15;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:59;}i:16;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:60;}i:17;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:8:"NOT NULL";s:5:"value";s:8:"NOT NULL";s:7:"keyword";s:8:"NOT NULL";s:4:"type";i:1;s:5:"flags";i:7;s:8:"position";i:61;}i:18;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:69;}i:19;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:7:"DEFAULT";s:5:"value";s:7:"DEFAULT";s:7:"keyword";s:7:"DEFAULT";s:4:"type";i:1;s:5:"flags";i:35;s:8:"position";i:70;}i:20;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:77;}i:21;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"'4'";s:5:"value";s:1:"4";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:1;s:8:"position";i:78;}i:22;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:81;}i:23;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:24;s:3:"idx";i:24;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Statements\AlterStatement":5:{s:5:"table";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:12:"api_tab_user";s:6:"column";N;s:4:"expr";s:14:"`api_tab_user`";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:7:"altered";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Components\AlterOperation":3:{s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:1;s:6:"CHANGE";}}s:5:"field";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:7:"rank_id";s:4:"expr";s:9:"`rank_id`";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:7:"unknown";a:12:{i:0;r:79;i:1;r:86;i:2;r:93;i:3;r:100;i:4;r:107;i:5;r:114;i:6;r:121;i:7;r:128;i:8;r:135;i:9;r:142;i:10;r:149;i:11;r:156;}}}s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:3;s:5:"TABLE";}}s:5:"first";i:0;s:4:"last";i:22;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}} \ No newline at end of file diff --git a/tests/data/parser/parseAlterErr.in b/tests/data/parser/parseAlterErr.in new file mode 100644 index 000000000..4652a1700 --- /dev/null +++ b/tests/data/parser/parseAlterErr.in @@ -0,0 +1,2 @@ +-- missing comma between alter operations +ALTER TABLE `tbl` CHANGE `uid` `uid` INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT CHANGE `field_1` `field_2` INT( 10 ) UNSIGNED NOT NULL \ No newline at end of file diff --git a/tests/data/parser/parseAlterErr.out b/tests/data/parser/parseAlterErr.out new file mode 100644 index 000000000..060e5af74 --- /dev/null +++ b/tests/data/parser/parseAlterErr.out @@ -0,0 +1,4 @@ +a:4:{s:5:"query";s:176:"-- missing comma between alter operations +ALTER TABLE `tbl` CHANGE `uid` `uid` INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT CHANGE `field_1` `field_2` INT( 10 ) UNSIGNED NOT NULL";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:176:"-- missing comma between alter operations +ALTER TABLE `tbl` CHANGE `uid` `uid` INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT CHANGE `field_1` `field_2` INT( 10 ) UNSIGNED NOT NULL";s:3:"len";i:176;s:4:"last";i:176;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:44:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:41:"-- missing comma between alter operations";s:5:"value";s:41:"-- missing comma between alter operations";s:7:"keyword";N;s:4:"type";i:4;s:5:"flags";i:4;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" +";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:41;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"ALTER";s:5:"value";s:5:"ALTER";s:7:"keyword";s:5:"ALTER";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:42;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:47;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"TABLE";s:5:"value";s:5:"TABLE";s:7:"keyword";s:5:"TABLE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:48;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:53;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"`tbl`";s:5:"value";s:3:"tbl";s:7:"keyword";N;s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:54;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:59;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"CHANGE";s:5:"value";s:6:"CHANGE";s:7:"keyword";s:6:"CHANGE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:60;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:66;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"`uid`";s:5:"value";s:3:"uid";s:7:"keyword";N;s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:67;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:72;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"`uid`";s:5:"value";s:3:"uid";s:7:"keyword";N;s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:73;}i:13;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:78;}i:14;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"INT";s:5:"value";s:3:"INT";s:7:"keyword";s:3:"INT";s:4:"type";i:1;s:5:"flags";i:11;s:8:"position";i:79;}i:15;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:82;}i:16;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:83;}i:17;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"10";s:5:"value";i:10;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:84;}i:18;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:86;}i:19;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:87;}i:20;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:88;}i:21;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:8:"UNSIGNED";s:5:"value";s:8:"UNSIGNED";s:7:"keyword";s:8:"UNSIGNED";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:89;}i:22;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:97;}i:23;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:8:"NOT NULL";s:5:"value";s:8:"NOT NULL";s:7:"keyword";s:8:"NOT NULL";s:4:"type";i:1;s:5:"flags";i:7;s:8:"position";i:98;}i:24;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:106;}i:25;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:14:"AUTO_INCREMENT";s:5:"value";s:14:"AUTO_INCREMENT";s:7:"keyword";s:14:"AUTO_INCREMENT";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:107;}i:26;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:121;}i:27;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"CHANGE";s:5:"value";s:6:"CHANGE";s:7:"keyword";s:6:"CHANGE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:122;}i:28;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:128;}i:29;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:9:"`field_1`";s:5:"value";s:7:"field_1";s:7:"keyword";N;s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:129;}i:30;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:138;}i:31;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:9:"`field_2`";s:5:"value";s:7:"field_2";s:7:"keyword";N;s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:139;}i:32;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:148;}i:33;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"INT";s:5:"value";s:3:"INT";s:7:"keyword";s:3:"INT";s:4:"type";i:1;s:5:"flags";i:11;s:8:"position";i:149;}i:34;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:152;}i:35;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:153;}i:36;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"10";s:5:"value";i:10;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:154;}i:37;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:156;}i:38;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:157;}i:39;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:158;}i:40;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:8:"UNSIGNED";s:5:"value";s:8:"UNSIGNED";s:7:"keyword";s:8:"UNSIGNED";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:159;}i:41;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:167;}i:42;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:8:"NOT NULL";s:5:"value";s:8:"NOT NULL";s:7:"keyword";s:8:"NOT NULL";s:4:"type";i:1;s:5:"flags";i:7;s:8:"position";i:168;}i:43;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:44;s:3:"idx";i:44;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Statements\AlterStatement":5:{s:5:"table";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:3:"tbl";s:6:"column";N;s:4:"expr";s:5:"`tbl`";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:7:"altered";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Components\AlterOperation":3:{s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:1;s:6:"CHANGE";}}s:5:"field";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:3:"uid";s:4:"expr";s:5:"`uid`";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:7:"unknown";a:15:{i:0;r:93;i:1;r:100;i:2;r:107;i:3;r:114;i:4;r:121;i:5;r:128;i:6;r:135;i:7;r:142;i:8;r:149;i:9;r:156;i:10;r:163;i:11;r:170;i:12;r:177;i:13;r:184;i:14;r:191;}}}s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:3;s:5:"TABLE";}}s:5:"first";i:0;s:4:"last";i:43;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:1:{i:0;a:3:{i:0;s:52:"Missing comma before start of a new alter operation.";i:1;r:198;i:2;i:0;}}}} \ No newline at end of file diff --git a/tests/data/parser/parseAlterErr2.in b/tests/data/parser/parseAlterErr2.in new file mode 100644 index 000000000..d9467fa89 --- /dev/null +++ b/tests/data/parser/parseAlterErr2.in @@ -0,0 +1,2 @@ +-- missing comma between alter operations +ALTER TABLE `tbl` CHANGE `uid` `uid` INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT CHARACTER SET 'utf8' \ No newline at end of file diff --git a/tests/data/parser/parseAlterErr2.out b/tests/data/parser/parseAlterErr2.out new file mode 100644 index 000000000..bc5ba1187 --- /dev/null +++ b/tests/data/parser/parseAlterErr2.out @@ -0,0 +1,4 @@ +a:4:{s:5:"query";s:142:"-- missing comma between alter operations +ALTER TABLE `tbl` CHANGE `uid` `uid` INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT CHARACTER SET 'utf8'";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:142:"-- missing comma between alter operations +ALTER TABLE `tbl` CHANGE `uid` `uid` INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT CHARACTER SET 'utf8'";s:3:"len";i:142;s:4:"last";i:142;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:31:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:41:"-- missing comma between alter operations";s:5:"value";s:41:"-- missing comma between alter operations";s:7:"keyword";N;s:4:"type";i:4;s:5:"flags";i:4;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" +";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:41;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"ALTER";s:5:"value";s:5:"ALTER";s:7:"keyword";s:5:"ALTER";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:42;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:47;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"TABLE";s:5:"value";s:5:"TABLE";s:7:"keyword";s:5:"TABLE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:48;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:53;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"`tbl`";s:5:"value";s:3:"tbl";s:7:"keyword";N;s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:54;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:59;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"CHANGE";s:5:"value";s:6:"CHANGE";s:7:"keyword";s:6:"CHANGE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:60;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:66;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"`uid`";s:5:"value";s:3:"uid";s:7:"keyword";N;s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:67;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:72;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"`uid`";s:5:"value";s:3:"uid";s:7:"keyword";N;s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:73;}i:13;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:78;}i:14;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"INT";s:5:"value";s:3:"INT";s:7:"keyword";s:3:"INT";s:4:"type";i:1;s:5:"flags";i:11;s:8:"position";i:79;}i:15;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:82;}i:16;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:83;}i:17;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"10";s:5:"value";i:10;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:84;}i:18;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:86;}i:19;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:87;}i:20;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:88;}i:21;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:8:"UNSIGNED";s:5:"value";s:8:"UNSIGNED";s:7:"keyword";s:8:"UNSIGNED";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:89;}i:22;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:97;}i:23;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:8:"NOT NULL";s:5:"value";s:8:"NOT NULL";s:7:"keyword";s:8:"NOT NULL";s:4:"type";i:1;s:5:"flags";i:7;s:8:"position";i:98;}i:24;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:106;}i:25;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:14:"AUTO_INCREMENT";s:5:"value";s:14:"AUTO_INCREMENT";s:7:"keyword";s:14:"AUTO_INCREMENT";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:107;}i:26;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:121;}i:27;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:13:"CHARACTER SET";s:5:"value";s:13:"CHARACTER SET";s:7:"keyword";s:13:"CHARACTER SET";s:4:"type";i:1;s:5:"flags";i:7;s:8:"position";i:122;}i:28;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:135;}i:29;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"'utf8'";s:5:"value";s:4:"utf8";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:1;s:8:"position";i:136;}i:30;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:31;s:3:"idx";i:31;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Statements\AlterStatement":5:{s:5:"table";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:3:"tbl";s:6:"column";N;s:4:"expr";s:5:"`tbl`";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:7:"altered";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Components\AlterOperation":3:{s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:1;s:6:"CHANGE";}}s:5:"field";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:3:"uid";s:4:"expr";s:5:"`uid`";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:7:"unknown";a:15:{i:0;r:93;i:1;r:100;i:2;r:107;i:3;r:114;i:4;r:121;i:5;r:128;i:6;r:135;i:7;r:142;i:8;r:149;i:9;r:156;i:10;r:163;i:11;r:170;i:12;r:177;i:13;r:184;i:14;r:191;}}}s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:3;s:5:"TABLE";}}s:5:"first";i:0;s:4:"last";i:30;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:1:{i:0;a:3:{i:0;s:52:"Missing comma before start of a new alter operation.";i:1;r:198;i:2;i:0;}}}} \ No newline at end of file diff --git a/tests/data/parser/parseLock1.in b/tests/data/parser/parseLock1.in new file mode 100644 index 000000000..cfed7a3a6 --- /dev/null +++ b/tests/data/parser/parseLock1.in @@ -0,0 +1 @@ +LOCK TABLES table1 AS `t1` READ LOCAL; \ No newline at end of file diff --git a/tests/data/parser/parseLock1.out b/tests/data/parser/parseLock1.out new file mode 100644 index 000000000..678bd43bb --- /dev/null +++ b/tests/data/parser/parseLock1.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:43:"LOCK TABLES table1 AS `t1` READ LOCAL;";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:43:"LOCK TABLES table1 AS `t1` READ LOCAL;";s:3:"len";i:43;s:4:"last";i:43;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:15:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"LOCK";s:5:"value";s:4:"LOCK";s:7:"keyword";s:4:"LOCK";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:4;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"TABLES";s:5:"value";s:6:"TABLES";s:7:"keyword";s:6:"TABLES";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:5;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:11;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"table1";s:5:"value";s:6:"table1";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:14;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:20;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"AS";s:5:"value";s:2:"AS";s:7:"keyword";s:2:"AS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:21;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:23;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"`t1`";s:5:"value";s:2:"t1";s:7:"keyword";N;s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:24;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:28;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"READ";s:5:"value";s:4:"READ";s:7:"keyword";s:4:"READ";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:29;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:33;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"LOCAL";s:5:"value";s:5:"LOCAL";s:7:"keyword";s:5:"LOCAL";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:37;}i:13;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:42;}i:14;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:15;s:3:"idx";i:15;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:45:"PhpMyAdmin\SqlParser\Statements\LockStatement":5:{s:6:"locked";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Components\LockExpression":2:{s:5:"table";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:6:"table1";s:6:"column";N;s:4:"expr";s:6:"table1";s:5:"alias";s:2:"t1";s:8:"function";N;s:8:"subquery";N;}s:4:"type";s:10:"READ LOCAL";}}s:6:"isLock";b:1;s:7:"options";N;s:5:"first";i:0;s:4:"last";i:13;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}} \ No newline at end of file diff --git a/tests/data/parser/parseLock2.in b/tests/data/parser/parseLock2.in new file mode 100644 index 000000000..87407462e --- /dev/null +++ b/tests/data/parser/parseLock2.in @@ -0,0 +1 @@ +LOCK TABLES table1 AS `t1` READ; \ No newline at end of file diff --git a/tests/data/parser/parseLock2.out b/tests/data/parser/parseLock2.out new file mode 100644 index 000000000..f0fbdd9de --- /dev/null +++ b/tests/data/parser/parseLock2.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:32:"LOCK TABLES table1 AS `t1` READ;";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:32:"LOCK TABLES table1 AS `t1` READ;";s:3:"len";i:32;s:4:"last";i:32;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:13:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"LOCK";s:5:"value";s:4:"LOCK";s:7:"keyword";s:4:"LOCK";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:4;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"TABLES";s:5:"value";s:6:"TABLES";s:7:"keyword";s:6:"TABLES";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:5;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:11;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"table1";s:5:"value";s:6:"table1";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:12;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:18;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"AS";s:5:"value";s:2:"AS";s:7:"keyword";s:2:"AS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:19;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:21;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"`t1`";s:5:"value";s:2:"t1";s:7:"keyword";N;s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:22;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:26;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"READ";s:5:"value";s:4:"READ";s:7:"keyword";s:4:"READ";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:27;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:31;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:13;s:3:"idx";i:13;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:45:"PhpMyAdmin\SqlParser\Statements\LockStatement":4:{s:6:"locked";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Components\LockExpression":2:{s:5:"table";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:6:"table1";s:6:"column";N;s:4:"expr";s:6:"table1";s:5:"alias";s:2:"t1";s:8:"function";N;s:8:"subquery";N;}s:4:"type";s:4:"READ";}}s:7:"options";N;s:5:"first";i:0;s:4:"last";i:11;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}} \ No newline at end of file diff --git a/tests/data/parser/parseLock3.in b/tests/data/parser/parseLock3.in new file mode 100644 index 000000000..4d57f17ce --- /dev/null +++ b/tests/data/parser/parseLock3.in @@ -0,0 +1 @@ +LOCK TABLES table1 AS `t1` LOW_PRIORITY WRITE; \ No newline at end of file diff --git a/tests/data/parser/parseLock3.out b/tests/data/parser/parseLock3.out new file mode 100644 index 000000000..d49f6185b --- /dev/null +++ b/tests/data/parser/parseLock3.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:46:"LOCK TABLES table1 AS `t1` LOW_PRIORITY WRITE;";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:46:"LOCK TABLES table1 AS `t1` LOW_PRIORITY WRITE;";s:3:"len";i:46;s:4:"last";i:46;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:15:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"LOCK";s:5:"value";s:4:"LOCK";s:7:"keyword";s:4:"LOCK";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:4;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"TABLES";s:5:"value";s:6:"TABLES";s:7:"keyword";s:6:"TABLES";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:5;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:11;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"table1";s:5:"value";s:6:"table1";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:12;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:18;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"AS";s:5:"value";s:2:"AS";s:7:"keyword";s:2:"AS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:19;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:21;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"`t1`";s:5:"value";s:2:"t1";s:7:"keyword";N;s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:22;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:26;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:12:"LOW_PRIORITY";s:5:"value";s:12:"LOW_PRIORITY";s:7:"keyword";s:12:"LOW_PRIORITY";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:27;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:39;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"WRITE";s:5:"value";s:5:"WRITE";s:7:"keyword";s:5:"WRITE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:40;}i:13;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:45;}i:14;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:15;s:3:"idx";i:15;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:45:"PhpMyAdmin\SqlParser\Statements\LockStatement":4:{s:6:"locked";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Components\LockExpression":2:{s:5:"table";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:6:"table1";s:6:"column";N;s:4:"expr";s:6:"table1";s:5:"alias";s:2:"t1";s:8:"function";N;s:8:"subquery";N;}s:4:"type";s:18:"LOW_PRIORITY WRITE";}}s:7:"options";N;s:5:"first";i:0;s:4:"last";i:13;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}} \ No newline at end of file diff --git a/tests/data/parser/parseLock4.in b/tests/data/parser/parseLock4.in new file mode 100644 index 000000000..dd99683e0 --- /dev/null +++ b/tests/data/parser/parseLock4.in @@ -0,0 +1 @@ +LOCK TABLES table1 AS `t1` WRITE; \ No newline at end of file diff --git a/tests/data/parser/parseLock4.out b/tests/data/parser/parseLock4.out new file mode 100644 index 000000000..1a8a7456a --- /dev/null +++ b/tests/data/parser/parseLock4.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:33:"LOCK TABLES table1 AS `t1` WRITE;";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:33:"LOCK TABLES table1 AS `t1` WRITE;";s:3:"len";i:33;s:4:"last";i:33;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:13:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"LOCK";s:5:"value";s:4:"LOCK";s:7:"keyword";s:4:"LOCK";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:4;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"TABLES";s:5:"value";s:6:"TABLES";s:7:"keyword";s:6:"TABLES";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:5;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:11;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"table1";s:5:"value";s:6:"table1";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:12;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:18;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"AS";s:5:"value";s:2:"AS";s:7:"keyword";s:2:"AS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:19;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:21;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"`t1`";s:5:"value";s:2:"t1";s:7:"keyword";N;s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:22;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:26;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"WRITE";s:5:"value";s:5:"WRITE";s:7:"keyword";s:5:"WRITE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:27;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:32;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:13;s:3:"idx";i:13;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:45:"PhpMyAdmin\SqlParser\Statements\LockStatement":4:{s:6:"locked";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Components\LockExpression":2:{s:5:"table";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:6:"table1";s:6:"column";N;s:4:"expr";s:6:"table1";s:5:"alias";s:2:"t1";s:8:"function";N;s:8:"subquery";N;}s:4:"type";s:5:"WRITE";}}s:7:"options";N;s:5:"first";i:0;s:4:"last";i:11;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}} \ No newline at end of file diff --git a/tests/data/parser/parseLock5.in b/tests/data/parser/parseLock5.in new file mode 100644 index 000000000..bc8729148 --- /dev/null +++ b/tests/data/parser/parseLock5.in @@ -0,0 +1 @@ +LOCK TABLES table1 AS `t1` READ LOCAL, table2 AS `t2` WRITE; \ No newline at end of file diff --git a/tests/data/parser/parseLock5.out b/tests/data/parser/parseLock5.out new file mode 100644 index 000000000..861862f9d --- /dev/null +++ b/tests/data/parser/parseLock5.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:60:"LOCK TABLES table1 AS `t1` READ LOCAL, table2 AS `t2` WRITE;";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:60:"LOCK TABLES table1 AS `t1` READ LOCAL, table2 AS `t2` WRITE;";s:3:"len";i:60;s:4:"last";i:60;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:24:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"LOCK";s:5:"value";s:4:"LOCK";s:7:"keyword";s:4:"LOCK";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:4;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"TABLES";s:5:"value";s:6:"TABLES";s:7:"keyword";s:6:"TABLES";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:5;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:11;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"table1";s:5:"value";s:6:"table1";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:12;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:18;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"AS";s:5:"value";s:2:"AS";s:7:"keyword";s:2:"AS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:19;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:21;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"`t1`";s:5:"value";s:2:"t1";s:7:"keyword";N;s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:22;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:26;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"READ";s:5:"value";s:4:"READ";s:7:"keyword";s:4:"READ";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:27;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:31;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"LOCAL";s:5:"value";s:5:"LOCAL";s:7:"keyword";s:5:"LOCAL";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:32;}i:13;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:",";s:5:"value";s:1:",";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:37;}i:14;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:38;}i:15;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"table2";s:5:"value";s:6:"table2";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:39;}i:16;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:45;}i:17;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"AS";s:5:"value";s:2:"AS";s:7:"keyword";s:2:"AS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:46;}i:18;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:48;}i:19;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"`t2`";s:5:"value";s:2:"t2";s:7:"keyword";N;s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:49;}i:20;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:53;}i:21;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"WRITE";s:5:"value";s:5:"WRITE";s:7:"keyword";s:5:"WRITE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:54;}i:22;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:59;}i:23;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:24;s:3:"idx";i:24;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:45:"PhpMyAdmin\SqlParser\Statements\LockStatement":4:{s:6:"locked";a:2:{i:0;O:46:"PhpMyAdmin\SqlParser\Components\LockExpression":2:{s:5:"table";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:6:"table1";s:6:"column";N;s:4:"expr";s:6:"table1";s:5:"alias";s:2:"t1";s:8:"function";N;s:8:"subquery";N;}s:4:"type";s:10:"READ LOCAL";}i:1;O:46:"PhpMyAdmin\SqlParser\Components\LockExpression":2:{s:5:"table";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:6:"table2";s:6:"column";N;s:4:"expr";s:6:"table2";s:5:"alias";s:2:"t2";s:8:"function";N;s:8:"subquery";N;}s:4:"type";s:5:"WRITE";}}s:7:"options";N;s:5:"first";i:0;s:4:"last";i:22;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}} \ No newline at end of file diff --git a/tests/data/parser/parseLock6.in b/tests/data/parser/parseLock6.in new file mode 100644 index 000000000..9f6934652 --- /dev/null +++ b/tests/data/parser/parseLock6.in @@ -0,0 +1 @@ +LOCK TABLES table1 READ LOCAL, table2 AS `t2` WRITE; \ No newline at end of file diff --git a/tests/data/parser/parseLock6.out b/tests/data/parser/parseLock6.out new file mode 100644 index 000000000..60c9ec294 --- /dev/null +++ b/tests/data/parser/parseLock6.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:52:"LOCK TABLES table1 READ LOCAL, table2 AS `t2` WRITE;";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:52:"LOCK TABLES table1 READ LOCAL, table2 AS `t2` WRITE;";s:3:"len";i:52;s:4:"last";i:52;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:20:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"LOCK";s:5:"value";s:4:"LOCK";s:7:"keyword";s:4:"LOCK";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:4;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"TABLES";s:5:"value";s:6:"TABLES";s:7:"keyword";s:6:"TABLES";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:5;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:11;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"table1";s:5:"value";s:6:"table1";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:12;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:18;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"READ";s:5:"value";s:4:"READ";s:7:"keyword";s:4:"READ";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:19;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:23;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"LOCAL";s:5:"value";s:5:"LOCAL";s:7:"keyword";s:5:"LOCAL";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:24;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:",";s:5:"value";s:1:",";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:29;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:30;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"table2";s:5:"value";s:6:"table2";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:31;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:37;}i:13;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"AS";s:5:"value";s:2:"AS";s:7:"keyword";s:2:"AS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:38;}i:14;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:40;}i:15;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"`t2`";s:5:"value";s:2:"t2";s:7:"keyword";N;s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:41;}i:16;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:45;}i:17;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"WRITE";s:5:"value";s:5:"WRITE";s:7:"keyword";s:5:"WRITE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:46;}i:18;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:51;}i:19;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:20;s:3:"idx";i:20;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:45:"PhpMyAdmin\SqlParser\Statements\LockStatement":4:{s:6:"locked";a:2:{i:0;O:46:"PhpMyAdmin\SqlParser\Components\LockExpression":2:{s:5:"table";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:6:"table1";s:6:"column";N;s:4:"expr";s:6:"table1";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:4:"type";s:10:"READ LOCAL";}i:1;O:46:"PhpMyAdmin\SqlParser\Components\LockExpression":2:{s:5:"table";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:6:"table2";s:6:"column";N;s:4:"expr";s:6:"table2";s:5:"alias";s:2:"t2";s:8:"function";N;s:8:"subquery";N;}s:4:"type";s:5:"WRITE";}}s:7:"options";N;s:5:"first";i:0;s:4:"last";i:18;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}} \ No newline at end of file diff --git a/tests/data/parser/parseLockErr1.in b/tests/data/parser/parseLockErr1.in new file mode 100644 index 000000000..7eed140b1 --- /dev/null +++ b/tests/data/parser/parseLockErr1.in @@ -0,0 +1 @@ +LOCK TABLES table1 \ No newline at end of file diff --git a/tests/data/parser/parseLockErr1.out b/tests/data/parser/parseLockErr1.out new file mode 100644 index 000000000..0ac8601b6 --- /dev/null +++ b/tests/data/parser/parseLockErr1.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:18:"LOCK TABLES table1";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:18:"LOCK TABLES table1";s:3:"len";i:18;s:4:"last";i:18;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:6:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"LOCK";s:5:"value";s:4:"LOCK";s:7:"keyword";s:4:"LOCK";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:4;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"TABLES";s:5:"value";s:6:"TABLES";s:7:"keyword";s:6:"TABLES";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:5;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:11;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"table1";s:5:"value";s:6:"table1";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:12;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:6;s:3:"idx";i:6;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:45:"PhpMyAdmin\SqlParser\Statements\LockStatement":4:{s:6:"locked";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Components\LockExpression":2:{s:5:"table";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:6:"table1";s:6:"column";N;s:4:"expr";s:6:"table1";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:4:"type";N;}}s:7:"options";N;s:5:"first";i:0;s:4:"last";i:5;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:1:{i:0;a:3:{i:0;s:34:"Unexpected end of LOCK expression.";i:1;r:37;i:2;i:0;}}}} \ No newline at end of file diff --git a/tests/data/parser/parseLockErr10.in b/tests/data/parser/parseLockErr10.in new file mode 100644 index 000000000..5fbeff7cb --- /dev/null +++ b/tests/data/parser/parseLockErr10.in @@ -0,0 +1 @@ +LOCK TABLES table1 AS table1 LOW_PRIORITY WRITE abc \ No newline at end of file diff --git a/tests/data/parser/parseLockErr10.out b/tests/data/parser/parseLockErr10.out new file mode 100644 index 000000000..215a872ff --- /dev/null +++ b/tests/data/parser/parseLockErr10.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:51:"LOCK TABLES table1 AS table1 LOW_PRIORITY WRITE abc";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:51:"LOCK TABLES table1 AS table1 LOW_PRIORITY WRITE abc";s:3:"len";i:51;s:4:"last";i:51;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:16:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"LOCK";s:5:"value";s:4:"LOCK";s:7:"keyword";s:4:"LOCK";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:4;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"TABLES";s:5:"value";s:6:"TABLES";s:7:"keyword";s:6:"TABLES";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:5;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:11;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"table1";s:5:"value";s:6:"table1";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:12;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:18;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"AS";s:5:"value";s:2:"AS";s:7:"keyword";s:2:"AS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:19;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:21;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"table1";s:5:"value";s:6:"table1";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:22;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:28;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:12:"LOW_PRIORITY";s:5:"value";s:12:"LOW_PRIORITY";s:7:"keyword";s:12:"LOW_PRIORITY";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:29;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:41;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"WRITE";s:5:"value";s:5:"WRITE";s:7:"keyword";s:5:"WRITE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:42;}i:13;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:47;}i:14;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"abc";s:5:"value";s:3:"abc";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:48;}i:15;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:16;s:3:"idx";i:16;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:45:"PhpMyAdmin\SqlParser\Statements\LockStatement":5:{s:6:"locked";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Components\LockExpression":2:{s:5:"table";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:6:"table1";s:6:"column";N;s:4:"expr";s:6:"table1";s:5:"alias";s:6:"table1";s:8:"function";N;s:8:"subquery";N;}s:4:"type";s:18:"LOW_PRIORITY WRITE";}}s:6:"isLock";b:1;s:7:"options";N;s:5:"first";i:0;s:4:"last";i:15;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:1:{i:0;a:3:{i:0;s:17:"Unexpected token.";i:1;r:107;i:2;i:0;}}}} \ No newline at end of file diff --git a/tests/data/parser/parseLockErr2.in b/tests/data/parser/parseLockErr2.in new file mode 100644 index 000000000..df0081f2c --- /dev/null +++ b/tests/data/parser/parseLockErr2.in @@ -0,0 +1 @@ +LOCK TABLES table1 AS `t1` LOCAL \ No newline at end of file diff --git a/tests/data/parser/parseLockErr2.out b/tests/data/parser/parseLockErr2.out new file mode 100644 index 000000000..7df1eae37 --- /dev/null +++ b/tests/data/parser/parseLockErr2.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:32:"LOCK TABLES table1 AS `t1` LOCAL";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:32:"LOCK TABLES table1 AS `t1` LOCAL";s:3:"len";i:32;s:4:"last";i:32;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:12:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"LOCK";s:5:"value";s:4:"LOCK";s:7:"keyword";s:4:"LOCK";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:4;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"TABLES";s:5:"value";s:6:"TABLES";s:7:"keyword";s:6:"TABLES";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:5;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:11;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"table1";s:5:"value";s:6:"table1";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:12;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:18;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"AS";s:5:"value";s:2:"AS";s:7:"keyword";s:2:"AS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:19;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:21;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"`t1`";s:5:"value";s:2:"t1";s:7:"keyword";N;s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:22;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:26;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"LOCAL";s:5:"value";s:5:"LOCAL";s:7:"keyword";s:5:"LOCAL";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:27;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:12;s:3:"idx";i:12;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:45:"PhpMyAdmin\SqlParser\Statements\LockStatement":4:{s:6:"locked";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Components\LockExpression":2:{s:5:"table";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:6:"table1";s:6:"column";N;s:4:"expr";s:6:"table1";s:5:"alias";s:2:"t1";s:8:"function";N;s:8:"subquery";N;}s:4:"type";s:0:"";}}s:7:"options";N;s:5:"first";i:0;s:4:"last";i:11;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:2:{i:0;a:3:{i:0;s:19:"Unexpected keyword.";i:1;r:79;i:2;i:0;}i:1;a:3:{i:0;s:34:"Unexpected end of Lock expression.";i:1;N;i:2;i:0;}}}} \ No newline at end of file diff --git a/tests/data/parser/parseLockErr3.in b/tests/data/parser/parseLockErr3.in new file mode 100644 index 000000000..b779b587e --- /dev/null +++ b/tests/data/parser/parseLockErr3.in @@ -0,0 +1,2 @@ +-- TABLES misspelled +LOCK TABLE table1 AS t1 READ \ No newline at end of file diff --git a/tests/data/parser/parseLockErr3.out b/tests/data/parser/parseLockErr3.out new file mode 100644 index 000000000..46c59def1 --- /dev/null +++ b/tests/data/parser/parseLockErr3.out @@ -0,0 +1,4 @@ +a:4:{s:5:"query";s:49:"-- TABLES misspelled +LOCK TABLE table1 AS t1 READ";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:49:"-- TABLES misspelled +LOCK TABLE table1 AS t1 READ";s:3:"len";i:49;s:4:"last";i:49;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:14:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:20:"-- TABLES misspelled";s:5:"value";s:20:"-- TABLES misspelled";s:7:"keyword";N;s:4:"type";i:4;s:5:"flags";i:4;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" +";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:20;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"LOCK";s:5:"value";s:4:"LOCK";s:7:"keyword";s:4:"LOCK";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:21;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:25;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"TABLE";s:5:"value";s:5:"TABLE";s:7:"keyword";s:5:"TABLE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:26;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:31;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"table1";s:5:"value";s:6:"table1";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:32;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:38;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"AS";s:5:"value";s:2:"AS";s:7:"keyword";s:2:"AS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:39;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:41;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"t1";s:5:"value";s:2:"t1";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:42;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:44;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"READ";s:5:"value";s:4:"READ";s:7:"keyword";s:4:"READ";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:45;}i:13;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:14;s:3:"idx";i:15;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:45:"PhpMyAdmin\SqlParser\Statements\LockStatement":4:{s:6:"locked";a:0:{}s:7:"options";N;s:5:"first";i:0;s:4:"last";i:4;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:3:{i:0;a:3:{i:0;s:19:"Unexpected keyword.";i:1;r:37;i:2;i:0;}i:1;a:3:{i:0;s:34:"Unexpected beginning of statement.";i:1;r:51;i:2;i:0;}i:2;a:3:{i:0;s:28:"Unrecognized statement type.";i:1;r:65;i:2;i:0;}}}} \ No newline at end of file diff --git a/tests/data/parser/parseLockErr4.in b/tests/data/parser/parseLockErr4.in new file mode 100644 index 000000000..9fe5811a9 --- /dev/null +++ b/tests/data/parser/parseLockErr4.in @@ -0,0 +1,2 @@ +-- missing TABLES keyword +LOCK table1 READ LOCAL \ No newline at end of file diff --git a/tests/data/parser/parseLockErr4.out b/tests/data/parser/parseLockErr4.out new file mode 100644 index 000000000..865c3092f --- /dev/null +++ b/tests/data/parser/parseLockErr4.out @@ -0,0 +1,4 @@ +a:4:{s:5:"query";s:48:"-- missing TABLES keyword +LOCK table1 READ LOCAL";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:48:"-- missing TABLES keyword +LOCK table1 READ LOCAL";s:3:"len";i:48;s:4:"last";i:48;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:10:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:25:"-- missing TABLES keyword";s:5:"value";s:25:"-- missing TABLES keyword";s:7:"keyword";N;s:4:"type";i:4;s:5:"flags";i:4;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" +";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:25;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"LOCK";s:5:"value";s:4:"LOCK";s:7:"keyword";s:4:"LOCK";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:26;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:30;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"table1";s:5:"value";s:6:"table1";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:31;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:37;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"READ";s:5:"value";s:4:"READ";s:7:"keyword";s:4:"READ";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:38;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:42;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"LOCAL";s:5:"value";s:5:"LOCAL";s:7:"keyword";s:5:"LOCAL";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:43;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:10;s:3:"idx";i:11;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:45:"PhpMyAdmin\SqlParser\Statements\LockStatement":4:{s:6:"locked";a:0:{}s:7:"options";N;s:5:"first";i:0;s:4:"last";i:4;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:2:{i:0;a:3:{i:0;s:17:"Unexpected token.";i:1;r:37;i:2;i:0;}i:1;a:3:{i:0;s:28:"Unrecognized statement type.";i:1;r:51;i:2;i:0;}}}} \ No newline at end of file diff --git a/tests/data/parser/parseLockErr5.in b/tests/data/parser/parseLockErr5.in new file mode 100644 index 000000000..373754037 --- /dev/null +++ b/tests/data/parser/parseLockErr5.in @@ -0,0 +1,2 @@ +-- extraneous comma +LOCK TABLES table1 READ LOCAL, \ No newline at end of file diff --git a/tests/data/parser/parseLockErr5.out b/tests/data/parser/parseLockErr5.out new file mode 100644 index 000000000..7c35cadd0 --- /dev/null +++ b/tests/data/parser/parseLockErr5.out @@ -0,0 +1,4 @@ +a:4:{s:5:"query";s:50:"-- extraneous comma +LOCK TABLES table1 READ LOCAL,";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:50:"-- extraneous comma +LOCK TABLES table1 READ LOCAL,";s:3:"len";i:50;s:4:"last";i:50;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:13:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:19:"-- extraneous comma";s:5:"value";s:19:"-- extraneous comma";s:7:"keyword";N;s:4:"type";i:4;s:5:"flags";i:4;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" +";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:19;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"LOCK";s:5:"value";s:4:"LOCK";s:7:"keyword";s:4:"LOCK";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:20;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:24;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"TABLES";s:5:"value";s:6:"TABLES";s:7:"keyword";s:6:"TABLES";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:25;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:31;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"table1";s:5:"value";s:6:"table1";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:32;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:38;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"READ";s:5:"value";s:4:"READ";s:7:"keyword";s:4:"READ";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:39;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:43;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"LOCAL";s:5:"value";s:5:"LOCAL";s:7:"keyword";s:5:"LOCAL";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:44;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:",";s:5:"value";s:1:",";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:49;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:13;s:3:"idx";i:13;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:45:"PhpMyAdmin\SqlParser\Statements\LockStatement":4:{s:6:"locked";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Components\LockExpression":2:{s:5:"table";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:6:"table1";s:6:"column";N;s:4:"expr";s:6:"table1";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:4:"type";s:10:"READ LOCAL";}}s:7:"options";N;s:5:"first";i:0;s:4:"last";i:12;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:1:{i:0;a:3:{i:0;s:33:"Unexpected end of LOCK statement.";i:1;r:86;i:2;i:0;}}}} \ No newline at end of file diff --git a/tests/data/parser/parseLockErr6.in b/tests/data/parser/parseLockErr6.in new file mode 100644 index 000000000..5223189ef --- /dev/null +++ b/tests/data/parser/parseLockErr6.in @@ -0,0 +1,2 @@ +-- missing lock type +LOCK TABLES table1 \ No newline at end of file diff --git a/tests/data/parser/parseLockErr6.out b/tests/data/parser/parseLockErr6.out new file mode 100644 index 000000000..bb8c1dfc6 --- /dev/null +++ b/tests/data/parser/parseLockErr6.out @@ -0,0 +1,4 @@ +a:4:{s:5:"query";s:39:"-- missing lock type +LOCK TABLES table1";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:39:"-- missing lock type +LOCK TABLES table1";s:3:"len";i:39;s:4:"last";i:39;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:8:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:20:"-- missing lock type";s:5:"value";s:20:"-- missing lock type";s:7:"keyword";N;s:4:"type";i:4;s:5:"flags";i:4;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" +";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:20;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"LOCK";s:5:"value";s:4:"LOCK";s:7:"keyword";s:4:"LOCK";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:21;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:25;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"TABLES";s:5:"value";s:6:"TABLES";s:7:"keyword";s:6:"TABLES";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:26;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:32;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"table1";s:5:"value";s:6:"table1";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:33;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:8;s:3:"idx";i:8;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:45:"PhpMyAdmin\SqlParser\Statements\LockStatement":4:{s:6:"locked";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Components\LockExpression":2:{s:5:"table";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:6:"table1";s:6:"column";N;s:4:"expr";s:6:"table1";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:4:"type";N;}}s:7:"options";N;s:5:"first";i:0;s:4:"last";i:7;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:1:{i:0;a:3:{i:0;s:34:"Unexpected end of LOCK expression.";i:1;r:51;i:2;i:0;}}}} \ No newline at end of file diff --git a/tests/data/parser/parseLockErr7.in b/tests/data/parser/parseLockErr7.in new file mode 100644 index 000000000..324343a8e --- /dev/null +++ b/tests/data/parser/parseLockErr7.in @@ -0,0 +1 @@ +LOCK TABLES table1 AS table1 non_keyword \ No newline at end of file diff --git a/tests/data/parser/parseLockErr7.out b/tests/data/parser/parseLockErr7.out new file mode 100644 index 000000000..61e4d99db --- /dev/null +++ b/tests/data/parser/parseLockErr7.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:40:"LOCK TABLES table1 AS table1 non_keyword";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:40:"LOCK TABLES table1 AS table1 non_keyword";s:3:"len";i:40;s:4:"last";i:40;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:12:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"LOCK";s:5:"value";s:4:"LOCK";s:7:"keyword";s:4:"LOCK";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:4;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"TABLES";s:5:"value";s:6:"TABLES";s:7:"keyword";s:6:"TABLES";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:5;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:11;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"table1";s:5:"value";s:6:"table1";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:12;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:18;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"AS";s:5:"value";s:2:"AS";s:7:"keyword";s:2:"AS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:19;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:21;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"table1";s:5:"value";s:6:"table1";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:22;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:28;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:11:"non_keyword";s:5:"value";s:11:"non_keyword";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:29;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:12;s:3:"idx";i:12;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:45:"PhpMyAdmin\SqlParser\Statements\LockStatement":4:{s:6:"locked";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Components\LockExpression":2:{s:5:"table";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:6:"table1";s:6:"column";N;s:4:"expr";s:6:"table1";s:5:"alias";s:6:"table1";s:8:"function";N;s:8:"subquery";N;}s:4:"type";s:0:"";}}s:7:"options";N;s:5:"first";i:0;s:4:"last";i:11;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:3:{i:0;a:3:{i:0;s:30:"An alias was previously found.";i:1;r:79;i:2;i:0;}i:1;a:3:{i:0;s:17:"Unexpected token.";i:1;r:79;i:2;i:0;}i:2;a:3:{i:0;s:34:"Unexpected end of Lock expression.";i:1;N;i:2;i:0;}}}} \ No newline at end of file diff --git a/tests/data/parser/parseLockErr8.in b/tests/data/parser/parseLockErr8.in new file mode 100644 index 000000000..052824d47 --- /dev/null +++ b/tests/data/parser/parseLockErr8.in @@ -0,0 +1 @@ +LOCK TABLES table1 AS table1 READ AUTO_INCREMENT \ No newline at end of file diff --git a/tests/data/parser/parseLockErr8.out b/tests/data/parser/parseLockErr8.out new file mode 100644 index 000000000..e37ca06bc --- /dev/null +++ b/tests/data/parser/parseLockErr8.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:48:"LOCK TABLES table1 AS table1 READ AUTO_INCREMENT";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:48:"LOCK TABLES table1 AS table1 READ AUTO_INCREMENT";s:3:"len";i:48;s:4:"last";i:48;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:14:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"LOCK";s:5:"value";s:4:"LOCK";s:7:"keyword";s:4:"LOCK";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:4;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"TABLES";s:5:"value";s:6:"TABLES";s:7:"keyword";s:6:"TABLES";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:5;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:11;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"table1";s:5:"value";s:6:"table1";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:12;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:18;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"AS";s:5:"value";s:2:"AS";s:7:"keyword";s:2:"AS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:19;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:21;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"table1";s:5:"value";s:6:"table1";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:22;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:28;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"READ";s:5:"value";s:4:"READ";s:7:"keyword";s:4:"READ";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:29;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:33;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:14:"AUTO_INCREMENT";s:5:"value";s:14:"AUTO_INCREMENT";s:7:"keyword";s:14:"AUTO_INCREMENT";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:34;}i:13;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:14;s:3:"idx";i:14;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:45:"PhpMyAdmin\SqlParser\Statements\LockStatement":4:{s:6:"locked";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Components\LockExpression":2:{s:5:"table";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:6:"table1";s:6:"column";N;s:4:"expr";s:6:"table1";s:5:"alias";s:6:"table1";s:8:"function";N;s:8:"subquery";N;}s:4:"type";s:4:"READ";}}s:7:"options";N;s:5:"first";i:0;s:4:"last";i:13;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:1:{i:0;a:3:{i:0;s:19:"Unexpected keyword.";i:1;r:93;i:2;i:0;}}}} \ No newline at end of file diff --git a/tests/data/parser/parseLockErr9.in b/tests/data/parser/parseLockErr9.in new file mode 100644 index 000000000..e44d1dd2e --- /dev/null +++ b/tests/data/parser/parseLockErr9.in @@ -0,0 +1 @@ +LOCK TABLES table1 AS table1 LOW_PRIORITY READ \ No newline at end of file diff --git a/tests/data/parser/parseLockErr9.out b/tests/data/parser/parseLockErr9.out new file mode 100644 index 000000000..0dcc606ac --- /dev/null +++ b/tests/data/parser/parseLockErr9.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:46:"LOCK TABLES table1 AS table1 LOW_PRIORITY READ";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:46:"LOCK TABLES table1 AS table1 LOW_PRIORITY READ";s:3:"len";i:46;s:4:"last";i:46;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:14:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"LOCK";s:5:"value";s:4:"LOCK";s:7:"keyword";s:4:"LOCK";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:4;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"TABLES";s:5:"value";s:6:"TABLES";s:7:"keyword";s:6:"TABLES";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:5;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:11;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"table1";s:5:"value";s:6:"table1";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:12;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:18;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"AS";s:5:"value";s:2:"AS";s:7:"keyword";s:2:"AS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:19;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:21;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"table1";s:5:"value";s:6:"table1";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:22;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:28;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:12:"LOW_PRIORITY";s:5:"value";s:12:"LOW_PRIORITY";s:7:"keyword";s:12:"LOW_PRIORITY";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:29;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:41;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"READ";s:5:"value";s:4:"READ";s:7:"keyword";s:4:"READ";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:42;}i:13;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:14;s:3:"idx";i:14;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:45:"PhpMyAdmin\SqlParser\Statements\LockStatement":4:{s:6:"locked";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Components\LockExpression":2:{s:5:"table";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:6:"table1";s:6:"column";N;s:4:"expr";s:6:"table1";s:5:"alias";s:6:"table1";s:8:"function";N;s:8:"subquery";N;}s:4:"type";s:12:"LOW_PRIORITY";}}s:7:"options";N;s:5:"first";i:0;s:4:"last";i:13;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:2:{i:0;a:3:{i:0;s:19:"Unexpected keyword.";i:1;r:93;i:2;i:0;}i:1;a:3:{i:0;s:34:"Unexpected end of Lock expression.";i:1;r:79;i:2;i:0;}}}} \ No newline at end of file diff --git a/tests/data/parser/parsePurge.in b/tests/data/parser/parsePurge.in new file mode 100644 index 000000000..e13352298 --- /dev/null +++ b/tests/data/parser/parsePurge.in @@ -0,0 +1 @@ +PURGE BINARY LOGS TO 'mysql-bin.010'; \ No newline at end of file diff --git a/tests/data/parser/parsePurge.out b/tests/data/parser/parsePurge.out new file mode 100644 index 000000000..b21609c93 --- /dev/null +++ b/tests/data/parser/parsePurge.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:37:"PURGE BINARY LOGS TO 'mysql-bin.010';";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:37:"PURGE BINARY LOGS TO 'mysql-bin.010';";s:3:"len";i:37;s:4:"last";i:37;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:11:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"PURGE";s:5:"value";s:5:"PURGE";s:7:"keyword";s:5:"PURGE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:5;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"BINARY";s:5:"value";s:6:"BINARY";s:7:"keyword";s:6:"BINARY";s:4:"type";i:1;s:5:"flags";i:43;s:8:"position";i:6;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:12;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"LOGS";s:5:"value";s:4:"LOGS";s:7:"keyword";s:4:"LOGS";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:13;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:17;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"TO";s:5:"value";s:2:"TO";s:7:"keyword";s:2:"TO";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:18;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:20;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:15:"'mysql-bin.010'";s:5:"value";s:13:"mysql-bin.010";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:1;s:8:"position";i:21;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:36;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:11;s:3:"idx";i:11;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Statements\PurgeStatement":6:{s:8:"log_type";s:6:"BINARY";s:10:"end_option";s:2:"TO";s:8:"end_expr";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:13:"mysql-bin.010";s:4:"expr";s:15:"'mysql-bin.010'";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:7:"options";N;s:5:"first";i:0;s:4:"last";i:9;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}} \ No newline at end of file diff --git a/tests/data/parser/parsePurge2.in b/tests/data/parser/parsePurge2.in new file mode 100644 index 000000000..a09818a1a --- /dev/null +++ b/tests/data/parser/parsePurge2.in @@ -0,0 +1 @@ +PURGE BINARY LOGS BEFORE '2008-04-02 22:46:26'; \ No newline at end of file diff --git a/tests/data/parser/parsePurge2.out b/tests/data/parser/parsePurge2.out new file mode 100644 index 000000000..7175a1ec1 --- /dev/null +++ b/tests/data/parser/parsePurge2.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:47:"PURGE BINARY LOGS BEFORE '2008-04-02 22:46:26';";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:47:"PURGE BINARY LOGS BEFORE '2008-04-02 22:46:26';";s:3:"len";i:47;s:4:"last";i:47;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:11:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"PURGE";s:5:"value";s:5:"PURGE";s:7:"keyword";s:5:"PURGE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:5;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"BINARY";s:5:"value";s:6:"BINARY";s:7:"keyword";s:6:"BINARY";s:4:"type";i:1;s:5:"flags";i:43;s:8:"position";i:6;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:12;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"LOGS";s:5:"value";s:4:"LOGS";s:7:"keyword";s:4:"LOGS";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:13;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:17;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"BEFORE";s:5:"value";s:6:"BEFORE";s:7:"keyword";s:6:"BEFORE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:18;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:24;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:21:"'2008-04-02 22:46:26'";s:5:"value";s:19:"2008-04-02 22:46:26";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:1;s:8:"position";i:25;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:46;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:11;s:3:"idx";i:11;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Statements\PurgeStatement":6:{s:8:"log_type";s:6:"BINARY";s:10:"end_option";s:6:"BEFORE";s:8:"end_expr";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:19:"2008-04-02 22:46:26";s:4:"expr";s:21:"'2008-04-02 22:46:26'";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:7:"options";N;s:5:"first";i:0;s:4:"last";i:9;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}} \ No newline at end of file diff --git a/tests/data/parser/parsePurge3.in b/tests/data/parser/parsePurge3.in new file mode 100644 index 000000000..755ff2b8d --- /dev/null +++ b/tests/data/parser/parsePurge3.in @@ -0,0 +1 @@ +PURGE MASTER LOGS BEFORE '2008-04-02 22:46:26'; \ No newline at end of file diff --git a/tests/data/parser/parsePurge3.out b/tests/data/parser/parsePurge3.out new file mode 100644 index 000000000..d3543e3a3 --- /dev/null +++ b/tests/data/parser/parsePurge3.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:47:"PURGE MASTER LOGS BEFORE '2008-04-02 22:46:26';";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:47:"PURGE MASTER LOGS BEFORE '2008-04-02 22:46:26';";s:3:"len";i:47;s:4:"last";i:47;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:11:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"PURGE";s:5:"value";s:5:"PURGE";s:7:"keyword";s:5:"PURGE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:5;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"MASTER";s:5:"value";s:6:"MASTER";s:7:"keyword";s:6:"MASTER";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:6;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:12;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"LOGS";s:5:"value";s:4:"LOGS";s:7:"keyword";s:4:"LOGS";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:13;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:17;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"BEFORE";s:5:"value";s:6:"BEFORE";s:7:"keyword";s:6:"BEFORE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:18;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:24;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:21:"'2008-04-02 22:46:26'";s:5:"value";s:19:"2008-04-02 22:46:26";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:1;s:8:"position";i:25;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:46;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:11;s:3:"idx";i:11;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Statements\PurgeStatement":6:{s:8:"log_type";s:6:"MASTER";s:10:"end_option";s:6:"BEFORE";s:8:"end_expr";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:19:"2008-04-02 22:46:26";s:4:"expr";s:21:"'2008-04-02 22:46:26'";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:7:"options";N;s:5:"first";i:0;s:4:"last";i:9;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}} \ No newline at end of file diff --git a/tests/data/parser/parsePurge4.in b/tests/data/parser/parsePurge4.in new file mode 100644 index 000000000..537e269fd --- /dev/null +++ b/tests/data/parser/parsePurge4.in @@ -0,0 +1 @@ +PURGE MASTER LOGS TO 'mysql-bin.010'; \ No newline at end of file diff --git a/tests/data/parser/parsePurge4.out b/tests/data/parser/parsePurge4.out new file mode 100644 index 000000000..857de005a --- /dev/null +++ b/tests/data/parser/parsePurge4.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:37:"PURGE MASTER LOGS TO 'mysql-bin.010';";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:37:"PURGE MASTER LOGS TO 'mysql-bin.010';";s:3:"len";i:37;s:4:"last";i:37;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:11:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"PURGE";s:5:"value";s:5:"PURGE";s:7:"keyword";s:5:"PURGE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:5;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"MASTER";s:5:"value";s:6:"MASTER";s:7:"keyword";s:6:"MASTER";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:6;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:12;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"LOGS";s:5:"value";s:4:"LOGS";s:7:"keyword";s:4:"LOGS";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:13;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:17;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"TO";s:5:"value";s:2:"TO";s:7:"keyword";s:2:"TO";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:18;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:20;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:15:"'mysql-bin.010'";s:5:"value";s:13:"mysql-bin.010";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:1;s:8:"position";i:21;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:36;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:11;s:3:"idx";i:11;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Statements\PurgeStatement":6:{s:8:"log_type";s:6:"MASTER";s:10:"end_option";s:2:"TO";s:8:"end_expr";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:13:"mysql-bin.010";s:4:"expr";s:15:"'mysql-bin.010'";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:7:"options";N;s:5:"first";i:0;s:4:"last";i:9;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}} \ No newline at end of file diff --git a/tests/data/parser/parsePurgeErr.in b/tests/data/parser/parsePurgeErr.in new file mode 100644 index 000000000..8302ca73b --- /dev/null +++ b/tests/data/parser/parsePurgeErr.in @@ -0,0 +1 @@ +PURGE LOGS TO 'mysql-bin.010'; \ No newline at end of file diff --git a/tests/data/parser/parsePurgeErr.out b/tests/data/parser/parsePurgeErr.out new file mode 100644 index 000000000..0175550f1 --- /dev/null +++ b/tests/data/parser/parsePurgeErr.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:30:"PURGE LOGS TO 'mysql-bin.010';";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:30:"PURGE LOGS TO 'mysql-bin.010';";s:3:"len";i:30;s:4:"last";i:30;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:9:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"PURGE";s:5:"value";s:5:"PURGE";s:7:"keyword";s:5:"PURGE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:5;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"LOGS";s:5:"value";s:4:"LOGS";s:7:"keyword";s:4:"LOGS";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:6;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:10;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"TO";s:5:"value";s:2:"TO";s:7:"keyword";s:2:"TO";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:11;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:13;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:15:"'mysql-bin.010'";s:5:"value";s:13:"mysql-bin.010";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:1;s:8:"position";i:14;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:29;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:9;s:3:"idx";i:9;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Statements\PurgeStatement":6:{s:8:"log_type";N;s:10:"end_option";N;s:8:"end_expr";N;s:7:"options";N;s:5:"first";i:0;s:4:"last";i:7;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:4:{i:0;a:3:{i:0;s:18:"Unexpected keyword";i:1;r:23;i:2;i:0;}i:1;a:3:{i:0;s:18:"Unexpected keyword";i:1;r:37;i:2;i:0;}i:2;a:3:{i:0;s:17:"Unexpected token.";i:1;r:51;i:2;i:0;}i:3;a:3:{i:0;s:17:"Unexpected token.";i:1;r:51;i:2;i:0;}}}} \ No newline at end of file diff --git a/tests/data/parser/parsePurgeErr2.in b/tests/data/parser/parsePurgeErr2.in new file mode 100644 index 000000000..93c642b20 --- /dev/null +++ b/tests/data/parser/parsePurgeErr2.in @@ -0,0 +1 @@ +PURGE BINARY LOGS INTO; \ No newline at end of file diff --git a/tests/data/parser/parsePurgeErr2.out b/tests/data/parser/parsePurgeErr2.out new file mode 100644 index 000000000..56fa5420d --- /dev/null +++ b/tests/data/parser/parsePurgeErr2.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:23:"PURGE BINARY LOGS INTO;";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:23:"PURGE BINARY LOGS INTO;";s:3:"len";i:23;s:4:"last";i:23;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:9:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"PURGE";s:5:"value";s:5:"PURGE";s:7:"keyword";s:5:"PURGE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:5;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"BINARY";s:5:"value";s:6:"BINARY";s:7:"keyword";s:6:"BINARY";s:4:"type";i:1;s:5:"flags";i:43;s:8:"position";i:6;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:12;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"LOGS";s:5:"value";s:4:"LOGS";s:7:"keyword";s:4:"LOGS";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:13;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:17;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"INTO";s:5:"value";s:4:"INTO";s:7:"keyword";s:4:"INTO";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:18;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:22;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:9;s:3:"idx";i:9;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Statements\PurgeStatement":6:{s:8:"log_type";s:6:"BINARY";s:10:"end_option";N;s:8:"end_expr";N;s:7:"options";N;s:5:"first";i:0;s:4:"last";i:7;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:2:{i:0;a:3:{i:0;s:18:"Unexpected keyword";i:1;r:51;i:2;i:0;}i:1;a:3:{i:0;s:17:"Unexpected token.";i:1;r:51;i:2;i:0;}}}} \ No newline at end of file diff --git a/tests/data/parser/parsePurgeErr3.in b/tests/data/parser/parsePurgeErr3.in new file mode 100644 index 000000000..9c58ff6e9 --- /dev/null +++ b/tests/data/parser/parsePurgeErr3.in @@ -0,0 +1 @@ +PURGE BINARY LOGS TO 'mysql.bin' INTO; \ No newline at end of file diff --git a/tests/data/parser/parsePurgeErr3.out b/tests/data/parser/parsePurgeErr3.out new file mode 100644 index 000000000..029890789 --- /dev/null +++ b/tests/data/parser/parsePurgeErr3.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:38:"PURGE BINARY LOGS TO 'mysql.bin' INTO;";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:38:"PURGE BINARY LOGS TO 'mysql.bin' INTO;";s:3:"len";i:38;s:4:"last";i:38;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:13:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"PURGE";s:5:"value";s:5:"PURGE";s:7:"keyword";s:5:"PURGE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:5;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"BINARY";s:5:"value";s:6:"BINARY";s:7:"keyword";s:6:"BINARY";s:4:"type";i:1;s:5:"flags";i:43;s:8:"position";i:6;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:12;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"LOGS";s:5:"value";s:4:"LOGS";s:7:"keyword";s:4:"LOGS";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:13;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:17;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"TO";s:5:"value";s:2:"TO";s:7:"keyword";s:2:"TO";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:18;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:20;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:11:"'mysql.bin'";s:5:"value";s:9:"mysql.bin";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:1;s:8:"position";i:21;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:32;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"INTO";s:5:"value";s:4:"INTO";s:7:"keyword";s:4:"INTO";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:33;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:37;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:13;s:3:"idx";i:13;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Statements\PurgeStatement":6:{s:8:"log_type";s:6:"BINARY";s:10:"end_option";s:2:"TO";s:8:"end_expr";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:9:"mysql.bin";s:4:"expr";s:11:"'mysql.bin'";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:7:"options";N;s:5:"first";i:0;s:4:"last";i:11;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:2:{i:0;a:3:{i:0;s:17:"Unexpected token.";i:1;r:79;i:2;i:0;}i:1;a:3:{i:0;s:17:"Unexpected token.";i:1;r:79;i:2;i:0;}}}} \ No newline at end of file diff --git a/tests/data/parser/parseSelectCaseAlias1.in b/tests/data/parser/parseSelectCaseAlias1.in new file mode 100644 index 000000000..fe81f9d79 --- /dev/null +++ b/tests/data/parser/parseSelectCaseAlias1.in @@ -0,0 +1,2 @@ +select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name, +case /* */ when 1=1 then "Some" when 2=1 then "Other" end /* */ AS /* */ foo FROM a; \ No newline at end of file diff --git a/tests/data/parser/parseSelectCaseAlias1.out b/tests/data/parser/parseSelectCaseAlias1.out new file mode 100644 index 000000000..c7c676ad6 --- /dev/null +++ b/tests/data/parser/parseSelectCaseAlias1.out @@ -0,0 +1,4 @@ +a:4:{s:5:"query";s:166:"select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name, +case /* */ when 1=1 then "Some" when 2=1 then "Other" end /* */ AS /* */ foo FROM a;";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:166:"select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name, +case /* */ when 1=1 then "Some" when 2=1 then "Other" end /* */ AS /* */ foo FROM a;";s:3:"len";i:166;s:4:"last";i:166;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:66:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"select";s:5:"value";s:6:"SELECT";s:7:"keyword";s:6:"SELECT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:6;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:7;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"SELECT";s:5:"value";s:6:"SELECT";s:7:"keyword";s:6:"SELECT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:8;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:14;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"name";s:5:"value";s:4:"name";s:7:"keyword";s:4:"NAME";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:15;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:19;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"FROM";s:5:"value";s:4:"FROM";s:7:"keyword";s:4:"FROM";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:20;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:24;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"mysql";s:5:"value";s:5:"mysql";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:25;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:".";s:5:"value";s:1:".";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:30;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:13:"help_category";s:5:"value";s:13:"help_category";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:31;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:44;}i:13;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"WHERE";s:5:"value";s:5:"WHERE";s:7:"keyword";s:5:"WHERE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:45;}i:14;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:50;}i:15;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:16:"help_category_id";s:5:"value";s:16:"help_category_id";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:51;}i:16;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:67;}i:17;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"=";s:5:"value";s:1:"=";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:68;}i:18;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:69;}i:19;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"1";s:5:"value";i:1;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:70;}i:20;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:71;}i:21;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:72;}i:22;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"as";s:5:"value";s:2:"AS";s:7:"keyword";s:2:"AS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:73;}i:23;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:75;}i:24;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"name";s:5:"value";s:4:"name";s:7:"keyword";s:4:"NAME";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:76;}i:25;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:",";s:5:"value";s:1:",";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:80;}i:26;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" +";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:81;}i:27;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"case";s:5:"value";s:4:"CASE";s:7:"keyword";s:4:"CASE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:82;}i:28;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:86;}i:29;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"/* */";s:5:"value";s:5:"/* */";s:7:"keyword";N;s:4:"type";i:4;s:5:"flags";i:2;s:8:"position";i:87;}i:30;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:92;}i:31;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"when";s:5:"value";s:4:"WHEN";s:7:"keyword";s:4:"WHEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:93;}i:32;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:97;}i:33;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"1";s:5:"value";i:1;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:98;}i:34;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"=";s:5:"value";s:1:"=";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:99;}i:35;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"1";s:5:"value";i:1;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:100;}i:36;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:101;}i:37;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"then";s:5:"value";s:4:"THEN";s:7:"keyword";s:4:"THEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:102;}i:38;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:106;}i:39;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:""Some"";s:5:"value";s:4:"Some";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:2;s:8:"position";i:107;}i:40;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:113;}i:41;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"when";s:5:"value";s:4:"WHEN";s:7:"keyword";s:4:"WHEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:114;}i:42;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:118;}i:43;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"2";s:5:"value";i:2;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:119;}i:44;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"=";s:5:"value";s:1:"=";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:120;}i:45;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"1";s:5:"value";i:1;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:121;}i:46;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:122;}i:47;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"then";s:5:"value";s:4:"THEN";s:7:"keyword";s:4:"THEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:123;}i:48;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:127;}i:49;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:7:""Other"";s:5:"value";s:5:"Other";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:2;s:8:"position";i:128;}i:50;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:135;}i:51;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"end";s:5:"value";s:3:"end";s:7:"keyword";s:3:"END";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:136;}i:52;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:139;}i:53;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"/* */";s:5:"value";s:5:"/* */";s:7:"keyword";N;s:4:"type";i:4;s:5:"flags";i:2;s:8:"position";i:140;}i:54;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:145;}i:55;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"AS";s:5:"value";s:2:"AS";s:7:"keyword";s:2:"AS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:146;}i:56;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:148;}i:57;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"/* */";s:5:"value";s:5:"/* */";s:7:"keyword";N;s:4:"type";i:4;s:5:"flags";i:2;s:8:"position";i:149;}i:58;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:154;}i:59;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"foo";s:5:"value";s:3:"foo";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:155;}i:60;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:158;}i:61;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"FROM";s:5:"value";s:4:"FROM";s:7:"keyword";s:4:"FROM";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:159;}i:62;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:163;}i:63;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"a";s:5:"value";s:1:"a";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:164;}i:64;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:165;}i:65;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:66;s:3:"idx";i:66;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:47:"PhpMyAdmin\SqlParser\Statements\SelectStatement":16:{s:4:"expr";a:2:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:65:"(SELECT name FROM mysql.help_category WHERE help_category_id = 1)";s:5:"alias";s:4:"name";s:8:"function";N;s:8:"subquery";s:6:"SELECT";}i:1;O:46:"PhpMyAdmin\SqlParser\Components\CaseExpression":7:{s:5:"value";N;s:10:"conditions";a:2:{i:0;a:1:{i:0;O:41:"PhpMyAdmin\SqlParser\Components\Condition":3:{s:11:"identifiers";a:0:{}s:10:"isOperator";b:0;s:4:"expr";s:3:"1=1";}}i:1;a:1:{i:0;O:41:"PhpMyAdmin\SqlParser\Components\Condition":3:{s:11:"identifiers";a:0:{}s:10:"isOperator";b:0;s:4:"expr";s:3:"2=1";}}}s:7:"results";a:2:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:4:"Some";s:4:"expr";s:6:""Some"";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}i:1;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:5:"Other";s:4:"expr";s:7:""Other"";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:14:"compare_values";N;s:11:"else_result";N;s:5:"alias";s:3:"foo";s:4:"expr";s:60:"CASE WHEN 1=1 THEN "Some" WHEN 2=1 THEN "Other" END AS `foo`";}}s:4:"from";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:1:"a";s:6:"column";N;s:4:"expr";s:1:"a";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:9:"partition";N;s:5:"where";N;s:5:"group";N;s:6:"having";N;s:5:"order";N;s:5:"limit";N;s:9:"procedure";N;s:4:"into";N;s:4:"join";N;s:5:"union";a:0:{}s:11:"end_options";N;s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}s:5:"first";i:0;s:4:"last";i:63;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}} \ No newline at end of file diff --git a/tests/data/parser/parseSelectCaseAlias2.in b/tests/data/parser/parseSelectCaseAlias2.in new file mode 100644 index 000000000..1288173e9 --- /dev/null +++ b/tests/data/parser/parseSelectCaseAlias2.in @@ -0,0 +1,2 @@ +select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name, +case /* */ when 1=1 then "Some" when 2=1 then "Other" end /* */ foo FROM a; \ No newline at end of file diff --git a/tests/data/parser/parseSelectCaseAlias2.out b/tests/data/parser/parseSelectCaseAlias2.out new file mode 100644 index 000000000..bffcaadf9 --- /dev/null +++ b/tests/data/parser/parseSelectCaseAlias2.out @@ -0,0 +1,4 @@ +a:4:{s:5:"query";s:157:"select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name, +case /* */ when 1=1 then "Some" when 2=1 then "Other" end /* */ foo FROM a;";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:157:"select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name, +case /* */ when 1=1 then "Some" when 2=1 then "Other" end /* */ foo FROM a;";s:3:"len";i:157;s:4:"last";i:157;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:62:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"select";s:5:"value";s:6:"SELECT";s:7:"keyword";s:6:"SELECT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:6;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:7;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"SELECT";s:5:"value";s:6:"SELECT";s:7:"keyword";s:6:"SELECT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:8;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:14;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"name";s:5:"value";s:4:"name";s:7:"keyword";s:4:"NAME";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:15;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:19;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"FROM";s:5:"value";s:4:"FROM";s:7:"keyword";s:4:"FROM";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:20;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:24;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"mysql";s:5:"value";s:5:"mysql";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:25;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:".";s:5:"value";s:1:".";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:30;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:13:"help_category";s:5:"value";s:13:"help_category";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:31;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:44;}i:13;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"WHERE";s:5:"value";s:5:"WHERE";s:7:"keyword";s:5:"WHERE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:45;}i:14;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:50;}i:15;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:16:"help_category_id";s:5:"value";s:16:"help_category_id";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:51;}i:16;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:67;}i:17;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"=";s:5:"value";s:1:"=";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:68;}i:18;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:69;}i:19;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"1";s:5:"value";i:1;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:70;}i:20;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:71;}i:21;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:72;}i:22;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"as";s:5:"value";s:2:"AS";s:7:"keyword";s:2:"AS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:73;}i:23;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:75;}i:24;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"name";s:5:"value";s:4:"name";s:7:"keyword";s:4:"NAME";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:76;}i:25;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:",";s:5:"value";s:1:",";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:80;}i:26;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" +";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:81;}i:27;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"case";s:5:"value";s:4:"CASE";s:7:"keyword";s:4:"CASE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:82;}i:28;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:86;}i:29;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"/* */";s:5:"value";s:5:"/* */";s:7:"keyword";N;s:4:"type";i:4;s:5:"flags";i:2;s:8:"position";i:87;}i:30;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:92;}i:31;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"when";s:5:"value";s:4:"WHEN";s:7:"keyword";s:4:"WHEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:93;}i:32;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:97;}i:33;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"1";s:5:"value";i:1;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:98;}i:34;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"=";s:5:"value";s:1:"=";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:99;}i:35;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"1";s:5:"value";i:1;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:100;}i:36;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:101;}i:37;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"then";s:5:"value";s:4:"THEN";s:7:"keyword";s:4:"THEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:102;}i:38;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:106;}i:39;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:""Some"";s:5:"value";s:4:"Some";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:2;s:8:"position";i:107;}i:40;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:113;}i:41;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"when";s:5:"value";s:4:"WHEN";s:7:"keyword";s:4:"WHEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:114;}i:42;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:118;}i:43;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"2";s:5:"value";i:2;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:119;}i:44;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"=";s:5:"value";s:1:"=";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:120;}i:45;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"1";s:5:"value";i:1;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:121;}i:46;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:122;}i:47;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"then";s:5:"value";s:4:"THEN";s:7:"keyword";s:4:"THEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:123;}i:48;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:127;}i:49;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:7:""Other"";s:5:"value";s:5:"Other";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:2;s:8:"position";i:128;}i:50;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:135;}i:51;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"end";s:5:"value";s:3:"end";s:7:"keyword";s:3:"END";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:136;}i:52;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:139;}i:53;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"/* */";s:5:"value";s:5:"/* */";s:7:"keyword";N;s:4:"type";i:4;s:5:"flags";i:2;s:8:"position";i:140;}i:54;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:145;}i:55;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"foo";s:5:"value";s:3:"foo";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:146;}i:56;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:149;}i:57;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"FROM";s:5:"value";s:4:"FROM";s:7:"keyword";s:4:"FROM";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:150;}i:58;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:154;}i:59;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"a";s:5:"value";s:1:"a";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:155;}i:60;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:156;}i:61;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:62;s:3:"idx";i:62;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:47:"PhpMyAdmin\SqlParser\Statements\SelectStatement":16:{s:4:"expr";a:2:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:65:"(SELECT name FROM mysql.help_category WHERE help_category_id = 1)";s:5:"alias";s:4:"name";s:8:"function";N;s:8:"subquery";s:6:"SELECT";}i:1;O:46:"PhpMyAdmin\SqlParser\Components\CaseExpression":7:{s:5:"value";N;s:10:"conditions";a:2:{i:0;a:1:{i:0;O:41:"PhpMyAdmin\SqlParser\Components\Condition":3:{s:11:"identifiers";a:0:{}s:10:"isOperator";b:0;s:4:"expr";s:3:"1=1";}}i:1;a:1:{i:0;O:41:"PhpMyAdmin\SqlParser\Components\Condition":3:{s:11:"identifiers";a:0:{}s:10:"isOperator";b:0;s:4:"expr";s:3:"2=1";}}}s:7:"results";a:2:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:4:"Some";s:4:"expr";s:6:""Some"";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}i:1;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:5:"Other";s:4:"expr";s:7:""Other"";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:14:"compare_values";N;s:11:"else_result";N;s:5:"alias";s:3:"foo";s:4:"expr";s:60:"CASE WHEN 1=1 THEN "Some" WHEN 2=1 THEN "Other" END AS `foo`";}}s:4:"from";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:1:"a";s:6:"column";N;s:4:"expr";s:1:"a";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:9:"partition";N;s:5:"where";N;s:5:"group";N;s:6:"having";N;s:5:"order";N;s:5:"limit";N;s:9:"procedure";N;s:4:"into";N;s:4:"join";N;s:5:"union";a:0:{}s:11:"end_options";N;s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}s:5:"first";i:0;s:4:"last";i:59;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}} \ No newline at end of file diff --git a/tests/data/parser/parseSelectCaseAlias3.in b/tests/data/parser/parseSelectCaseAlias3.in new file mode 100644 index 000000000..2da0fe86f --- /dev/null +++ b/tests/data/parser/parseSelectCaseAlias3.in @@ -0,0 +1,2 @@ +select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name, +test=case 1 /* */ when 1 then "Some" when 2 then "Other" end /* */ AS /* */ foo FROM a; \ No newline at end of file diff --git a/tests/data/parser/parseSelectCaseAlias3.out b/tests/data/parser/parseSelectCaseAlias3.out new file mode 100644 index 000000000..8bbf030ed --- /dev/null +++ b/tests/data/parser/parseSelectCaseAlias3.out @@ -0,0 +1,4 @@ +a:4:{s:5:"query";s:169:"select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name, +test=case 1 /* */ when 1 then "Some" when 2 then "Other" end /* */ AS /* */ foo FROM a;";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:169:"select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name, +test=case 1 /* */ when 1 then "Some" when 2 then "Other" end /* */ AS /* */ foo FROM a;";s:3:"len";i:169;s:4:"last";i:169;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:66:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"select";s:5:"value";s:6:"SELECT";s:7:"keyword";s:6:"SELECT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:6;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:7;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"SELECT";s:5:"value";s:6:"SELECT";s:7:"keyword";s:6:"SELECT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:8;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:14;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"name";s:5:"value";s:4:"name";s:7:"keyword";s:4:"NAME";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:15;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:19;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"FROM";s:5:"value";s:4:"FROM";s:7:"keyword";s:4:"FROM";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:20;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:24;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"mysql";s:5:"value";s:5:"mysql";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:25;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:".";s:5:"value";s:1:".";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:30;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:13:"help_category";s:5:"value";s:13:"help_category";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:31;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:44;}i:13;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"WHERE";s:5:"value";s:5:"WHERE";s:7:"keyword";s:5:"WHERE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:45;}i:14;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:50;}i:15;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:16:"help_category_id";s:5:"value";s:16:"help_category_id";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:51;}i:16;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:67;}i:17;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"=";s:5:"value";s:1:"=";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:68;}i:18;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:69;}i:19;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"1";s:5:"value";i:1;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:70;}i:20;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:71;}i:21;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:72;}i:22;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"as";s:5:"value";s:2:"AS";s:7:"keyword";s:2:"AS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:73;}i:23;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:75;}i:24;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"name";s:5:"value";s:4:"name";s:7:"keyword";s:4:"NAME";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:76;}i:25;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:",";s:5:"value";s:1:",";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:80;}i:26;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" +";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:81;}i:27;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"test";s:5:"value";s:4:"test";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:82;}i:28;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"=";s:5:"value";s:1:"=";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:86;}i:29;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"case";s:5:"value";s:4:"CASE";s:7:"keyword";s:4:"CASE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:87;}i:30;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:91;}i:31;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"1";s:5:"value";i:1;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:92;}i:32;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:93;}i:33;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"/* */";s:5:"value";s:5:"/* */";s:7:"keyword";N;s:4:"type";i:4;s:5:"flags";i:2;s:8:"position";i:94;}i:34;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:99;}i:35;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"when";s:5:"value";s:4:"WHEN";s:7:"keyword";s:4:"WHEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:100;}i:36;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:104;}i:37;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"1";s:5:"value";i:1;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:105;}i:38;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:106;}i:39;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"then";s:5:"value";s:4:"THEN";s:7:"keyword";s:4:"THEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:107;}i:40;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:111;}i:41;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:""Some"";s:5:"value";s:4:"Some";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:2;s:8:"position";i:112;}i:42;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:118;}i:43;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"when";s:5:"value";s:4:"WHEN";s:7:"keyword";s:4:"WHEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:119;}i:44;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:123;}i:45;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"2";s:5:"value";i:2;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:124;}i:46;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:125;}i:47;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"then";s:5:"value";s:4:"THEN";s:7:"keyword";s:4:"THEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:126;}i:48;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:130;}i:49;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:7:""Other"";s:5:"value";s:5:"Other";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:2;s:8:"position";i:131;}i:50;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:138;}i:51;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"end";s:5:"value";s:3:"end";s:7:"keyword";s:3:"END";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:139;}i:52;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:142;}i:53;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"/* */";s:5:"value";s:5:"/* */";s:7:"keyword";N;s:4:"type";i:4;s:5:"flags";i:2;s:8:"position";i:143;}i:54;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:148;}i:55;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"AS";s:5:"value";s:2:"AS";s:7:"keyword";s:2:"AS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:149;}i:56;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:151;}i:57;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"/* */";s:5:"value";s:5:"/* */";s:7:"keyword";N;s:4:"type";i:4;s:5:"flags";i:2;s:8:"position";i:152;}i:58;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:157;}i:59;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"foo";s:5:"value";s:3:"foo";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:158;}i:60;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:161;}i:61;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"FROM";s:5:"value";s:4:"FROM";s:7:"keyword";s:4:"FROM";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:162;}i:62;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:166;}i:63;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"a";s:5:"value";s:1:"a";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:167;}i:64;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:168;}i:65;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:66;s:3:"idx";i:66;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:47:"PhpMyAdmin\SqlParser\Statements\SelectStatement":16:{s:4:"expr";a:2:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:65:"(SELECT name FROM mysql.help_category WHERE help_category_id = 1)";s:5:"alias";s:4:"name";s:8:"function";N;s:8:"subquery";s:6:"SELECT";}i:1;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:4:"test";s:4:"expr";s:69:"test=CASE 1 /* */ WHEN 1 THEN "Some" WHEN 2 THEN "Other" END AS `foo`";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:4:"from";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:1:"a";s:6:"column";N;s:4:"expr";s:1:"a";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:9:"partition";N;s:5:"where";N;s:5:"group";N;s:6:"having";N;s:5:"order";N;s:5:"limit";N;s:9:"procedure";N;s:4:"into";N;s:4:"join";N;s:5:"union";a:0:{}s:11:"end_options";N;s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}s:5:"first";i:0;s:4:"last";i:63;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}} \ No newline at end of file diff --git a/tests/data/parser/parseSelectCaseAlias4.in b/tests/data/parser/parseSelectCaseAlias4.in new file mode 100644 index 000000000..b4d56238e --- /dev/null +++ b/tests/data/parser/parseSelectCaseAlias4.in @@ -0,0 +1,2 @@ +select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name, +test=case 1 /* */ when 1 then "Some" when 2 then "Other" end /* */ foo FROM a; \ No newline at end of file diff --git a/tests/data/parser/parseSelectCaseAlias4.out b/tests/data/parser/parseSelectCaseAlias4.out new file mode 100644 index 000000000..874c8f39a --- /dev/null +++ b/tests/data/parser/parseSelectCaseAlias4.out @@ -0,0 +1,4 @@ +a:4:{s:5:"query";s:160:"select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name, +test=case 1 /* */ when 1 then "Some" when 2 then "Other" end /* */ foo FROM a;";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:160:"select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name, +test=case 1 /* */ when 1 then "Some" when 2 then "Other" end /* */ foo FROM a;";s:3:"len";i:160;s:4:"last";i:160;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:62:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"select";s:5:"value";s:6:"SELECT";s:7:"keyword";s:6:"SELECT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:6;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:7;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"SELECT";s:5:"value";s:6:"SELECT";s:7:"keyword";s:6:"SELECT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:8;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:14;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"name";s:5:"value";s:4:"name";s:7:"keyword";s:4:"NAME";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:15;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:19;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"FROM";s:5:"value";s:4:"FROM";s:7:"keyword";s:4:"FROM";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:20;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:24;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"mysql";s:5:"value";s:5:"mysql";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:25;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:".";s:5:"value";s:1:".";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:30;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:13:"help_category";s:5:"value";s:13:"help_category";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:31;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:44;}i:13;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"WHERE";s:5:"value";s:5:"WHERE";s:7:"keyword";s:5:"WHERE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:45;}i:14;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:50;}i:15;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:16:"help_category_id";s:5:"value";s:16:"help_category_id";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:51;}i:16;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:67;}i:17;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"=";s:5:"value";s:1:"=";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:68;}i:18;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:69;}i:19;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"1";s:5:"value";i:1;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:70;}i:20;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:71;}i:21;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:72;}i:22;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"as";s:5:"value";s:2:"AS";s:7:"keyword";s:2:"AS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:73;}i:23;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:75;}i:24;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"name";s:5:"value";s:4:"name";s:7:"keyword";s:4:"NAME";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:76;}i:25;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:",";s:5:"value";s:1:",";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:80;}i:26;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" +";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:81;}i:27;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"test";s:5:"value";s:4:"test";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:82;}i:28;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"=";s:5:"value";s:1:"=";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:86;}i:29;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"case";s:5:"value";s:4:"CASE";s:7:"keyword";s:4:"CASE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:87;}i:30;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:91;}i:31;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"1";s:5:"value";i:1;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:92;}i:32;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:93;}i:33;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"/* */";s:5:"value";s:5:"/* */";s:7:"keyword";N;s:4:"type";i:4;s:5:"flags";i:2;s:8:"position";i:94;}i:34;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:99;}i:35;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"when";s:5:"value";s:4:"WHEN";s:7:"keyword";s:4:"WHEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:100;}i:36;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:104;}i:37;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"1";s:5:"value";i:1;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:105;}i:38;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:106;}i:39;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"then";s:5:"value";s:4:"THEN";s:7:"keyword";s:4:"THEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:107;}i:40;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:111;}i:41;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:""Some"";s:5:"value";s:4:"Some";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:2;s:8:"position";i:112;}i:42;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:118;}i:43;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"when";s:5:"value";s:4:"WHEN";s:7:"keyword";s:4:"WHEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:119;}i:44;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:123;}i:45;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"2";s:5:"value";i:2;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:124;}i:46;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:125;}i:47;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"then";s:5:"value";s:4:"THEN";s:7:"keyword";s:4:"THEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:126;}i:48;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:130;}i:49;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:7:""Other"";s:5:"value";s:5:"Other";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:2;s:8:"position";i:131;}i:50;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:138;}i:51;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"end";s:5:"value";s:3:"end";s:7:"keyword";s:3:"END";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:139;}i:52;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:142;}i:53;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"/* */";s:5:"value";s:5:"/* */";s:7:"keyword";N;s:4:"type";i:4;s:5:"flags";i:2;s:8:"position";i:143;}i:54;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:148;}i:55;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"foo";s:5:"value";s:3:"foo";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:149;}i:56;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:152;}i:57;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"FROM";s:5:"value";s:4:"FROM";s:7:"keyword";s:4:"FROM";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:153;}i:58;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:157;}i:59;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"a";s:5:"value";s:1:"a";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:158;}i:60;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:159;}i:61;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:62;s:3:"idx";i:62;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:47:"PhpMyAdmin\SqlParser\Statements\SelectStatement":16:{s:4:"expr";a:2:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:65:"(SELECT name FROM mysql.help_category WHERE help_category_id = 1)";s:5:"alias";s:4:"name";s:8:"function";N;s:8:"subquery";s:6:"SELECT";}i:1;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:4:"test";s:4:"expr";s:69:"test=CASE 1 /* */ WHEN 1 THEN "Some" WHEN 2 THEN "Other" END AS `foo`";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:4:"from";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:1:"a";s:6:"column";N;s:4:"expr";s:1:"a";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:9:"partition";N;s:5:"where";N;s:5:"group";N;s:6:"having";N;s:5:"order";N;s:5:"limit";N;s:9:"procedure";N;s:4:"into";N;s:4:"join";N;s:5:"union";a:0:{}s:11:"end_options";N;s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}s:5:"first";i:0;s:4:"last";i:59;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}} \ No newline at end of file diff --git a/tests/data/parser/parseSelectCaseAlias5.in b/tests/data/parser/parseSelectCaseAlias5.in new file mode 100644 index 000000000..ec99ffbf4 --- /dev/null +++ b/tests/data/parser/parseSelectCaseAlias5.in @@ -0,0 +1,2 @@ +select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name, +case 1 when 1 then "Some" else "Other" end AS "string value" FROM a; \ No newline at end of file diff --git a/tests/data/parser/parseSelectCaseAlias5.out b/tests/data/parser/parseSelectCaseAlias5.out new file mode 100644 index 000000000..46fb30869 --- /dev/null +++ b/tests/data/parser/parseSelectCaseAlias5.out @@ -0,0 +1,4 @@ +a:4:{s:5:"query";s:150:"select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name, +case 1 when 1 then "Some" else "Other" end AS "string value" FROM a;";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:150:"select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name, +case 1 when 1 then "Some" else "Other" end AS "string value" FROM a;";s:3:"len";i:150;s:4:"last";i:150;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:54:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"select";s:5:"value";s:6:"SELECT";s:7:"keyword";s:6:"SELECT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:6;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:7;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"SELECT";s:5:"value";s:6:"SELECT";s:7:"keyword";s:6:"SELECT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:8;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:14;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"name";s:5:"value";s:4:"name";s:7:"keyword";s:4:"NAME";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:15;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:19;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"FROM";s:5:"value";s:4:"FROM";s:7:"keyword";s:4:"FROM";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:20;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:24;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"mysql";s:5:"value";s:5:"mysql";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:25;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:".";s:5:"value";s:1:".";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:30;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:13:"help_category";s:5:"value";s:13:"help_category";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:31;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:44;}i:13;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"WHERE";s:5:"value";s:5:"WHERE";s:7:"keyword";s:5:"WHERE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:45;}i:14;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:50;}i:15;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:16:"help_category_id";s:5:"value";s:16:"help_category_id";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:51;}i:16;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:67;}i:17;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"=";s:5:"value";s:1:"=";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:68;}i:18;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:69;}i:19;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"1";s:5:"value";i:1;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:70;}i:20;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:71;}i:21;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:72;}i:22;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"as";s:5:"value";s:2:"AS";s:7:"keyword";s:2:"AS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:73;}i:23;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:75;}i:24;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"name";s:5:"value";s:4:"name";s:7:"keyword";s:4:"NAME";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:76;}i:25;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:",";s:5:"value";s:1:",";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:80;}i:26;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" +";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:81;}i:27;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"case";s:5:"value";s:4:"CASE";s:7:"keyword";s:4:"CASE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:82;}i:28;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:86;}i:29;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"1";s:5:"value";i:1;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:87;}i:30;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:88;}i:31;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"when";s:5:"value";s:4:"WHEN";s:7:"keyword";s:4:"WHEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:89;}i:32;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:93;}i:33;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"1";s:5:"value";i:1;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:94;}i:34;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:95;}i:35;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"then";s:5:"value";s:4:"THEN";s:7:"keyword";s:4:"THEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:96;}i:36;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:100;}i:37;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:""Some"";s:5:"value";s:4:"Some";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:2;s:8:"position";i:101;}i:38;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:107;}i:39;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"else";s:5:"value";s:4:"ELSE";s:7:"keyword";s:4:"ELSE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:108;}i:40;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:112;}i:41;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:7:""Other"";s:5:"value";s:5:"Other";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:2;s:8:"position";i:113;}i:42;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:120;}i:43;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"end";s:5:"value";s:3:"end";s:7:"keyword";s:3:"END";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:121;}i:44;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:124;}i:45;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"AS";s:5:"value";s:2:"AS";s:7:"keyword";s:2:"AS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:125;}i:46;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:127;}i:47;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:14:""string value"";s:5:"value";s:12:"string value";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:2;s:8:"position";i:128;}i:48;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:142;}i:49;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"FROM";s:5:"value";s:4:"FROM";s:7:"keyword";s:4:"FROM";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:143;}i:50;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:147;}i:51;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"a";s:5:"value";s:1:"a";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:148;}i:52;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:149;}i:53;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:54;s:3:"idx";i:54;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:47:"PhpMyAdmin\SqlParser\Statements\SelectStatement":16:{s:4:"expr";a:2:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:65:"(SELECT name FROM mysql.help_category WHERE help_category_id = 1)";s:5:"alias";s:4:"name";s:8:"function";N;s:8:"subquery";s:6:"SELECT";}i:1;O:46:"PhpMyAdmin\SqlParser\Components\CaseExpression":7:{s:5:"value";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:1:"1";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:10:"conditions";N;s:7:"results";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:4:"Some";s:4:"expr";s:6:""Some"";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:14:"compare_values";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:1:"1";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:11:"else_result";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:5:"Other";s:4:"expr";s:7:""Other"";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:5:"alias";s:12:"string value";s:4:"expr";s:60:"CASE 1 WHEN 1 THEN "Some" ELSE "Other" END AS `string value`";}}s:4:"from";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:1:"a";s:6:"column";N;s:4:"expr";s:1:"a";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:9:"partition";N;s:5:"where";N;s:5:"group";N;s:6:"having";N;s:5:"order";N;s:5:"limit";N;s:9:"procedure";N;s:4:"into";N;s:4:"join";N;s:5:"union";a:0:{}s:11:"end_options";N;s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}s:5:"first";i:0;s:4:"last";i:51;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}} \ No newline at end of file diff --git a/tests/data/parser/parseSelectCaseAlias6.in b/tests/data/parser/parseSelectCaseAlias6.in new file mode 100644 index 000000000..e964f94c9 --- /dev/null +++ b/tests/data/parser/parseSelectCaseAlias6.in @@ -0,0 +1,2 @@ +select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name, +case 1 when 1 then "Some" else "Other" end AS `symbol_value` FROM a; \ No newline at end of file diff --git a/tests/data/parser/parseSelectCaseAlias6.out b/tests/data/parser/parseSelectCaseAlias6.out new file mode 100644 index 000000000..5ff882fbb --- /dev/null +++ b/tests/data/parser/parseSelectCaseAlias6.out @@ -0,0 +1,4 @@ +a:4:{s:5:"query";s:150:"select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name, +case 1 when 1 then "Some" else "Other" end AS `symbol_value` FROM a;";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:150:"select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name, +case 1 when 1 then "Some" else "Other" end AS `symbol_value` FROM a;";s:3:"len";i:150;s:4:"last";i:150;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:54:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"select";s:5:"value";s:6:"SELECT";s:7:"keyword";s:6:"SELECT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:6;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:7;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"SELECT";s:5:"value";s:6:"SELECT";s:7:"keyword";s:6:"SELECT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:8;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:14;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"name";s:5:"value";s:4:"name";s:7:"keyword";s:4:"NAME";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:15;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:19;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"FROM";s:5:"value";s:4:"FROM";s:7:"keyword";s:4:"FROM";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:20;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:24;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"mysql";s:5:"value";s:5:"mysql";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:25;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:".";s:5:"value";s:1:".";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:30;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:13:"help_category";s:5:"value";s:13:"help_category";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:31;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:44;}i:13;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"WHERE";s:5:"value";s:5:"WHERE";s:7:"keyword";s:5:"WHERE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:45;}i:14;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:50;}i:15;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:16:"help_category_id";s:5:"value";s:16:"help_category_id";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:51;}i:16;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:67;}i:17;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"=";s:5:"value";s:1:"=";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:68;}i:18;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:69;}i:19;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"1";s:5:"value";i:1;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:70;}i:20;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:71;}i:21;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:72;}i:22;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"as";s:5:"value";s:2:"AS";s:7:"keyword";s:2:"AS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:73;}i:23;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:75;}i:24;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"name";s:5:"value";s:4:"name";s:7:"keyword";s:4:"NAME";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:76;}i:25;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:",";s:5:"value";s:1:",";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:80;}i:26;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" +";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:81;}i:27;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"case";s:5:"value";s:4:"CASE";s:7:"keyword";s:4:"CASE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:82;}i:28;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:86;}i:29;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"1";s:5:"value";i:1;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:87;}i:30;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:88;}i:31;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"when";s:5:"value";s:4:"WHEN";s:7:"keyword";s:4:"WHEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:89;}i:32;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:93;}i:33;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"1";s:5:"value";i:1;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:94;}i:34;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:95;}i:35;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"then";s:5:"value";s:4:"THEN";s:7:"keyword";s:4:"THEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:96;}i:36;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:100;}i:37;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:""Some"";s:5:"value";s:4:"Some";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:2;s:8:"position";i:101;}i:38;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:107;}i:39;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"else";s:5:"value";s:4:"ELSE";s:7:"keyword";s:4:"ELSE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:108;}i:40;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:112;}i:41;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:7:""Other"";s:5:"value";s:5:"Other";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:2;s:8:"position";i:113;}i:42;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:120;}i:43;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"end";s:5:"value";s:3:"end";s:7:"keyword";s:3:"END";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:121;}i:44;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:124;}i:45;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"AS";s:5:"value";s:2:"AS";s:7:"keyword";s:2:"AS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:125;}i:46;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:127;}i:47;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:14:"`symbol_value`";s:5:"value";s:12:"symbol_value";s:7:"keyword";N;s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:128;}i:48;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:142;}i:49;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"FROM";s:5:"value";s:4:"FROM";s:7:"keyword";s:4:"FROM";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:143;}i:50;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:147;}i:51;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"a";s:5:"value";s:1:"a";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:148;}i:52;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:149;}i:53;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:54;s:3:"idx";i:54;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:47:"PhpMyAdmin\SqlParser\Statements\SelectStatement":16:{s:4:"expr";a:2:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:65:"(SELECT name FROM mysql.help_category WHERE help_category_id = 1)";s:5:"alias";s:4:"name";s:8:"function";N;s:8:"subquery";s:6:"SELECT";}i:1;O:46:"PhpMyAdmin\SqlParser\Components\CaseExpression":7:{s:5:"value";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:1:"1";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:10:"conditions";N;s:7:"results";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:4:"Some";s:4:"expr";s:6:""Some"";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:14:"compare_values";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:1:"1";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:11:"else_result";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:5:"Other";s:4:"expr";s:7:""Other"";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:5:"alias";s:12:"symbol_value";s:4:"expr";s:60:"CASE 1 WHEN 1 THEN "Some" ELSE "Other" END AS `symbol_value`";}}s:4:"from";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:1:"a";s:6:"column";N;s:4:"expr";s:1:"a";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:9:"partition";N;s:5:"where";N;s:5:"group";N;s:6:"having";N;s:5:"order";N;s:5:"limit";N;s:9:"procedure";N;s:4:"into";N;s:4:"join";N;s:5:"union";a:0:{}s:11:"end_options";N;s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}s:5:"first";i:0;s:4:"last";i:51;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}} \ No newline at end of file diff --git a/tests/data/parser/parseSelectCaseAliasErr1.in b/tests/data/parser/parseSelectCaseAliasErr1.in new file mode 100644 index 000000000..b00b077d3 --- /dev/null +++ b/tests/data/parser/parseSelectCaseAliasErr1.in @@ -0,0 +1,2 @@ +select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name, +case 1 when 1 then "Some" else "Other" end AS AS foo FROM a; \ No newline at end of file diff --git a/tests/data/parser/parseSelectCaseAliasErr1.out b/tests/data/parser/parseSelectCaseAliasErr1.out new file mode 100644 index 000000000..5d66c6f91 --- /dev/null +++ b/tests/data/parser/parseSelectCaseAliasErr1.out @@ -0,0 +1,4 @@ +a:4:{s:5:"query";s:142:"select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name, +case 1 when 1 then "Some" else "Other" end AS AS foo FROM a;";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:142:"select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name, +case 1 when 1 then "Some" else "Other" end AS AS foo FROM a;";s:3:"len";i:142;s:4:"last";i:142;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:56:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"select";s:5:"value";s:6:"SELECT";s:7:"keyword";s:6:"SELECT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:6;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:7;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"SELECT";s:5:"value";s:6:"SELECT";s:7:"keyword";s:6:"SELECT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:8;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:14;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"name";s:5:"value";s:4:"name";s:7:"keyword";s:4:"NAME";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:15;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:19;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"FROM";s:5:"value";s:4:"FROM";s:7:"keyword";s:4:"FROM";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:20;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:24;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"mysql";s:5:"value";s:5:"mysql";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:25;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:".";s:5:"value";s:1:".";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:30;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:13:"help_category";s:5:"value";s:13:"help_category";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:31;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:44;}i:13;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"WHERE";s:5:"value";s:5:"WHERE";s:7:"keyword";s:5:"WHERE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:45;}i:14;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:50;}i:15;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:16:"help_category_id";s:5:"value";s:16:"help_category_id";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:51;}i:16;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:67;}i:17;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"=";s:5:"value";s:1:"=";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:68;}i:18;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:69;}i:19;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"1";s:5:"value";i:1;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:70;}i:20;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:71;}i:21;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:72;}i:22;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"as";s:5:"value";s:2:"AS";s:7:"keyword";s:2:"AS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:73;}i:23;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:75;}i:24;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"name";s:5:"value";s:4:"name";s:7:"keyword";s:4:"NAME";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:76;}i:25;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:",";s:5:"value";s:1:",";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:80;}i:26;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" +";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:81;}i:27;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"case";s:5:"value";s:4:"CASE";s:7:"keyword";s:4:"CASE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:82;}i:28;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:86;}i:29;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"1";s:5:"value";i:1;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:87;}i:30;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:88;}i:31;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"when";s:5:"value";s:4:"WHEN";s:7:"keyword";s:4:"WHEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:89;}i:32;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:93;}i:33;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"1";s:5:"value";i:1;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:94;}i:34;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:95;}i:35;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"then";s:5:"value";s:4:"THEN";s:7:"keyword";s:4:"THEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:96;}i:36;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:100;}i:37;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:""Some"";s:5:"value";s:4:"Some";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:2;s:8:"position";i:101;}i:38;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:107;}i:39;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"else";s:5:"value";s:4:"ELSE";s:7:"keyword";s:4:"ELSE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:108;}i:40;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:112;}i:41;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:7:""Other"";s:5:"value";s:5:"Other";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:2;s:8:"position";i:113;}i:42;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:120;}i:43;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"end";s:5:"value";s:3:"end";s:7:"keyword";s:3:"END";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:121;}i:44;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:124;}i:45;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"AS";s:5:"value";s:2:"AS";s:7:"keyword";s:2:"AS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:125;}i:46;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:127;}i:47;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"AS";s:5:"value";s:2:"AS";s:7:"keyword";s:2:"AS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:128;}i:48;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:130;}i:49;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"foo";s:5:"value";s:3:"foo";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:131;}i:50;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:134;}i:51;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"FROM";s:5:"value";s:4:"FROM";s:7:"keyword";s:4:"FROM";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:135;}i:52;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:139;}i:53;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"a";s:5:"value";s:1:"a";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:140;}i:54;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:141;}i:55;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:56;s:3:"idx";i:56;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:47:"PhpMyAdmin\SqlParser\Statements\SelectStatement":16:{s:4:"expr";a:2:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:65:"(SELECT name FROM mysql.help_category WHERE help_category_id = 1)";s:5:"alias";s:4:"name";s:8:"function";N;s:8:"subquery";s:6:"SELECT";}i:1;O:46:"PhpMyAdmin\SqlParser\Components\CaseExpression":7:{s:5:"value";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:1:"1";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:10:"conditions";N;s:7:"results";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:4:"Some";s:4:"expr";s:6:""Some"";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:14:"compare_values";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:1:"1";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:11:"else_result";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:5:"Other";s:4:"expr";s:7:""Other"";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:5:"alias";N;s:4:"expr";s:42:"CASE 1 WHEN 1 THEN "Some" ELSE "Other" END";}}s:4:"from";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:1:"a";s:6:"column";N;s:4:"expr";s:1:"a";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:9:"partition";N;s:5:"where";N;s:5:"group";N;s:6:"having";N;s:5:"order";N;s:5:"limit";N;s:9:"procedure";N;s:4:"into";N;s:4:"join";N;s:5:"union";a:0:{}s:11:"end_options";N;s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}s:5:"first";i:0;s:4:"last";i:53;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:4:{i:0;a:3:{i:0;s:45:"Potential duplicate alias of CASE expression.";i:1;r:338;i:2;i:0;}i:1;a:3:{i:0;s:31:"An alias was expected after AS.";i:1;r:331;i:2;i:0;}i:2;a:3:{i:0;s:21:"Unrecognized keyword.";i:1;r:338;i:2;i:0;}i:3;a:3:{i:0;s:17:"Unexpected token.";i:1;r:352;i:2;i:0;}}}} \ No newline at end of file diff --git a/tests/data/parser/parseSelectCaseAliasErr2.in b/tests/data/parser/parseSelectCaseAliasErr2.in new file mode 100644 index 000000000..861171310 --- /dev/null +++ b/tests/data/parser/parseSelectCaseAliasErr2.in @@ -0,0 +1,2 @@ +select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name, +case 1 when 1 then "Some" else "Other" end AS FROM a; \ No newline at end of file diff --git a/tests/data/parser/parseSelectCaseAliasErr2.out b/tests/data/parser/parseSelectCaseAliasErr2.out new file mode 100644 index 000000000..ad4e57f7b --- /dev/null +++ b/tests/data/parser/parseSelectCaseAliasErr2.out @@ -0,0 +1,4 @@ +a:4:{s:5:"query";s:135:"select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name, +case 1 when 1 then "Some" else "Other" end AS FROM a;";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:135:"select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name, +case 1 when 1 then "Some" else "Other" end AS FROM a;";s:3:"len";i:135;s:4:"last";i:135;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:52:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"select";s:5:"value";s:6:"SELECT";s:7:"keyword";s:6:"SELECT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:6;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:7;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"SELECT";s:5:"value";s:6:"SELECT";s:7:"keyword";s:6:"SELECT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:8;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:14;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"name";s:5:"value";s:4:"name";s:7:"keyword";s:4:"NAME";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:15;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:19;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"FROM";s:5:"value";s:4:"FROM";s:7:"keyword";s:4:"FROM";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:20;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:24;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"mysql";s:5:"value";s:5:"mysql";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:25;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:".";s:5:"value";s:1:".";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:30;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:13:"help_category";s:5:"value";s:13:"help_category";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:31;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:44;}i:13;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"WHERE";s:5:"value";s:5:"WHERE";s:7:"keyword";s:5:"WHERE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:45;}i:14;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:50;}i:15;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:16:"help_category_id";s:5:"value";s:16:"help_category_id";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:51;}i:16;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:67;}i:17;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"=";s:5:"value";s:1:"=";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:68;}i:18;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:69;}i:19;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"1";s:5:"value";i:1;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:70;}i:20;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:71;}i:21;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:72;}i:22;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"as";s:5:"value";s:2:"AS";s:7:"keyword";s:2:"AS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:73;}i:23;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:75;}i:24;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"name";s:5:"value";s:4:"name";s:7:"keyword";s:4:"NAME";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:76;}i:25;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:",";s:5:"value";s:1:",";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:80;}i:26;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" +";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:81;}i:27;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"case";s:5:"value";s:4:"CASE";s:7:"keyword";s:4:"CASE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:82;}i:28;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:86;}i:29;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"1";s:5:"value";i:1;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:87;}i:30;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:88;}i:31;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"when";s:5:"value";s:4:"WHEN";s:7:"keyword";s:4:"WHEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:89;}i:32;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:93;}i:33;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"1";s:5:"value";i:1;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:94;}i:34;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:95;}i:35;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"then";s:5:"value";s:4:"THEN";s:7:"keyword";s:4:"THEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:96;}i:36;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:100;}i:37;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:""Some"";s:5:"value";s:4:"Some";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:2;s:8:"position";i:101;}i:38;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:107;}i:39;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"else";s:5:"value";s:4:"ELSE";s:7:"keyword";s:4:"ELSE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:108;}i:40;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:112;}i:41;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:7:""Other"";s:5:"value";s:5:"Other";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:2;s:8:"position";i:113;}i:42;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:120;}i:43;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"end";s:5:"value";s:3:"end";s:7:"keyword";s:3:"END";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:121;}i:44;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:124;}i:45;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"AS";s:5:"value";s:2:"AS";s:7:"keyword";s:2:"AS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:125;}i:46;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:127;}i:47;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"FROM";s:5:"value";s:4:"FROM";s:7:"keyword";s:4:"FROM";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:128;}i:48;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:132;}i:49;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"a";s:5:"value";s:1:"a";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:133;}i:50;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:134;}i:51;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:52;s:3:"idx";i:52;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:47:"PhpMyAdmin\SqlParser\Statements\SelectStatement":16:{s:4:"expr";a:2:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:65:"(SELECT name FROM mysql.help_category WHERE help_category_id = 1)";s:5:"alias";s:4:"name";s:8:"function";N;s:8:"subquery";s:6:"SELECT";}i:1;O:46:"PhpMyAdmin\SqlParser\Components\CaseExpression":7:{s:5:"value";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:1:"1";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:10:"conditions";N;s:7:"results";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:4:"Some";s:4:"expr";s:6:""Some"";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:14:"compare_values";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:1:"1";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:11:"else_result";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:5:"Other";s:4:"expr";s:7:""Other"";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:5:"alias";N;s:4:"expr";s:42:"CASE 1 WHEN 1 THEN "Some" ELSE "Other" END";}}s:4:"from";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:1:"a";s:6:"column";N;s:4:"expr";s:1:"a";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:9:"partition";N;s:5:"where";N;s:5:"group";N;s:6:"having";N;s:5:"order";N;s:5:"limit";N;s:9:"procedure";N;s:4:"into";N;s:4:"join";N;s:5:"union";a:0:{}s:11:"end_options";N;s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}s:5:"first";i:0;s:4:"last";i:49;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:1:{i:0;a:3:{i:0;s:39:"An alias expected after AS but got FROM";i:1;r:338;i:2;i:0;}}}} \ No newline at end of file diff --git a/tests/data/parser/parseSelectCaseAliasErr3.in b/tests/data/parser/parseSelectCaseAliasErr3.in new file mode 100644 index 000000000..fde3e44c7 --- /dev/null +++ b/tests/data/parser/parseSelectCaseAliasErr3.in @@ -0,0 +1,2 @@ +select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name, +case 1 when 1 then "Some" else "Other" end AS foo bar FROM a; \ No newline at end of file diff --git a/tests/data/parser/parseSelectCaseAliasErr3.out b/tests/data/parser/parseSelectCaseAliasErr3.out new file mode 100644 index 000000000..827abfd47 --- /dev/null +++ b/tests/data/parser/parseSelectCaseAliasErr3.out @@ -0,0 +1,4 @@ +a:4:{s:5:"query";s:143:"select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name, +case 1 when 1 then "Some" else "Other" end AS foo bar FROM a;";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:143:"select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name, +case 1 when 1 then "Some" else "Other" end AS foo bar FROM a;";s:3:"len";i:143;s:4:"last";i:143;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:56:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"select";s:5:"value";s:6:"SELECT";s:7:"keyword";s:6:"SELECT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:6;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:7;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"SELECT";s:5:"value";s:6:"SELECT";s:7:"keyword";s:6:"SELECT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:8;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:14;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"name";s:5:"value";s:4:"name";s:7:"keyword";s:4:"NAME";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:15;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:19;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"FROM";s:5:"value";s:4:"FROM";s:7:"keyword";s:4:"FROM";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:20;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:24;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"mysql";s:5:"value";s:5:"mysql";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:25;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:".";s:5:"value";s:1:".";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:30;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:13:"help_category";s:5:"value";s:13:"help_category";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:31;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:44;}i:13;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"WHERE";s:5:"value";s:5:"WHERE";s:7:"keyword";s:5:"WHERE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:45;}i:14;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:50;}i:15;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:16:"help_category_id";s:5:"value";s:16:"help_category_id";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:51;}i:16;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:67;}i:17;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"=";s:5:"value";s:1:"=";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:68;}i:18;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:69;}i:19;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"1";s:5:"value";i:1;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:70;}i:20;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:71;}i:21;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:72;}i:22;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"as";s:5:"value";s:2:"AS";s:7:"keyword";s:2:"AS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:73;}i:23;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:75;}i:24;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"name";s:5:"value";s:4:"name";s:7:"keyword";s:4:"NAME";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:76;}i:25;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:",";s:5:"value";s:1:",";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:80;}i:26;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" +";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:81;}i:27;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"case";s:5:"value";s:4:"CASE";s:7:"keyword";s:4:"CASE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:82;}i:28;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:86;}i:29;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"1";s:5:"value";i:1;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:87;}i:30;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:88;}i:31;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"when";s:5:"value";s:4:"WHEN";s:7:"keyword";s:4:"WHEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:89;}i:32;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:93;}i:33;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"1";s:5:"value";i:1;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:94;}i:34;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:95;}i:35;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"then";s:5:"value";s:4:"THEN";s:7:"keyword";s:4:"THEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:96;}i:36;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:100;}i:37;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:""Some"";s:5:"value";s:4:"Some";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:2;s:8:"position";i:101;}i:38;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:107;}i:39;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"else";s:5:"value";s:4:"ELSE";s:7:"keyword";s:4:"ELSE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:108;}i:40;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:112;}i:41;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:7:""Other"";s:5:"value";s:5:"Other";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:2;s:8:"position";i:113;}i:42;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:120;}i:43;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"end";s:5:"value";s:3:"end";s:7:"keyword";s:3:"END";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:121;}i:44;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:124;}i:45;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"AS";s:5:"value";s:2:"AS";s:7:"keyword";s:2:"AS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:125;}i:46;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:127;}i:47;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"foo";s:5:"value";s:3:"foo";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:128;}i:48;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:131;}i:49;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"bar";s:5:"value";s:3:"bar";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:132;}i:50;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:135;}i:51;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"FROM";s:5:"value";s:4:"FROM";s:7:"keyword";s:4:"FROM";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:136;}i:52;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:140;}i:53;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"a";s:5:"value";s:1:"a";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:141;}i:54;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:142;}i:55;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:56;s:3:"idx";i:56;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:47:"PhpMyAdmin\SqlParser\Statements\SelectStatement":16:{s:4:"expr";a:2:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:65:"(SELECT name FROM mysql.help_category WHERE help_category_id = 1)";s:5:"alias";s:4:"name";s:8:"function";N;s:8:"subquery";s:6:"SELECT";}i:1;O:46:"PhpMyAdmin\SqlParser\Components\CaseExpression":7:{s:5:"value";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:1:"1";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:10:"conditions";N;s:7:"results";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:4:"Some";s:4:"expr";s:6:""Some"";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:14:"compare_values";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:1:"1";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:11:"else_result";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:5:"Other";s:4:"expr";s:7:""Other"";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:5:"alias";s:3:"foo";s:4:"expr";s:51:"CASE 1 WHEN 1 THEN "Some" ELSE "Other" END AS `foo`";}}s:4:"from";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:1:"a";s:6:"column";N;s:4:"expr";s:1:"a";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:9:"partition";N;s:5:"where";N;s:5:"group";N;s:6:"having";N;s:5:"order";N;s:5:"limit";N;s:9:"procedure";N;s:4:"into";N;s:4:"join";N;s:5:"union";a:0:{}s:11:"end_options";N;s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}s:5:"first";i:0;s:4:"last";i:53;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:2:{i:0;a:3:{i:0;s:30:"An alias was previously found.";i:1;r:352;i:2;i:0;}i:1;a:3:{i:0;s:17:"Unexpected token.";i:1;r:352;i:2;i:0;}}}} \ No newline at end of file diff --git a/tests/data/parser/parseSelectCaseAliasErr4.in b/tests/data/parser/parseSelectCaseAliasErr4.in new file mode 100644 index 000000000..61c201418 --- /dev/null +++ b/tests/data/parser/parseSelectCaseAliasErr4.in @@ -0,0 +1 @@ +SELECT CASE WHEN 2 IS NULL THEN "this is true" ELSE "this is false" END AS ; \ No newline at end of file diff --git a/tests/data/parser/parseSelectCaseAliasErr4.out b/tests/data/parser/parseSelectCaseAliasErr4.out new file mode 100644 index 000000000..3d2618b0d --- /dev/null +++ b/tests/data/parser/parseSelectCaseAliasErr4.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:76:"SELECT CASE WHEN 2 IS NULL THEN "this is true" ELSE "this is false" END AS ;";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:76:"SELECT CASE WHEN 2 IS NULL THEN "this is true" ELSE "this is false" END AS ;";s:3:"len";i:76;s:4:"last";i:76;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:26:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"SELECT";s:5:"value";s:6:"SELECT";s:7:"keyword";s:6:"SELECT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:6;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"CASE";s:5:"value";s:4:"CASE";s:7:"keyword";s:4:"CASE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:7;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:11;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"WHEN";s:5:"value";s:4:"WHEN";s:7:"keyword";s:4:"WHEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:12;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:16;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"2";s:5:"value";i:2;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:17;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:18;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"IS";s:5:"value";s:2:"IS";s:7:"keyword";s:2:"IS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:19;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:21;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"NULL";s:5:"value";s:4:"NULL";s:7:"keyword";s:4:"NULL";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:22;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:26;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"THEN";s:5:"value";s:4:"THEN";s:7:"keyword";s:4:"THEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:27;}i:13;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:31;}i:14;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:14:""this is true"";s:5:"value";s:12:"this is true";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:2;s:8:"position";i:32;}i:15;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:46;}i:16;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"ELSE";s:5:"value";s:4:"ELSE";s:7:"keyword";s:4:"ELSE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:47;}i:17;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:51;}i:18;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:15:""this is false"";s:5:"value";s:13:"this is false";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:2;s:8:"position";i:52;}i:19;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:67;}i:20;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"END";s:5:"value";s:3:"END";s:7:"keyword";s:3:"END";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:68;}i:21;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:71;}i:22;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"AS";s:5:"value";s:2:"AS";s:7:"keyword";s:2:"AS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:72;}i:23;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:74;}i:24;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:75;}i:25;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:26;s:3:"idx";i:26;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:47:"PhpMyAdmin\SqlParser\Statements\SelectStatement":16:{s:4:"expr";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Components\CaseExpression":7:{s:5:"value";N;s:10:"conditions";a:1:{i:0;a:1:{i:0;O:41:"PhpMyAdmin\SqlParser\Components\Condition":3:{s:11:"identifiers";a:0:{}s:10:"isOperator";b:0;s:4:"expr";s:9:"2 IS NULL";}}}s:7:"results";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:12:"this is true";s:4:"expr";s:14:""this is true"";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:14:"compare_values";N;s:11:"else_result";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:13:"this is false";s:4:"expr";s:15:""this is false"";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:5:"alias";N;s:4:"expr";s:64:"CASE WHEN 2 IS NULL THEN "this is true" ELSE "this is false" END";}}s:4:"from";a:0:{}s:9:"partition";N;s:5:"where";N;s:5:"group";N;s:6:"having";N;s:5:"order";N;s:5:"limit";N;s:9:"procedure";N;s:4:"into";N;s:4:"join";N;s:5:"union";a:0:{}s:11:"end_options";N;s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}s:5:"first";i:0;s:4:"last";i:23;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:1:{i:0;a:3:{i:0;s:31:"An alias was expected after AS.";i:1;r:170;i:2;i:0;}}}} \ No newline at end of file diff --git a/tests/data/parser/parseSelectIndexHint1.in b/tests/data/parser/parseSelectIndexHint1.in new file mode 100644 index 000000000..a29005b04 --- /dev/null +++ b/tests/data/parser/parseSelectIndexHint1.in @@ -0,0 +1 @@ +SELECT * FROM address FORCE INDEX (idx_fk_city_id) IGNORE KEY FOR GROUP BY (a, b,c) WHERE city_id<0; \ No newline at end of file diff --git a/tests/data/parser/parseSelectIndexHint1.out b/tests/data/parser/parseSelectIndexHint1.out new file mode 100644 index 000000000..d43e8c105 --- /dev/null +++ b/tests/data/parser/parseSelectIndexHint1.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:101:"SELECT * FROM address FORCE INDEX (idx_fk_city_id) IGNORE KEY FOR GROUP BY (a, b,c) WHERE city_id<0;";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:101:"SELECT * FROM address FORCE INDEX (idx_fk_city_id) IGNORE KEY FOR GROUP BY (a, b,c) WHERE city_id<0;";s:3:"len";i:101;s:4:"last";i:101;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:40:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"SELECT";s:5:"value";s:6:"SELECT";s:7:"keyword";s:6:"SELECT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:6;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"*";s:5:"value";s:1:"*";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:1;s:8:"position";i:8;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:9;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"FROM";s:5:"value";s:4:"FROM";s:7:"keyword";s:4:"FROM";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:10;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:14;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:7:"address";s:5:"value";s:7:"address";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:15;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:22;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"FORCE";s:5:"value";s:5:"FORCE";s:7:"keyword";s:5:"FORCE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:23;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:28;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"INDEX";s:5:"value";s:5:"INDEX";s:7:"keyword";s:5:"INDEX";s:4:"type";i:1;s:5:"flags";i:19;s:8:"position";i:29;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:34;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:35;}i:13;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:14:"idx_fk_city_id";s:5:"value";s:14:"idx_fk_city_id";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:36;}i:14;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:50;}i:15;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:51;}i:16;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"IGNORE";s:5:"value";s:6:"IGNORE";s:7:"keyword";s:6:"IGNORE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:52;}i:17;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:58;}i:18;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"KEY";s:5:"value";s:3:"KEY";s:7:"keyword";s:3:"KEY";s:4:"type";i:1;s:5:"flags";i:19;s:8:"position";i:59;}i:19;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:62;}i:20;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"FOR";s:5:"value";s:3:"FOR";s:7:"keyword";s:3:"FOR";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:63;}i:21;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:66;}i:22;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:8:"GROUP BY";s:5:"value";s:8:"GROUP BY";s:7:"keyword";s:8:"GROUP BY";s:4:"type";i:1;s:5:"flags";i:7;s:8:"position";i:67;}i:23;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:75;}i:24;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:76;}i:25;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"a";s:5:"value";s:1:"a";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:77;}i:26;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:",";s:5:"value";s:1:",";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:78;}i:27;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:79;}i:28;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"b";s:5:"value";s:1:"b";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:80;}i:29;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:",";s:5:"value";s:1:",";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:81;}i:30;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"c";s:5:"value";s:1:"c";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:82;}i:31;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:83;}i:32;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:84;}i:33;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"WHERE";s:5:"value";s:5:"WHERE";s:7:"keyword";s:5:"WHERE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:85;}i:34;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:90;}i:35;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:7:"city_id";s:5:"value";s:7:"city_id";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:91;}i:36;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"<";s:5:"value";s:1:"<";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:98;}i:37;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"0";s:5:"value";i:0;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:99;}i:38;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:100;}i:39;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:40;s:3:"idx";i:40;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:47:"PhpMyAdmin\SqlParser\Statements\SelectStatement":17:{s:4:"expr";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:1:"*";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:4:"from";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:7:"address";s:6:"column";N;s:4:"expr";s:7:"address";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:11:"index_hints";a:2:{i:0;O:41:"PhpMyAdmin\SqlParser\Components\IndexHint":4:{s:4:"type";s:5:"FORCE";s:10:"indexOrKey";s:5:"INDEX";s:3:"for";N;s:7:"indexes";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:16:"(idx_fk_city_id)";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}}i:1;O:41:"PhpMyAdmin\SqlParser\Components\IndexHint":4:{s:4:"type";s:6:"IGNORE";s:10:"indexOrKey";s:3:"KEY";s:3:"for";s:8:"GROUP BY";s:7:"indexes";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:8:"(a, b,c)";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}}}s:9:"partition";N;s:5:"where";a:1:{i:0;O:41:"PhpMyAdmin\SqlParser\Components\Condition":3:{s:11:"identifiers";a:1:{i:0;s:7:"city_id";}s:10:"isOperator";b:0;s:4:"expr";s:9:"city_id<0";}}s:5:"group";N;s:6:"having";N;s:5:"order";N;s:5:"limit";N;s:9:"procedure";N;s:4:"into";N;s:4:"join";N;s:5:"union";a:0:{}s:11:"end_options";N;s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}s:5:"first";i:0;s:4:"last";i:37;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}} \ No newline at end of file diff --git a/tests/data/parser/parseSelectIndexHint2.in b/tests/data/parser/parseSelectIndexHint2.in new file mode 100644 index 000000000..2022a163b --- /dev/null +++ b/tests/data/parser/parseSelectIndexHint2.in @@ -0,0 +1 @@ +SELECT * FROM address USE INDEX (idx_fk_city_id) FORCE KEY FOR GROUP BY (a, b,c) WHERE city_id<0 \ No newline at end of file diff --git a/tests/data/parser/parseSelectIndexHint2.out b/tests/data/parser/parseSelectIndexHint2.out new file mode 100644 index 000000000..9a5832f2c --- /dev/null +++ b/tests/data/parser/parseSelectIndexHint2.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:97:"SELECT * FROM address USE INDEX (idx_fk_city_id) FORCE KEY FOR GROUP BY (a, b,c) WHERE city_id<0";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:97:"SELECT * FROM address USE INDEX (idx_fk_city_id) FORCE KEY FOR GROUP BY (a, b,c) WHERE city_id<0";s:3:"len";i:97;s:4:"last";i:97;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:39:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"SELECT";s:5:"value";s:6:"SELECT";s:7:"keyword";s:6:"SELECT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:6;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"*";s:5:"value";s:1:"*";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:1;s:8:"position";i:8;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:9;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"FROM";s:5:"value";s:4:"FROM";s:7:"keyword";s:4:"FROM";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:10;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:14;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:7:"address";s:5:"value";s:7:"address";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:15;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:22;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"USE";s:5:"value";s:3:"USE";s:7:"keyword";s:3:"USE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:23;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:26;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"INDEX";s:5:"value";s:5:"INDEX";s:7:"keyword";s:5:"INDEX";s:4:"type";i:1;s:5:"flags";i:19;s:8:"position";i:27;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:32;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:33;}i:13;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:14:"idx_fk_city_id";s:5:"value";s:14:"idx_fk_city_id";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:34;}i:14;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:48;}i:15;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:49;}i:16;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"FORCE";s:5:"value";s:5:"FORCE";s:7:"keyword";s:5:"FORCE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:50;}i:17;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:55;}i:18;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"KEY";s:5:"value";s:3:"KEY";s:7:"keyword";s:3:"KEY";s:4:"type";i:1;s:5:"flags";i:19;s:8:"position";i:56;}i:19;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:59;}i:20;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"FOR";s:5:"value";s:3:"FOR";s:7:"keyword";s:3:"FOR";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:60;}i:21;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:63;}i:22;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:8:"GROUP BY";s:5:"value";s:8:"GROUP BY";s:7:"keyword";s:8:"GROUP BY";s:4:"type";i:1;s:5:"flags";i:7;s:8:"position";i:64;}i:23;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:72;}i:24;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:73;}i:25;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"a";s:5:"value";s:1:"a";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:74;}i:26;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:",";s:5:"value";s:1:",";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:75;}i:27;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:76;}i:28;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"b";s:5:"value";s:1:"b";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:77;}i:29;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:",";s:5:"value";s:1:",";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:78;}i:30;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"c";s:5:"value";s:1:"c";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:79;}i:31;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:80;}i:32;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:81;}i:33;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"WHERE";s:5:"value";s:5:"WHERE";s:7:"keyword";s:5:"WHERE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:82;}i:34;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:87;}i:35;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:7:"city_id";s:5:"value";s:7:"city_id";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:88;}i:36;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"<";s:5:"value";s:1:"<";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:95;}i:37;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"0";s:5:"value";i:0;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:96;}i:38;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:39;s:3:"idx";i:39;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:47:"PhpMyAdmin\SqlParser\Statements\SelectStatement":17:{s:4:"expr";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:1:"*";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:4:"from";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:7:"address";s:6:"column";N;s:4:"expr";s:7:"address";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:11:"index_hints";a:2:{i:0;O:41:"PhpMyAdmin\SqlParser\Components\IndexHint":4:{s:4:"type";s:3:"USE";s:10:"indexOrKey";s:5:"INDEX";s:3:"for";N;s:7:"indexes";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:16:"(idx_fk_city_id)";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}}i:1;O:41:"PhpMyAdmin\SqlParser\Components\IndexHint":4:{s:4:"type";s:5:"FORCE";s:10:"indexOrKey";s:3:"KEY";s:3:"for";s:8:"GROUP BY";s:7:"indexes";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:8:"(a, b,c)";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}}}s:9:"partition";N;s:5:"where";a:1:{i:0;O:41:"PhpMyAdmin\SqlParser\Components\Condition":3:{s:11:"identifiers";a:1:{i:0;s:7:"city_id";}s:10:"isOperator";b:0;s:4:"expr";s:9:"city_id<0";}}s:5:"group";N;s:6:"having";N;s:5:"order";N;s:5:"limit";N;s:9:"procedure";N;s:4:"into";N;s:4:"join";N;s:5:"union";a:0:{}s:11:"end_options";N;s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}s:5:"first";i:0;s:4:"last";i:37;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}} \ No newline at end of file diff --git a/tests/data/parser/parseSelectIndexHintErr1.in b/tests/data/parser/parseSelectIndexHintErr1.in new file mode 100644 index 000000000..160e22fd8 --- /dev/null +++ b/tests/data/parser/parseSelectIndexHintErr1.in @@ -0,0 +1 @@ +SELECT * FROM address FORCE INT (idx_fk_city_id); \ No newline at end of file diff --git a/tests/data/parser/parseSelectIndexHintErr1.out b/tests/data/parser/parseSelectIndexHintErr1.out new file mode 100644 index 000000000..60276d37e --- /dev/null +++ b/tests/data/parser/parseSelectIndexHintErr1.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:49:"SELECT * FROM address FORCE INT (idx_fk_city_id);";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:49:"SELECT * FROM address FORCE INT (idx_fk_city_id);";s:3:"len";i:49;s:4:"last";i:49;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:17:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"SELECT";s:5:"value";s:6:"SELECT";s:7:"keyword";s:6:"SELECT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:6;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"*";s:5:"value";s:1:"*";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:1;s:8:"position";i:7;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:8;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"FROM";s:5:"value";s:4:"FROM";s:7:"keyword";s:4:"FROM";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:9;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:13;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:7:"address";s:5:"value";s:7:"address";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:14;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:21;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"FORCE";s:5:"value";s:5:"FORCE";s:7:"keyword";s:5:"FORCE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:22;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:27;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"INT";s:5:"value";s:3:"INT";s:7:"keyword";s:3:"INT";s:4:"type";i:1;s:5:"flags";i:11;s:8:"position";i:28;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:31;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:32;}i:13;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:14:"idx_fk_city_id";s:5:"value";s:14:"idx_fk_city_id";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:33;}i:14;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:47;}i:15;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:48;}i:16;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:17;s:3:"idx";i:17;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:47:"PhpMyAdmin\SqlParser\Statements\SelectStatement":17:{s:4:"expr";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:1:"*";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:4:"from";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:7:"address";s:6:"column";N;s:4:"expr";s:7:"address";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:11:"index_hints";a:1:{i:0;O:41:"PhpMyAdmin\SqlParser\Components\IndexHint":4:{s:4:"type";s:5:"FORCE";s:10:"indexOrKey";N;s:3:"for";N;s:7:"indexes";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:16:"(idx_fk_city_id)";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}}}s:9:"partition";N;s:5:"where";N;s:5:"group";N;s:6:"having";N;s:5:"order";N;s:5:"limit";N;s:9:"procedure";N;s:4:"into";N;s:4:"join";N;s:5:"union";a:0:{}s:11:"end_options";N;s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}s:5:"first";i:0;s:4:"last";i:14;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:1:{i:0;a:3:{i:0;s:19:"Unexpected keyword.";i:1;r:79;i:2;i:0;}}}} \ No newline at end of file diff --git a/tests/data/parser/parseSelectIndexHintErr2.in b/tests/data/parser/parseSelectIndexHintErr2.in new file mode 100644 index 000000000..bb5a7a556 --- /dev/null +++ b/tests/data/parser/parseSelectIndexHintErr2.in @@ -0,0 +1 @@ +SELECT * FROM address FORCE abc (idx_fk_city_id); \ No newline at end of file diff --git a/tests/data/parser/parseSelectIndexHintErr2.out b/tests/data/parser/parseSelectIndexHintErr2.out new file mode 100644 index 000000000..9d7208923 --- /dev/null +++ b/tests/data/parser/parseSelectIndexHintErr2.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:49:"SELECT * FROM address FORCE abc (idx_fk_city_id);";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:49:"SELECT * FROM address FORCE abc (idx_fk_city_id);";s:3:"len";i:49;s:4:"last";i:49;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:17:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"SELECT";s:5:"value";s:6:"SELECT";s:7:"keyword";s:6:"SELECT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:6;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"*";s:5:"value";s:1:"*";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:1;s:8:"position";i:7;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:8;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"FROM";s:5:"value";s:4:"FROM";s:7:"keyword";s:4:"FROM";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:9;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:13;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:7:"address";s:5:"value";s:7:"address";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:14;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:21;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"FORCE";s:5:"value";s:5:"FORCE";s:7:"keyword";s:5:"FORCE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:22;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:27;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"abc";s:5:"value";s:3:"abc";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:28;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:31;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:32;}i:13;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:14:"idx_fk_city_id";s:5:"value";s:14:"idx_fk_city_id";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:33;}i:14;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:47;}i:15;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:48;}i:16;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:17;s:3:"idx";i:17;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:47:"PhpMyAdmin\SqlParser\Statements\SelectStatement":17:{s:4:"expr";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:1:"*";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:4:"from";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:7:"address";s:6:"column";N;s:4:"expr";s:7:"address";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:11:"index_hints";a:0:{}s:9:"partition";N;s:5:"where";N;s:5:"group";N;s:6:"having";N;s:5:"order";N;s:5:"limit";N;s:9:"procedure";N;s:4:"into";N;s:4:"join";N;s:5:"union";a:0:{}s:11:"end_options";N;s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}s:5:"first";i:0;s:4:"last";i:14;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:4:{i:0;a:3:{i:0;s:17:"Unexpected token.";i:1;r:79;i:2;i:0;}i:1;a:3:{i:0;s:17:"Unexpected token.";i:1;r:93;i:2;i:0;}i:2;a:3:{i:0;s:17:"Unexpected token.";i:1;r:100;i:2;i:0;}i:3;a:3:{i:0;s:17:"Unexpected token.";i:1;r:107;i:2;i:0;}}}} \ No newline at end of file diff --git a/tests/data/parser/parseSelectIndexHintErr3.in b/tests/data/parser/parseSelectIndexHintErr3.in new file mode 100644 index 000000000..c310c7e57 --- /dev/null +++ b/tests/data/parser/parseSelectIndexHintErr3.in @@ -0,0 +1 @@ +SELECT * FROM address FORCE INDEX FOR abc (idx_fk_city_id); \ No newline at end of file diff --git a/tests/data/parser/parseSelectIndexHintErr3.out b/tests/data/parser/parseSelectIndexHintErr3.out new file mode 100644 index 000000000..aba0e96d8 --- /dev/null +++ b/tests/data/parser/parseSelectIndexHintErr3.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:59:"SELECT * FROM address FORCE INDEX FOR abc (idx_fk_city_id);";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:59:"SELECT * FROM address FORCE INDEX FOR abc (idx_fk_city_id);";s:3:"len";i:59;s:4:"last";i:59;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:21:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"SELECT";s:5:"value";s:6:"SELECT";s:7:"keyword";s:6:"SELECT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:6;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"*";s:5:"value";s:1:"*";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:1;s:8:"position";i:7;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:8;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"FROM";s:5:"value";s:4:"FROM";s:7:"keyword";s:4:"FROM";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:9;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:13;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:7:"address";s:5:"value";s:7:"address";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:14;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:21;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"FORCE";s:5:"value";s:5:"FORCE";s:7:"keyword";s:5:"FORCE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:22;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:27;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"INDEX";s:5:"value";s:5:"INDEX";s:7:"keyword";s:5:"INDEX";s:4:"type";i:1;s:5:"flags";i:19;s:8:"position";i:28;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:33;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"FOR";s:5:"value";s:3:"FOR";s:7:"keyword";s:3:"FOR";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:34;}i:13;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:37;}i:14;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"abc";s:5:"value";s:3:"abc";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:38;}i:15;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:41;}i:16;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:42;}i:17;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:14:"idx_fk_city_id";s:5:"value";s:14:"idx_fk_city_id";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:43;}i:18;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:57;}i:19;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:58;}i:20;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:21;s:3:"idx";i:21;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:47:"PhpMyAdmin\SqlParser\Statements\SelectStatement":17:{s:4:"expr";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:1:"*";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:4:"from";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:7:"address";s:6:"column";N;s:4:"expr";s:7:"address";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:11:"index_hints";a:0:{}s:9:"partition";N;s:5:"where";N;s:5:"group";N;s:6:"having";N;s:5:"order";N;s:5:"limit";N;s:9:"procedure";N;s:4:"into";N;s:4:"join";N;s:5:"union";a:0:{}s:11:"end_options";N;s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}s:5:"first";i:0;s:4:"last";i:18;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:4:{i:0;a:3:{i:0;s:17:"Unexpected token.";i:1;r:107;i:2;i:0;}i:1;a:3:{i:0;s:17:"Unexpected token.";i:1;r:121;i:2;i:0;}i:2;a:3:{i:0;s:17:"Unexpected token.";i:1;r:128;i:2;i:0;}i:3;a:3:{i:0;s:17:"Unexpected token.";i:1;r:135;i:2;i:0;}}}} \ No newline at end of file diff --git a/tests/data/parser/parseSelectIndexHintErr4.in b/tests/data/parser/parseSelectIndexHintErr4.in new file mode 100644 index 000000000..b87acb90a --- /dev/null +++ b/tests/data/parser/parseSelectIndexHintErr4.in @@ -0,0 +1 @@ +SELECT * FROM address FORCE INDEX FOR INT (idx_fk_city_id); \ No newline at end of file diff --git a/tests/data/parser/parseSelectIndexHintErr4.out b/tests/data/parser/parseSelectIndexHintErr4.out new file mode 100644 index 000000000..c4908e726 --- /dev/null +++ b/tests/data/parser/parseSelectIndexHintErr4.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:59:"SELECT * FROM address FORCE INDEX FOR INT (idx_fk_city_id);";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:59:"SELECT * FROM address FORCE INDEX FOR INT (idx_fk_city_id);";s:3:"len";i:59;s:4:"last";i:59;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:21:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"SELECT";s:5:"value";s:6:"SELECT";s:7:"keyword";s:6:"SELECT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:6;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"*";s:5:"value";s:1:"*";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:1;s:8:"position";i:7;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:8;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"FROM";s:5:"value";s:4:"FROM";s:7:"keyword";s:4:"FROM";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:9;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:13;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:7:"address";s:5:"value";s:7:"address";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:14;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:21;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"FORCE";s:5:"value";s:5:"FORCE";s:7:"keyword";s:5:"FORCE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:22;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:27;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"INDEX";s:5:"value";s:5:"INDEX";s:7:"keyword";s:5:"INDEX";s:4:"type";i:1;s:5:"flags";i:19;s:8:"position";i:28;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:33;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"FOR";s:5:"value";s:3:"FOR";s:7:"keyword";s:3:"FOR";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:34;}i:13;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:37;}i:14;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"INT";s:5:"value";s:3:"INT";s:7:"keyword";s:3:"INT";s:4:"type";i:1;s:5:"flags";i:11;s:8:"position";i:38;}i:15;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:41;}i:16;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:42;}i:17;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:14:"idx_fk_city_id";s:5:"value";s:14:"idx_fk_city_id";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:43;}i:18;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:57;}i:19;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:58;}i:20;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:21;s:3:"idx";i:21;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:47:"PhpMyAdmin\SqlParser\Statements\SelectStatement":17:{s:4:"expr";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:1:"*";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:4:"from";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:7:"address";s:6:"column";N;s:4:"expr";s:7:"address";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:11:"index_hints";a:1:{i:0;O:41:"PhpMyAdmin\SqlParser\Components\IndexHint":4:{s:4:"type";s:5:"FORCE";s:10:"indexOrKey";s:5:"INDEX";s:3:"for";N;s:7:"indexes";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:16:"(idx_fk_city_id)";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}}}s:9:"partition";N;s:5:"where";N;s:5:"group";N;s:6:"having";N;s:5:"order";N;s:5:"limit";N;s:9:"procedure";N;s:4:"into";N;s:4:"join";N;s:5:"union";a:0:{}s:11:"end_options";N;s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}s:5:"first";i:0;s:4:"last";i:18;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:1:{i:0;a:3:{i:0;s:19:"Unexpected keyword.";i:1;r:107;i:2;i:0;}}}} \ No newline at end of file diff --git a/tests/data/parser/parseSelectJoinStraight.in b/tests/data/parser/parseSelectJoinStraight.in new file mode 100644 index 000000000..2fd532ea2 --- /dev/null +++ b/tests/data/parser/parseSelectJoinStraight.in @@ -0,0 +1,3 @@ +SELECT id,aval1,cval1 +FROM table111 +STRAIGHT_JOIN table113 on table111.a = table113.b \ No newline at end of file diff --git a/tests/data/parser/parseSelectJoinStraight.out b/tests/data/parser/parseSelectJoinStraight.out new file mode 100644 index 000000000..dd27ab743 --- /dev/null +++ b/tests/data/parser/parseSelectJoinStraight.out @@ -0,0 +1,7 @@ +a:4:{s:5:"query";s:85:"SELECT id,aval1,cval1 +FROM table111 +STRAIGHT_JOIN table113 on table111.a = table113.b";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:85:"SELECT id,aval1,cval1 +FROM table111 +STRAIGHT_JOIN table113 on table111.a = table113.b";s:3:"len";i:85;s:4:"last";i:85;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:28:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"SELECT";s:5:"value";s:6:"SELECT";s:7:"keyword";s:6:"SELECT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:6;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"id";s:5:"value";s:2:"id";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:7;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:",";s:5:"value";s:1:",";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:9;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"aval1";s:5:"value";s:5:"aval1";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:10;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:",";s:5:"value";s:1:",";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:15;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"cval1";s:5:"value";s:5:"cval1";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:16;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" +";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:21;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"FROM";s:5:"value";s:4:"FROM";s:7:"keyword";s:4:"FROM";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:22;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:26;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:8:"table111";s:5:"value";s:8:"table111";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:27;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" +";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:35;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:13:"STRAIGHT_JOIN";s:5:"value";s:13:"STRAIGHT_JOIN";s:7:"keyword";s:13:"STRAIGHT_JOIN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:36;}i:13;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:49;}i:14;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:8:"table113";s:5:"value";s:8:"table113";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:50;}i:15;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:58;}i:16;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"on";s:5:"value";s:2:"ON";s:7:"keyword";s:2:"ON";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:59;}i:17;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:61;}i:18;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:8:"table111";s:5:"value";s:8:"table111";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:62;}i:19;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:".";s:5:"value";s:1:".";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:70;}i:20;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"a";s:5:"value";s:1:"a";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:71;}i:21;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:72;}i:22;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"=";s:5:"value";s:1:"=";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:73;}i:23;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:74;}i:24;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:8:"table113";s:5:"value";s:8:"table113";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:75;}i:25;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:".";s:5:"value";s:1:".";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:83;}i:26;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"b";s:5:"value";s:1:"b";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:84;}i:27;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:28;s:3:"idx";i:28;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:47:"PhpMyAdmin\SqlParser\Statements\SelectStatement":16:{s:4:"expr";a:3:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:2:"id";s:4:"expr";s:2:"id";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}i:1;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:5:"aval1";s:4:"expr";s:5:"aval1";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}i:2;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:5:"cval1";s:4:"expr";s:5:"cval1";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:4:"from";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:8:"table111";s:6:"column";N;s:4:"expr";s:8:"table111";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:9:"partition";N;s:5:"where";N;s:5:"group";N;s:6:"having";N;s:5:"order";N;s:5:"limit";N;s:9:"procedure";N;s:4:"into";N;s:4:"join";a:1:{i:0;O:43:"PhpMyAdmin\SqlParser\Components\JoinKeyword":4:{s:4:"type";s:8:"STRAIGHT";s:4:"expr";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:8:"table113";s:6:"column";N;s:4:"expr";s:8:"table113";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:2:"on";a:1:{i:0;O:41:"PhpMyAdmin\SqlParser\Components\Condition":3:{s:11:"identifiers";a:4:{i:0;s:8:"table111";i:1;s:1:"a";i:2;s:8:"table113";i:3;s:1:"b";}s:10:"isOperator";b:0;s:4:"expr";s:23:"table111.a = table113.b";}}s:5:"using";N;}}s:5:"union";a:0:{}s:11:"end_options";N;s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}s:5:"first";i:0;s:4:"last";i:26;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}} \ No newline at end of file diff --git a/tests/data/parser/parseSetNames2.in b/tests/data/parser/parseSetNames2.in new file mode 100644 index 000000000..e39b644ab --- /dev/null +++ b/tests/data/parser/parseSetNames2.in @@ -0,0 +1 @@ +SET NAMES 'utf8' COLLATE 'utf8_general_ci' \ No newline at end of file diff --git a/tests/data/parser/parseSetNames2.out b/tests/data/parser/parseSetNames2.out new file mode 100644 index 000000000..aaa25051d --- /dev/null +++ b/tests/data/parser/parseSetNames2.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:42:"SET NAMES 'utf8' COLLATE 'utf8_general_ci'";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:42:"SET NAMES 'utf8' COLLATE 'utf8_general_ci'";s:3:"len";i:42;s:4:"last";i:42;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:10:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"SET";s:5:"value";s:3:"SET";s:7:"keyword";s:3:"SET";s:4:"type";i:1;s:5:"flags";i:11;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:3;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"NAMES";s:5:"value";s:5:"NAMES";s:7:"keyword";s:5:"NAMES";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:4;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:9;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"'utf8'";s:5:"value";s:4:"utf8";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:1;s:8:"position";i:10;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:16;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:7:"COLLATE";s:5:"value";s:7:"COLLATE";s:7:"keyword";s:7:"COLLATE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:17;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:24;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:17:"'utf8_general_ci'";s:5:"value";s:15:"utf8_general_ci";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:1;s:8:"position";i:25;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:10;s:3:"idx";i:10;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:44:"PhpMyAdmin\SqlParser\Statements\SetStatement":5:{s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:3;a:4:{s:4:"name";s:5:"NAMES";s:6:"equals";b:0;s:4:"expr";s:6:"'utf8'";s:5:"value";s:4:"utf8";}}}s:11:"end_options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:1;a:4:{s:4:"name";s:7:"COLLATE";s:6:"equals";b:0;s:4:"expr";s:17:"'utf8_general_ci'";s:5:"value";s:15:"utf8_general_ci";}}}s:3:"set";a:0:{}s:5:"first";i:0;s:4:"last";i:8;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}} \ No newline at end of file diff --git a/tests/data/parser/parseSetNames3.in b/tests/data/parser/parseSetNames3.in new file mode 100644 index 000000000..691dd0869 --- /dev/null +++ b/tests/data/parser/parseSetNames3.in @@ -0,0 +1 @@ +SET NAMES 'utf8' DEFAULT; \ No newline at end of file diff --git a/tests/data/parser/parseSetNames3.out b/tests/data/parser/parseSetNames3.out new file mode 100644 index 000000000..60e5c90db --- /dev/null +++ b/tests/data/parser/parseSetNames3.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:25:"SET NAMES 'utf8' DEFAULT;";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:25:"SET NAMES 'utf8' DEFAULT;";s:3:"len";i:25;s:4:"last";i:25;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:9:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"SET";s:5:"value";s:3:"SET";s:7:"keyword";s:3:"SET";s:4:"type";i:1;s:5:"flags";i:11;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:3;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"NAMES";s:5:"value";s:5:"NAMES";s:7:"keyword";s:5:"NAMES";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:4;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:9;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"'utf8'";s:5:"value";s:4:"utf8";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:1;s:8:"position";i:10;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:16;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:7:"DEFAULT";s:5:"value";s:7:"DEFAULT";s:7:"keyword";s:7:"DEFAULT";s:4:"type";i:1;s:5:"flags";i:35;s:8:"position";i:17;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:24;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:9;s:3:"idx";i:9;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:44:"PhpMyAdmin\SqlParser\Statements\SetStatement":5:{s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:3;a:4:{s:4:"name";s:5:"NAMES";s:6:"equals";b:0;s:4:"expr";s:6:"'utf8'";s:5:"value";s:4:"utf8";}}}s:11:"end_options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:1;s:7:"DEFAULT";}}s:3:"set";a:0:{}s:5:"first";i:0;s:4:"last";i:6;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}} \ No newline at end of file diff --git a/tests/data/parser/parseSetNamesError2.in b/tests/data/parser/parseSetNamesError2.in new file mode 100644 index 000000000..069c1a78f --- /dev/null +++ b/tests/data/parser/parseSetNamesError2.in @@ -0,0 +1 @@ +SET NAMES 'utf8' DEFAULT 'utf8_general_ci' \ No newline at end of file diff --git a/tests/data/parser/parseSetNamesError2.out b/tests/data/parser/parseSetNamesError2.out new file mode 100644 index 000000000..c4d6c74b5 --- /dev/null +++ b/tests/data/parser/parseSetNamesError2.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:42:"SET NAMES 'utf8' DEFAULT 'utf8_general_ci'";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:42:"SET NAMES 'utf8' DEFAULT 'utf8_general_ci'";s:3:"len";i:42;s:4:"last";i:42;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:10:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"SET";s:5:"value";s:3:"SET";s:7:"keyword";s:3:"SET";s:4:"type";i:1;s:5:"flags";i:11;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:3;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"NAMES";s:5:"value";s:5:"NAMES";s:7:"keyword";s:5:"NAMES";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:4;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:9;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"'utf8'";s:5:"value";s:4:"utf8";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:1;s:8:"position";i:10;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:16;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:7:"DEFAULT";s:5:"value";s:7:"DEFAULT";s:7:"keyword";s:7:"DEFAULT";s:4:"type";i:1;s:5:"flags";i:35;s:8:"position";i:17;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:24;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:17:"'utf8_general_ci'";s:5:"value";s:15:"utf8_general_ci";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:1;s:8:"position";i:25;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:10;s:3:"idx";i:10;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:44:"PhpMyAdmin\SqlParser\Statements\SetStatement":5:{s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:3;a:4:{s:4:"name";s:5:"NAMES";s:6:"equals";b:0;s:4:"expr";s:6:"'utf8'";s:5:"value";s:4:"utf8";}}}s:11:"end_options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:1;s:7:"DEFAULT";}}s:3:"set";a:0:{}s:5:"first";i:0;s:4:"last";i:8;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:1:{i:0;a:3:{i:0;s:17:"Unexpected token.";i:1;r:65;i:2;i:0;}}}} \ No newline at end of file diff --git a/tests/data/parser/parseSetNamesError3.in b/tests/data/parser/parseSetNamesError3.in new file mode 100644 index 000000000..1721acbcc --- /dev/null +++ b/tests/data/parser/parseSetNamesError3.in @@ -0,0 +1 @@ +SET NAMES 'utf8' COLLATE \ No newline at end of file diff --git a/tests/data/parser/parseSetNamesError3.out b/tests/data/parser/parseSetNamesError3.out new file mode 100644 index 000000000..a33d19827 --- /dev/null +++ b/tests/data/parser/parseSetNamesError3.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:24:"SET NAMES 'utf8' COLLATE";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:24:"SET NAMES 'utf8' COLLATE";s:3:"len";i:24;s:4:"last";i:24;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:8:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"SET";s:5:"value";s:3:"SET";s:7:"keyword";s:3:"SET";s:4:"type";i:1;s:5:"flags";i:11;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:3;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"NAMES";s:5:"value";s:5:"NAMES";s:7:"keyword";s:5:"NAMES";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:4;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:9;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"'utf8'";s:5:"value";s:4:"utf8";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:1;s:8:"position";i:10;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:16;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:7:"COLLATE";s:5:"value";s:7:"COLLATE";s:7:"keyword";s:7:"COLLATE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:17;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:8;s:3:"idx";i:8;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:44:"PhpMyAdmin\SqlParser\Statements\SetStatement":5:{s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:3;a:4:{s:4:"name";s:5:"NAMES";s:6:"equals";b:0;s:4:"expr";s:6:"'utf8'";s:5:"value";s:4:"utf8";}}}s:11:"end_options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:1;a:4:{s:4:"name";s:7:"COLLATE";s:6:"equals";b:0;s:4:"expr";s:0:"";s:5:"value";s:0:"";}}}s:3:"set";a:0:{}s:5:"first";i:0;s:4:"last";i:6;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:1:{i:0;a:3:{i:0;s:53:"Value/Expression for the option COLLATE was expected.";i:1;r:51;i:2;i:0;}}}} \ No newline at end of file diff --git a/tests/data/parser/parseUnlock1.in b/tests/data/parser/parseUnlock1.in new file mode 100644 index 000000000..bff5b2a2c --- /dev/null +++ b/tests/data/parser/parseUnlock1.in @@ -0,0 +1 @@ +UNLOCK TABLES; \ No newline at end of file diff --git a/tests/data/parser/parseUnlock1.out b/tests/data/parser/parseUnlock1.out new file mode 100644 index 000000000..044bfab7f --- /dev/null +++ b/tests/data/parser/parseUnlock1.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:14:"UNLOCK TABLES;";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:14:"UNLOCK TABLES;";s:3:"len";i:14;s:4:"last";i:14;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:5:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"UNLOCK";s:5:"value";s:6:"UNLOCK";s:7:"keyword";s:6:"UNLOCK";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:6;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"TABLES";s:5:"value";s:6:"TABLES";s:7:"keyword";s:6:"TABLES";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:7;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:13;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:5;s:3:"idx";i:5;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:45:"PhpMyAdmin\SqlParser\Statements\LockStatement":5:{s:6:"locked";a:0:{}s:6:"isLock";b:0;s:7:"options";N;s:5:"first";i:0;s:4:"last";i:3;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}} \ No newline at end of file diff --git a/tests/data/parser/parseUnlockErr1.in b/tests/data/parser/parseUnlockErr1.in new file mode 100644 index 000000000..2c0afd46c --- /dev/null +++ b/tests/data/parser/parseUnlockErr1.in @@ -0,0 +1 @@ +UNLOCK TABLES abc; \ No newline at end of file diff --git a/tests/data/parser/parseUnlockErr1.out b/tests/data/parser/parseUnlockErr1.out new file mode 100644 index 000000000..6e3757278 --- /dev/null +++ b/tests/data/parser/parseUnlockErr1.out @@ -0,0 +1 @@ +a:4:{s:5:"query";s:18:"UNLOCK TABLES abc;";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:18:"UNLOCK TABLES abc;";s:3:"len";i:18;s:4:"last";i:18;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:7:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"UNLOCK";s:5:"value";s:6:"UNLOCK";s:7:"keyword";s:6:"UNLOCK";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:6;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"TABLES";s:5:"value";s:6:"TABLES";s:7:"keyword";s:6:"TABLES";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:7;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:13;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"abc";s:5:"value";s:3:"abc";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:14;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:17;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:7;s:3:"idx";i:7;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:45:"PhpMyAdmin\SqlParser\Statements\LockStatement":5:{s:6:"locked";a:0:{}s:6:"isLock";b:0;s:7:"options";N;s:5:"first";i:0;s:4:"last";i:4;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:1:{i:0;a:3:{i:0;s:17:"Unexpected token.";i:1;r:37;i:2;i:0;}}}} \ No newline at end of file diff --git a/tests/data/parser/parseUpdateErr.in b/tests/data/parser/parseUpdateErr.in new file mode 100644 index 000000000..d2caecb14 --- /dev/null +++ b/tests/data/parser/parseUpdateErr.in @@ -0,0 +1,7 @@ +-- extraneous comma +UPDATE + users +SET + username = "Dan", + id=155, +WHERE 1 = 1; \ No newline at end of file diff --git a/tests/data/parser/parseUpdateErr.out b/tests/data/parser/parseUpdateErr.out new file mode 100644 index 000000000..af8b028bc --- /dev/null +++ b/tests/data/parser/parseUpdateErr.out @@ -0,0 +1,19 @@ +a:4:{s:5:"query";s:87:"-- extraneous comma +UPDATE + users +SET + username = "Dan", + id=155, +WHERE 1 = 1;";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:87:"-- extraneous comma +UPDATE + users +SET + username = "Dan", + id=155, +WHERE 1 = 1;";s:3:"len";i:87;s:4:"last";i:87;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:29:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:19:"-- extraneous comma";s:5:"value";s:19:"-- extraneous comma";s:7:"keyword";N;s:4:"type";i:4;s:5:"flags";i:4;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" +";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:19;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"UPDATE";s:5:"value";s:6:"UPDATE";s:7:"keyword";s:6:"UPDATE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:20;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:" + ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:26;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"users";s:5:"value";s:5:"users";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:31;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" +";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:36;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"SET";s:5:"value";s:3:"SET";s:7:"keyword";s:3:"SET";s:4:"type";i:1;s:5:"flags";i:11;s:8:"position";i:37;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:" + ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:40;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:8:"username";s:5:"value";s:8:"username";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:45;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:53;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"=";s:5:"value";s:1:"=";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:54;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:55;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:""Dan"";s:5:"value";s:3:"Dan";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:2;s:8:"position";i:56;}i:13;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:",";s:5:"value";s:1:",";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:61;}i:14;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:" + ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:62;}i:15;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"id";s:5:"value";s:2:"id";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:67;}i:16;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"=";s:5:"value";s:1:"=";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:69;}i:17;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"155";s:5:"value";i:155;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:70;}i:18;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:",";s:5:"value";s:1:",";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:73;}i:19;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" +";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:74;}i:20;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"WHERE";s:5:"value";s:5:"WHERE";s:7:"keyword";s:5:"WHERE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:75;}i:21;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:80;}i:22;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"1";s:5:"value";i:1;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:81;}i:23;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:82;}i:24;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"=";s:5:"value";s:1:"=";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:83;}i:25;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:84;}i:26;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"1";s:5:"value";i:1;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:85;}i:27;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:86;}i:28;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:29;s:3:"idx";i:29;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:47:"PhpMyAdmin\SqlParser\Statements\UpdateStatement":8:{s:6:"tables";a:1:{i:0;O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:5:"users";s:6:"column";N;s:4:"expr";s:5:"users";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:3:"set";a:2:{i:0;O:44:"PhpMyAdmin\SqlParser\Components\SetOperation":2:{s:6:"column";s:8:"username";s:5:"value";s:5:""Dan"";}i:1;O:44:"PhpMyAdmin\SqlParser\Components\SetOperation":2:{s:6:"column";s:2:"id";s:5:"value";s:3:"155";}}s:5:"where";a:1:{i:0;O:41:"PhpMyAdmin\SqlParser\Components\Condition":3:{s:11:"identifiers";a:0:{}s:10:"isOperator";b:0;s:4:"expr";s:5:"1 = 1";}}s:5:"order";N;s:5:"limit";N;s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}s:5:"first";i:0;s:4:"last";i:26;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:1:{i:0;a:3:{i:0;s:17:"Unexpected token.";i:1;r:135;i:2;i:0;}}}} \ No newline at end of file diff --git a/tools/ContextGenerator.php b/tools/ContextGenerator.php index dccc15544..503c0e92f 100644 --- a/tools/ContextGenerator.php +++ b/tools/ContextGenerator.php @@ -131,7 +131,7 @@ public static function readWords(array $files) $types = array(); - for ($i = 0, $count = count($words); $i != $count; ++$i) { + for ($i = 0, $count = count($words); $i !== $count; ++$i) { $type = 1; $value = trim($words[$i]); @@ -198,17 +198,17 @@ public static function printWords($words, $spaces = 8, $line = 80) $i = 0; foreach ($wordsByLen as $word) { - if ($i == 0) { + if ($i === 0) { $ret .= str_repeat(' ', $spaces); } $ret .= sprintf('\'%s\' => %s, ', $word, $type); - if (++$i == $count) { + if (++$i === $count) { $ret .= "\n"; $i = 0; } } - if ($i != 0) { + if ($i !== 0) { $ret .= "\n"; } } @@ -272,7 +272,7 @@ public static function formatName($name) /* Parse version to array */ $ver_str = $parts[2]; - if (strlen($ver_str) % 2 == 1) { + if (strlen($ver_str) % 2 === 1) { $ver_str = '0' . $ver_str; } $version = array_map('intval', str_split($ver_str, 2)); diff --git a/tools/sami-config.php b/tools/sami-config.php new file mode 100644 index 000000000..39db4ed60 --- /dev/null +++ b/tools/sami-config.php @@ -0,0 +1,22 @@ + +files() + ->name("*.php") + ->in("./src") +; + +return new Sami($iterator, array( + "title" => "A validating SQL lexer and parser with a focus on MySQL dialect.", + "build_dir" => "./doc/", + "cache_dir" => "./tmp" +)); +