From b1ca941675c17e05e8a1b65af5ddec4b86c75c58 Mon Sep 17 00:00:00 2001 From: William Desportes Date: Tue, 5 Jun 2018 23:07:26 +0200 Subject: [PATCH 01/54] Replace apigen with Sami in CI - Removed apigen/apigen - Added sami/sami - Generated a configuration and added it in /tools/ as config-sami.php - Modified .travis.yml Closes: #194 Signed-off-by: William Desportes --- .travis.yml | 6 +++--- composer.json | 2 +- tools/sami-config.php | 22 ++++++++++++++++++++++ 3 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 tools/sami-config.php diff --git a/.travis.yml b/.travis.yml index 9b0becf3a..5d1570ec8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,7 +19,7 @@ matrix: allow_failures: - php: "nightly" include: - - php: "7.1" + - php: "7.2" env: DOCS=yes - php: "7.1" env: REQUIRE="phpmyadmin/motranslator:^3.0" @@ -29,7 +29,7 @@ matrix: sudo: false install: - - if [ "$TRAVIS_PHP_VERSION" = "5.3" ] ; then sed -i '/apigen/D' composer.json ; fi + - if [ $(php -r "echo PHP_MAJOR_VERSION;") -lt 7 ] ; then sed -i '/sami/D' composer.json ; fi - if [ -n "$REQUIRE" ] ; then composer require "$REQUIRE" ; fi - composer install @@ -42,4 +42,4 @@ 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 + - if [ "$DOCS" = "yes" ] ; then ./vendor/bin/sami.php --no-interaction update ./tools/sami-config.php ; fi diff --git a/composer.json b/composer.json index 7ef31f21b..d6e1c0970 100644 --- a/composer.json +++ b/composer.json @@ -20,7 +20,7 @@ "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" }, 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" +)); + From 981c49945a96d53513af61e27effbf5eb5bb35c0 Mon Sep 17 00:00:00 2001 From: William Desportes Date: Wed, 6 Jun 2018 00:03:37 +0200 Subject: [PATCH 02/54] PHPDOC fix - Added phpdoc for $options as requested by Sami Signed-off-by: William Desportes --- src/Components/CaseExpression.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Components/CaseExpression.php b/src/Components/CaseExpression.php index 111eb042e..820947bfb 100644 --- a/src/Components/CaseExpression.php +++ b/src/Components/CaseExpression.php @@ -72,6 +72,7 @@ public function __construct() /** * @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 */ From ffd2d899212e10c85d58ad213904fbb1671599f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=DB=8B=D9=88=D9=84=D9=82=D8=A7=D9=86?= Date: Thu, 7 Jun 2018 01:34:16 +0000 Subject: [PATCH 03/54] Translated using Weblate (Uyghur) Currently translated at 2.2% (1 of 44 strings) [CI skip] --- locale/ug/LC_MESSAGES/sqlparser.mo | Bin 522 -> 543 bytes locale/ug/LC_MESSAGES/sqlparser.po | 16 +++++++--------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/locale/ug/LC_MESSAGES/sqlparser.mo b/locale/ug/LC_MESSAGES/sqlparser.mo index 607d073674df586e055e7802fda3a019f698bfc5..d8bd2e8a5f997a80e46e3e2afae5c70ee2991f53 100644 GIT binary patch delta 352 zcmXBQze~eF6bJBBJCuNfP7V$yE{Z-$TPr2~fzd=8NSczSYTZtIq?I&@cgfI65D|2f z;_O&(=pW!;k}m!&zUqSyj|ca?JKkIVGynLrk^hjeR?rqYK&z;ZmeoQ9WTNk!B)Qnv z(HaJD{L5jJB*uBf$xcz~@aUf1C14KVl5sJLLY4F;{xIcaHy+0JL>r7p;hyZWIO3HA zY~havaGLr8yhtT-$MN8dGn!x$beb@gl$2r>lw(k;L@BFB<@fof+cz{9YzK6Wv>eqo z_ivoGAzM@=;Bgv?fF==F$$8JRNL#ZFQa5bPv`#c#ca3hhiAO^}r9K0X(ed(&QATBjrOyma=&^%f7PN;(779 Icv>#v7uF_UH2?qr delta 296 zcmX|(u}Z{16h$|f#@Gq6jmQ*s`oc^!7^5qTSZ2{(V`cS7hGZaPA*b>u zk24#UpEdH#ORz3FEI6bbWlU~FzvG0iv_t)^bHBk(NLzIZs}b$LoZ))lhmiBRH~0od CZBP&Z 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 From a7b6b8ca2c6eb138f08223860153126af77d2e37 Mon Sep 17 00:00:00 2001 From: Pedro Silva Date: Mon, 25 Jun 2018 20:58:25 +0000 Subject: [PATCH 04/54] Translated using Weblate (Portuguese) Currently translated at 15.9% (7 of 44 strings) [CI skip] --- locale/pt/LC_MESSAGES/sqlparser.mo | Bin 676 -> 1284 bytes locale/pt/LC_MESSAGES/sqlparser.po | 18 ++++++++++-------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/locale/pt/LC_MESSAGES/sqlparser.mo b/locale/pt/LC_MESSAGES/sqlparser.mo index 0f11d03cf050686e95d02304a52a75871e325f00..11484e7bd00862f8d477ec91b735080ba9b75673 100644 GIT binary patch literal 1284 zcmZ`&%WfP+6zz}z(Xb0_kXYPEu@p#ZUO|!7wj(-rJ6M{rNA{RU#HPl5JyS_{RZ~?x zli9H26WAfK$btnM7WsoHQt|^V*^@ONz^U$;m`Kpl(V6Z#b?#&C{qx$DpCUY0flq+% zfDeG5f$+QpJ_B9>1K@998%Qoi5rKaIe+2#od>#A@{2}-c@C)EIu!;BIFGtY{_%HAS z@XnPe+5rCu4sm}2UkASge++&N#?=V&=sh4j?=)2BisR^g;N8`?Xrp%{qq)p0cC=v2 z#7{~-^PJtLN#*I>R63)L{*A01C8T*l&P&e)YflU5n)61g4P~6GLV30{VZUJ3q&!I& z_!(1ad9F<5$Y_R{CR4IjdP);3&mMD#mFH%`8BLZX$>EDRf0G(wtuy=2%ORNy!J+Y_ ziZZVgh2xTaJ37^C0Word`EGKOhFg}MQ%3(=@tBtjV^Q_Unn!4eILO3TY=bPOk+Hs- zqGe1s%UL;GCRw5Mr>$cyaUzCpsxooEnmREyF||fVW3g*ldR!KJXkSeIZf{d`?~49i z>feb!@7?P5yIlyyF`5*DtaRU|$*~w7iM@orJc@@0w;moHrmcZ=UW~2OE|=cenD$Qx z13FBGDQ&02bPvFLFW2c?6 zDcW^VU9ps*x{muk7p1h0ZKw2|3+I?h-x?ka(~JJ}+TGT!(H>JG#>*1*dVbiMtFpBhZ6!U(OTvN6!CXH~IY0YtHo_^?p9B*s8X^usD+F^KS#6UGc#i3_12 zbM|56rkTN`*9SE9w XCzM|IDjLaL&aD)6lIX(f0O9`ue@ci- delta 316 zcmX}kO-sW-5C-5)njXwiJy=oMo@GNetsjI6rFt{PYV!j+n572u#qKuHyQdz!EM9vO z1b>vE2M_)VClva^!!R$yytwb}+1IY~MldaOg!-tBBGhDt_7R{xRHGk@kQL76KDPZ8WuKBi(VR|3Y3ZxQ}`tF0MN~zgc&C`U97IVeoGNf8Up)$~=RKx12 z%9oJjY2g(@yOX<^T}uHvEem!7T7)$4`33VYS->d|!n3}a*ax?pk~4lzeIE9Dr#{Aw zKxr0lzlU@T#X@92r)gFL9pszUQ_VV5&r9#I%*}`WYj>~AYpb&pc$~9D)UNq-PRyTk F_zxROOvL~I diff --git a/locale/pt/LC_MESSAGES/sqlparser.po b/locale/pt/LC_MESSAGES/sqlparser.po index cbbccc8cc..6bb116359 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-06-26 21:41+0000\n" +"Last-Translator: Pedro Silva \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.1-dev\n" #: src/Component.php:43 src/Component.php:63 msgid "Not implemented yet." @@ -23,6 +23,8 @@ 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 @@ -33,15 +35,15 @@ msgstr "Tabela de operações em ícones" #: 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,7 +62,7 @@ msgstr "Palavra-chave inesperada." #: src/Components/CaseExpression.php:199 msgid "Unexpected end of CASE expression" -msgstr "" +msgstr "Fim da expressão CASE inesperado" #: src/Components/CreateDefinition.php:223 msgid "" From 4ab8ce37f85ad5d13823aece8a398f91375f89dd Mon Sep 17 00:00:00 2001 From: Name Date: Fri, 29 Jun 2018 00:44:37 +0000 Subject: [PATCH 05/54] Translated using Weblate (Vietnamese) Currently translated at 93.1% (41 of 44 strings) [CI skip] --- locale/vi/LC_MESSAGES/sqlparser.mo | Bin 4276 -> 4527 bytes locale/vi/LC_MESSAGES/sqlparser.po | 8 +++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/locale/vi/LC_MESSAGES/sqlparser.mo b/locale/vi/LC_MESSAGES/sqlparser.mo index d68197a8860e3dbd7d677178b8fb28e9a91c38fd..cf651106b941303e96e1e884d902125ae455706a 100644 GIT binary patch delta 1377 zcmYMzO>7%Q6u|L`>$IuEN1HaKP+BG}ZPS#EwocU)6C_;hsu6Y*IR*)CoAqK_v3G-a zHz9{&Bzi`wLWKCJASy_FsA`2PA=SN9MwR$D^uP%ak}s{`!l|4%@PBIyM%ny4Z)a!U zyqUc*cI{B}_mTL9qD^o;$yFOr>N&g>;~(vdExmhR;u!s(@hSYfAKw#KDn~z!8s9}5 zui+ltHK^19oWOlJi;tm$GfFkp1%7A(H}M(#73Bp(TX`7AaU5sx33U4LxA6%5_i#71 z@oBt^NAW@5{o9l}NI#3Gv4XPL%_!bf>L-4T68H-r#lfN8N=H!=m_|wHCESTixF0W| ztmGq<=UXTh{2pbc_mDpo+pg3@IE=Tc?p}PB{x1o}@qV>?xc34Rr|8e)B3?w9@IJne zab}SheT*mZ8EQi`?qi}{)W@|0GqN$#v{EIXYhIYuj66- z3}x?r==%psLPL~EN_ZG^IFIM>GEU+>lyRdwdRv=Bll}tAd>8R3UfH1vQQ*gZ;7^o2 z9HGuK!89JjB97o&C?&mwvgaQn75%S~pW3>9JGN{6ZY0plodn=noF|h082X)odWhQYEpPi#K1X zI)M!E9X-BWSi<9P)oi+8({KnYozqqmvcFNKAq3%nQT5in|mRh$rQ2+3+v(bf3{6co-j(zN-Inx2bw|W zD_1X8yX|*E9o)IzZC`QAlRDpRe-P-P+x}WFRlLro4jSQ_cFWNKn^@8^$MkoX z`cc2zzN$;z_UGJkD|fEzTIW+;@69A{v7?`Lg8k?1PHU&OJDWB$d)=Gg+S<3m)+fWG GgZ~0n|M7SL delta 1118 zcmX}rUr19?9Ki9TPHl5$X{K4`HOrZH$9AV^%ScT61BF-N+M?P^5fh zh@F%zl(7<}_Tb}Eeu%qeN_FBrY{ggDf?tdM6)vSBw1cSO3~t0(+=|a|GcIETu3$g9 z%kB4b>Hw8pbi`2xzKM0Xh#mMEn{cJr@2ya(owkM>@E~r-)9Ay?MHg@z?IrBP-zXc= zE1mvPtXDauE>fxC!3~rh&Y>*eCCY+6;ClRn&FEg^?8JxlwD+N8ZUkkg8RSo0=f{h8 z@I6_5fV*j*_c-r8#TMpQZ>WUu2cE&!Drdl}C=<+KH$F$n#CMd1RWf=MeJBgNgzb1A z<@pP2#4p&3e^HLcsCG7b7;}5+I7ej%E})#*+oC^Fc2>RCNnIyKXpi6_oJT)?LwT=> zG-}w30USjc?;85>QL+85*#1?c2JN$JSmzATk8%-DVJ%)kvZijMob@b{$<<(esv^Hs zT9^M^>dMJ~O30pNI+E&#uR z1qe^X%vySMb@Z@yaw?UKYs2GaQtP+IW7E`DOP%m*Ec@g^wPiq%iNT GF8>d7REU`X 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 From a829e1e52298af92be79ccd3bc543c811d20dd49 Mon Sep 17 00:00:00 2001 From: Aswani Prakash Date: Tue, 3 Jul 2018 13:14:47 +0530 Subject: [PATCH 06/54] Create or replace view query not working issue solved Signed-off-by: Aswani Prakash --- src/Statements/CreateStatement.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Statements/CreateStatement.php b/src/Statements/CreateStatement.php index ee7bd00e9..6510e526f 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='), From 78e9255ebf6669d305be55d573097c92aebf8bee Mon Sep 17 00:00:00 2001 From: Dan Caragea Date: Fri, 20 Jul 2018 21:12:05 +0000 Subject: [PATCH 07/54] Translated using Weblate (Romanian) Currently translated at 93.1% (41 of 44 strings) [CI skip] --- locale/ro/LC_MESSAGES/sqlparser.mo | Bin 3248 -> 4507 bytes locale/ro/LC_MESSAGES/sqlparser.po | 90 +++++++++++++---------------- 2 files changed, 39 insertions(+), 51 deletions(-) diff --git a/locale/ro/LC_MESSAGES/sqlparser.mo b/locale/ro/LC_MESSAGES/sqlparser.mo index 600d612d1d825ed6a288894f8232c49c43112273..b5c51104674cd7d54a96f99dcf4014dfac11cd05 100644 GIT binary patch literal 4507 zcma)8O^h5z74ASt$Pxk=5=aQ}yz$R2cF)ePjj+bvm|;CmOm=pc{Ye0UL``?iOvOD_ z?dtAX&&m=Odyj-5K@q=#3kV4$$bmy{UW5fV#Mz3%fioZ>4j}Qp>Ykb2nRTG$@wZ+5 z>eYMS`(9PuJNDqK9-dF*_cVUd1D{1fm5@UOtrz(*g>@jP%A?_UL80Dc3=Isdj8{|oSO zyg&3_&-(!IX&~o&7Rc+b0Xgp$@I%0F0zU!#4v^#jHIV230mwYQ1?2qx1H?b?$wxfz z?++jb;Aimu`1|twUI20&H-R#>?9Us=sJbr{9XmtKjcIO}NT)vze$IG$s!?hhgpu)w> z`sMaOi5#~8r#;pkYl8XWTp?liupU6adpI|KxEIhuPLurpG5lC3T!Yj2p>4bw{5V%o z3Wtj)Lh6eslL_rgD@oprWsu77EVZ(f+9uN>om@H*R=hgRZZ@`eHrKXh>AD>38XMBC zNJcZ*B8W_)bcb421lMIc{oV9>f{Z2cKTWmVr6d)p>`9$Fa>3+rX+xomR8OVSQcI@0 zQfg8u2}GNACB;_umB|t^T5?=gYSEKqVrfOHjGhWC8T48vB4<@j>NqCf_ZzX}MB2U# zM~nnQlQt=WqAbBU2tuwV%6b^*7M+wG$2Nh|_6m&}9bwt;L%YN&WG6xy8KUZ0&{t*Jl= zW1;;k70n|}X9O{q z4fApzW{B-f6#gG}3c8M6w1Ls>NChe60a?*3+Buo!xL}eFVmNH0(FBx87-3za*HuVL zQ!|TF<>!Ii$fQ*)#G@v1lqE)DVWI1ax1+(L+bU3lj?zvzSZ>s_hfIR5z?Oh+Jv15` zkXUjg(Y|o8Qr~KnYE-r;Hl9PXun{4Aly#IWGAVgY&2_1H#LB>QwA$mgjCki5?FSQI zLy-!{-^6%n^^&hq#>JEug;n=!XK5{Vzh@S`4QpNod;Yc1e^FX)(;97>p3n*#$Xwiw zn}d4TQ+j@8Q^v-oelzK)(EohaN&Ib7qnVBMZGXi|x1IS{uus-#sk(TQc1|Lw^&yAumzbeYsKJ^qcGcl{!7YUTa=E^Og0r#>^_Z)8FP+h(u~^jjryj zuF_h)*`P~}X8qdg=jvCkY&N#Go`tFIWTGSeZ7F)CxG#0nG)`&@3tf|N*X+s`e94Nj zorO40I9Wh$y@BA|7Lps0@APCBtXUZQt&ue|&1=oZn485)b!Nrr6fNd&L)kS-<;`>< zj)c+|iRFduX?bV+s()c@$H}y%^&2`cArw-h3oVt-Y($wAk$=_LUQ#0+yVqp-+(pX& zT-M9Wi*%W)RHHfkU8P&M@W;u;YL%YF=&4hbzgz<4^YgG=gyqu3nJ@XzNzF$L)Av%I zJe{j7`l0O4c=Zh1Gj>36_w`i9e6-Q<_%&9YrBGN(e34P-U_ZfOmLI!2nu4r<=O;J> zgRWGvbP8i7YTygZ=rp~iRH=Y3|*{}6rZ#TRHld9G!w)gQ|#Q>$00mHcVAb8 zKXHVkGnEncU>`w3MiU9Sp1u1$5P_(y45iL`YAPYZV))>U62)ix@xvKUex)g%t=z-W zE>c)hY`9u&g~a)WgHni*103!~Xyn*F*hkRR=_=ezWHiZfIV5bmGMcCXe|JYcj_)$T zLq=@LV7hquk*1DXG?ame#LE-QA=1ejhcYSTL7D9dt{XT;SbXy1FPt3^>O1*yDjU0* zHVtG%afb5Yz5the{<~VbI}&J=a9?CU(lPAZRgYDZfwe8}k?~ht1>iza#|T`ZpepPL zC>G)^&8v7TSs&8MqG1>D?Le};0%3@Seu9lm#_TJfNh1|zWqbKGQ55J2cSIw9h9n=spCt-9wu-LGfDZifu}RM z)}Z&TLKZ!tsE3;b`q{+^4vzFw&?qz%z6WZCBv!mTujI^^l zi9`$Fp2Sy*vH_<(-29lo9?qM#3UW6=rcDyCcrY{P7dH%E0Jn(Zn-gehmp}Zim^I#D ZC*~g74~F{byL$+#1pZJmjs+Kw{{k+FQUCw| literal 3248 zcma)8JC7Vi5FXxm&C|SJrhNF!9rn!au5Dqhec0wWBMZN<*E|A(-kILr#xvdH?w(tp zWddZ0fQ$en1O$+fArX-v5%?th2M9ojlms%!2>5DdcK6OU!Xxc{Gu_qQRbPG8b-!)7 z{o?@7)AjEk;4FT>-hw}P@>_%81>kw$v%t^m@9%-f@clcGfO~EWf~SCIfidtr@KNAT zz^%YPfIPqX_8@o+_&o3c@F0+Ymw*oezW~kwzXd)C{G}fM8~8B3H{F4?z^yeN0nXrC z10Ml?1iT;kHEPUpFlo;^PNG^fbY)%_uxCayV@rP?!)&7Kn45(xEnaX z3AVs@fFA0!JFpE5HdlP^2C~0rfV@5i zvi*C&S>TtzUBDlK9RFXy?Z8dokS)P{qfcLA?M?n|4XW>-Y?w4BdqL+g94Uw>&Nt2tfQ_xUe zN+veCpQ_j+OGqKjpfKD_6r9!Ysw@bKhXT5XBsYvE29B+>lF%p^UOIecd0jy3Eov?C zDl20%(CQ*9DP^%wBz(g-4U{4QW{%9Xj*+G0KI7SgF}KEpuai zc-#$C624pvT-Y@o@>Xb<3U91Cln?W4RV10xk(R!3>SQ-uva&3l@D|R_6+E@0)}E-<2o4vx zES#r-a45d=nrR-y8oBCIQLMR}R?O-p>&N5M%}ia^*G1t}d5l@lakgUX7f!xV~| z*Cmp~)laLnWN1a%L6NRqCWkpQ*#iStzA1NEyUcrQQ(&l+@zu{%p|MHr$uh6*Sp;Ua@MYIXwIjr0; z)qO>USE;&)!5Bf-$D&ghp+Qh0%F&8=WI-fIG15VUAy#EFMWN%Es%@~B<51TP*Tg3B zT~R5ZOx(nhNvUpBh0RVPPAD7sm2*|=m}hxRt#6$5u~gV)=~ygyD{Ll^NoLNVqgXJ2 z*GhOB^;NIAPGD!M+zIFsOUq8rnU4ZY#JI%JN4!!rH*G5OAP02`YH`$tB}>H$lu@L0 zF3SE=>KPjqxSP?T&_v;5s&WT$pMdmOJk0vE#RyoQK$g%;AYl+sXe=@<(gJ0~=Jjs1 z&58sU|7~@+mM-@eRwNt;*GTWU%RoSr7PC~h6%^n!%i}@Bl@~hpbJ2WRH0x3ZwiNDv zsBW^3JsRg+(F`}CnE(Wp#8p~_@wlp47W^+$U8o?oY(kI--vxy>E-sK~^j(#gw6n5t J8BOM*;9nME#pwV5 diff --git a/locale/ro/LC_MESSAGES/sqlparser.po b/locale/ro/LC_MESSAGES/sqlparser.po index 038c3b503..72bc96b82 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-21 23:42+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,27 +123,27 @@ 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 "Este 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 @@ -153,7 +153,7 @@ msgstr "Evenimentul %1$s a fost creat." #: 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 +161,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 +173,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." @@ -193,28 +191,20 @@ 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,13 +212,11 @@ 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 From a58c5ff215f300ddccd848a668c1d830c69b1c25 Mon Sep 17 00:00:00 2001 From: Dan Caragea Date: Tue, 24 Jul 2018 05:37:46 +0000 Subject: [PATCH 08/54] Translated using Weblate (Romanian) Currently translated at 100.0% (44 of 44 strings) [CI skip] --- locale/ro/LC_MESSAGES/sqlparser.mo | Bin 4507 -> 4740 bytes locale/ro/LC_MESSAGES/sqlparser.po | 13 ++++--------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/locale/ro/LC_MESSAGES/sqlparser.mo b/locale/ro/LC_MESSAGES/sqlparser.mo index b5c51104674cd7d54a96f99dcf4014dfac11cd05..9cf4b16616e68f61112f6a9e4abe5a14e19946a4 100644 GIT binary patch delta 1238 zcmY+@TS!zv7{Kw_)wIpk)JiM6jH&5*V%s9wUbq|Bguf}M6^C>ljyXAjDcI9tT0{V?@SQAvr#>*(rU!%sK*n?$- z*??}NWb_eA|1`?P3%CjYU^|u`KCRvceAyym<@8HOpkRW9* zrLYJuNC}KYc{d2W0A$jYg&p#W1WOFw!PHpI{QruqKne$0HBi}hFP&_ccV*;8%88e2 zBnM6Qcq3KHnk?S-a8nhR$SZQtBvY!Ur8=s6t$5m`bf0mIHvQcu;%26EuK9}-Q9BXS zJ?W%tGy_v3;k;PI2{X`_bfVgFwMj&EvO}j_%Qaml;bunjhW){m>(~)G9Vh9GR0b~Q zx9aeow$_%+t-y?bWU8Pfb3XXV*KpLa(%PCGcTKmvuVbBd-0m`QqvMuNb<9jUv*Wg# zop)bRf9OcMcV;r->PV-t{~wc%>!^vuEytRju#KI0TJ+gpY@DRUaIWp$%) delta 994 zcmaLWPe>GD7{~EvXLZ-Lao09o(=4aV)>LZM4Z;fPRHQ`W!AnAahzL3qNkj-M(ya($ zvjjT?dQdtDjfW22Is{3V=-MK5NbsaWbSUWio0&THvhRN8eP`x<-{*PXdDJo2UaDlP zW{lEBZKd9hnVrH_hd;_$xX`e+8pW;4T#_PC-EqJ`zEQc5H z0A59&E7=qmO?14%)3|~jZeb5*6J~pG5Ib=cHQ;2_{}PYTeuEA884u%k%%htOE#e{C zm+>T)u#5TaU3B9cHgY3TW0t{IRKz`~1zbc$ehqiyH15aer~uxg-v5ZoBeg8>j!}$X(-&NND diff --git a/locale/ro/LC_MESSAGES/sqlparser.po b/locale/ro/LC_MESSAGES/sqlparser.po index 72bc96b82..92b2c7c59 100644 --- a/locale/ro/LC_MESSAGES/sqlparser.po +++ b/locale/ro/LC_MESSAGES/sqlparser.po @@ -4,7 +4,7 @@ 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-07-21 23:42+0000\n" +"PO-Revision-Date: 2018-07-24 05:41+0000\n" "Last-Translator: Dan Caragea \n" "Language-Team: Romanian \n" @@ -127,7 +127,7 @@ msgstr "Era așteptat numele nou al tabelului." #: src/Components/RenameOperation.php:153 msgid "A rename operation was expected." -msgstr "Este așteptată o operație de redenumire." +msgstr "Era așteptată o operație de redenumire." #: src/Components/SetOperation.php:117 msgid "Missing expression." @@ -146,10 +146,9 @@ msgid "Expected delimiter." 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." @@ -185,8 +184,6 @@ 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." @@ -219,7 +216,5 @@ msgid "error #1" msgstr "eroare #1" #: tests/Lexer/LexerTest.php:46 tests/Parser/ParserTest.php:80 -#, fuzzy -#| msgid "Gather errors" msgid "strict error" msgstr "eroare strictă" From 018a6b6347906b48fb46ab1736529cfb72950393 Mon Sep 17 00:00:00 2001 From: popcorner Date: Wed, 1 Aug 2018 07:14:17 +0000 Subject: [PATCH 09/54] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (44 of 44 strings) [CI skip] --- locale/zh_CN/LC_MESSAGES/sqlparser.mo | Bin 666 -> 4392 bytes locale/zh_CN/LC_MESSAGES/sqlparser.po | 135 +++++++++----------------- 2 files changed, 46 insertions(+), 89 deletions(-) diff --git a/locale/zh_CN/LC_MESSAGES/sqlparser.mo b/locale/zh_CN/LC_MESSAGES/sqlparser.mo index 9e737f3a4c6a5c9965d9e25387b3c4429253798a..b54df8b717e9a0ee63100f2e5069757c83b6a79d 100644 GIT binary patch literal 4392 zcma)7YfK#16`s^-lTi2Jr0+EC4Y6aWJqx(1YOn3K)LtjlJS^Z=wj*O6_K!+Y|5cSDwSW3Zx-+}0M&eH;|Ev0)nPGQX zK<$Xxk9+UA_nh;c@7(#@vrmo)ctpJ4#@qFTARGjK`WgJ-`NtMP_#W_M;ETYmPYS|! zfj%J3*8;17Z9oS65coVW1q=bVd{z*?1#AX>4cH0%4)8pX?B;=A2Yv)R0Q?llfTf=k zgx$cO0m)x0@HyZpumt!Xkk0)GNO7-t>sy}^gqJa9z^?#b0d5EW3b+&4;o(hSF~)xa z?gjoENco6QyYsIDzl!m1fL{Wh22%bLK#Jq{K#J?nz-_?Cz!!keJmcoG6G;1i45auP zft0TfgsCtH+zK28{`Cn#m;_S3ou7BlO#pXd{6`?g^%!^*Sd2}?p9-Y)0U+`G0g&SS z<`>*JOMzr}6iE5M;mr>L_hI}#koNz}n}6<$E}uUDK8yKdK-wPy5}%#k_$Kfh821ik~Lc=P{cjAd8Tq8M4~Unsh02oSW;{ zwP;jgn$D#EX{z#8W|)%6qg-_la)NQ=QZ*LliX4?quCpd?wsNjA*<=!;HCs4~>HMUu z#SNyZoZ`~CDn&WdVqBL@SyR^qX0%0{G=(`<`ANNq&6}<SC=G{aVQDNW)cA66YKkQ^QMa+pdq^S`_4w+yVnqL_=H9k zEIRiL3e+sCj_TIZoo5nik#L`&)z@qcYalVt%B$F+%7#E*jq)wLTWifO++qkHWz8mw zO!7`Owc}i+8J&l;W>tQRdRn1tCwrL`tcE31a`-El&-0#lR#sr%me(X*-s~>mx{j;! zr3%3?b<~YHW8s*ty#Xr4s<8MP*Qw$C>`;rW;$~tc4J11`BJ*%5D~YwlYT7EpQCTf5 zs^>9HH^myGSq_UojW-)&Q1i2*V|79Ckj|Y;Qap^?*U$EpSL_wb@mImh_xbni+f}}& zyc~vNJ?>a?=h^)tP+2e5)QN{H*{gN_nyOvDtg8(aRio#{AoYkMnVRlrM;fcES#4!a zfE@_bR9030r1J3L`ana&k6@}c$E9X22Dud7B!>enrWrH*Wo0dzL9Nxwn{Y1oX?k;6 z%q7AoL!Qw#iSjHnPAH-yI=$?zmS4Y$Fv@a{{LGsxs;R08V8IQ#8r5(F?dAWo3o=7BU~2)YDlBo%g^>U$!5_pC9X?~ctq2qhM%c1 zXJ{O(*w5U550>vQdR=^ltMp|eetzy|#J=yV@KqEE_Sj{6>>_=plk>N%_NA4jcazKA z_T?$N@1fN@mt5$kuQS&E+1@Ew3&ZwU-zV*3-iP{=_HpZ-yP4rxYi5+z?U`$-iCJs; zsQZX$!%t=J$=0+{pezP;@wQo zfOUG=IyGRQ8AvXVZ5)*s{q5_B4W_B-xs|1kHCcj@bYd!(=vvd{qw&AZw6NKv!-#{{S4GoL_L0 zgNyXThp1N}1NlZ)$53i|vCsk)cF(Yu+O5fZZh5U!gPHNG>HC*cOH@PQP-(gY0xy?pIlr_ zE{`M^`mNth(AM;$bN1LRYxWXk?pv*UVhR(<L+hAr>vnVYwU(Kc>!*452O=Ulk+q7 z=oNdUm#jS+@83yJU$ZZrTEE#bnjZj}R?h;GqEnsB-R`7imo8iyUSpyw^37A756FtX zv{^Fkt|4pEyB&lA`)tK%S7!KpI+1|WbYcdnWF{7@1y|he2_WuDPkI(yQ%-kB(ur<# z2?aTH&c1kWWvSQs{H`qZ<=qTxE$xvxdtlb(%*z%{ojb^Bb_i&l2S-Hi^+@|%k;8AM UXUOYfH+uR8C+DXiQFko-7pW1wn*aa+ delta 387 zcmX}lKTE?v7zXgO+M$6iqUhjoxR#5T&|(P=MI97tZEJNlZH^e*Y25vJUqaDX%HEudqu$D-ciXJ~; zH9^)5vdcW*;*N&5OL^?-p3gi?r80B5C&;F6S_WBenm(y;4GT|q{Dv;L=jYsg*KX^E zZ8@^TMDUZCu@(u<5>>&9s%6qCs!}Qyw@8__tmpz+)dkbAN)`B*A!-KGtftTug-Chb z7o_sPUc(h$t+qD~c^xl_=xH{2&a`!_A=kJa)TN`?N+B3YHw&t)q-8}y;m6(Z{%O#A g7+t@}=\n" +"PO-Revision-Date: 2018-08-01 07:29+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 "不能识别的关键词" #: 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 "严格错误" From 946637654cb566f562a00e51369b4ed18b5fc873 Mon Sep 17 00:00:00 2001 From: popcorner Date: Wed, 1 Aug 2018 07:30:25 +0000 Subject: [PATCH 10/54] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (44 of 44 strings) [CI skip] --- locale/zh_CN/LC_MESSAGES/sqlparser.mo | Bin 4392 -> 4290 bytes locale/zh_CN/LC_MESSAGES/sqlparser.po | 30 +++++++++++++------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/locale/zh_CN/LC_MESSAGES/sqlparser.mo b/locale/zh_CN/LC_MESSAGES/sqlparser.mo index b54df8b717e9a0ee63100f2e5069757c83b6a79d..700ea4a221a40c974bccda899292a1c9e19ad0ac 100644 GIT binary patch delta 570 zcmYMwze@sP7zgn8I!H`UMHKoWn$=K55L!?TE)9V#Zqd-vR0K6ONQ2f=QF_HW1Zm+= zNd^U1XqNV4X{$dVh@d;Wq`AqV@6#Q*yr1`ZpL?G7c`w)X=)XvFu~x>|i-oZssKH4n zSQ+bp)6ff-;S@|kJN$-JS2yx*LH~XT(s=|1;k(mcxjL54WDs9 z7uKKy@>u$y3sQp+q>E>aI11?nd(aH?5I=)mIpkVXx5*Uf92^}B4$H2VMXp&brK;&o zX~Qz%)3-`7t`tvIQLb*Csbb+HzQ&Ny&W|MCy5OPh-M*IH{#s9{yJdAJQI!%(IZdBQ z4^}Tn>l}5ZiV-0Y(zi;nq&L>GIjvGrZ^cIA|D3uiexBSk5;WMo(C^e+ATnkv97|?f UR7%cfDRB6IEc{1&iUJO#Yt$9|}z< z1fdArgXQoJib2m18I+IdmC&K<*6o8esE_AL>l|olxOt}8=JJtNIG$u8=j5rX0NYtqQ8@kP1-^@6Hor_ q5c8+4ZPmtT)N;8z#I#f(v%bhqth2w5*dj;uE2;PLfr-u7`@aE7hv5YP diff --git a/locale/zh_CN/LC_MESSAGES/sqlparser.po b/locale/zh_CN/LC_MESSAGES/sqlparser.po index caaa8c194..45f4f6e43 100644 --- a/locale/zh_CN/LC_MESSAGES/sqlparser.po +++ b/locale/zh_CN/LC_MESSAGES/sqlparser.po @@ -4,7 +4,7 @@ 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-08-01 07:29+0000\n" +"PO-Revision-Date: 2018-08-02 07:35+0000\n" "Last-Translator: popcorner \n" "Language-Team: Chinese (Simplified) \n" @@ -31,15 +31,15 @@ msgstr "无法识别的变更(alter)操作。" #: src/Components/Array2d.php:88 #, php-format msgid "%1$d values were expected, but found %2$d." -msgstr "期望%1$d个值,但查找到了%2$d个。" +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 @@ -64,19 +64,19 @@ msgstr "CASE表达式意外结束" 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 msgid "A symbol name was expected!" -msgstr "正确形式是有一个符号名称!" +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." @@ -84,7 +84,7 @@ msgstr "无法识别的数据类型。" #: src/Components/Expression.php:244 src/Components/Expression.php:394 msgid "An alias was expected." -msgstr "正确形式是有一个别名。" +msgstr "应该有一个别名。" #: src/Components/Expression.php:332 src/Components/Expression.php:351 #: src/Components/Expression.php:383 @@ -97,11 +97,11 @@ 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,15 +114,15 @@ msgstr "需要有表的旧名称。" #: src/Components/RenameOperation.php:119 msgid "Keyword \"TO\" was expected." -msgstr "正确形式应为关键词“TO”。" +msgstr "应为关键词“TO”。" #: src/Components/RenameOperation.php:135 msgid "The new name of the table was expected." -msgstr "需要有表的新名称。" +msgstr "应有表的新名称。" #: src/Components/RenameOperation.php:153 msgid "A rename operation was expected." -msgstr "需要进行重命名操作。" +msgstr "应进行重命名操作。" #: src/Components/SetOperation.php:117 msgid "Missing expression." @@ -176,7 +176,7 @@ msgstr "之前已解析此类型的子句。" #: src/Statement.php:366 msgid "Unrecognized keyword." -msgstr "不能识别的关键词" +msgstr "不能识别的关键词。" #: src/Statement.php:377 msgid "Keyword at end of statement." From 4a2a8680c49902ce7d85da87804e2213d19f1db4 Mon Sep 17 00:00:00 2001 From: Anusuk Sangubon Date: Thu, 16 Aug 2018 10:28:48 +0000 Subject: [PATCH 11/54] Translated using Weblate (Thai) Currently translated at 72.7% (32 of 44 strings) [CI skip] --- locale/th/LC_MESSAGES/sqlparser.mo | Bin 5401 -> 5379 bytes locale/th/LC_MESSAGES/sqlparser.po | 12 ++++++------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/locale/th/LC_MESSAGES/sqlparser.mo b/locale/th/LC_MESSAGES/sqlparser.mo index 5dc0cd643398292e09f4de8e865283021a548144..42a74f888bed35656aef8a5209a35caa4506e4f4 100644 GIT binary patch delta 483 zcmZwC%P#{_6bA59BCYW#Dk%#wi%OJ?R7o(Y$1o!mot8c#B*a7|CZT9cu+UH&E0V5i z#Y!TPc%)o^fyCCv!s0G0Bz7X!KDxE~&l?;@_Sq@( z*O0Ln7uVDfxo|KIe;=?5eefMdVM{I1EZl)Ae1QwFsg6j4dvFLo!ewZ46z4YJZ+?P( zu&2J*zg~}@kE3vZ>n?GZ)kc>LQ*2#ZTGO|c_==fu=jN==+>zB8@0C2gQfH6Y>6N>^ z?H;ekBTR&(@ZzSKGFKClYNQusaavQtk{*&&Mf8VceXM;Z6x4)(kxEO^q>)H18|l@g zERMzk0WqlPn&{JXWh^kHsA^b?L~_lx@6xUg?`>oGg+<=y4~Lvxa(2MkIcGPVopF}u YtngRgHx-S-515;G!~g&Q delta 544 zcmYMv&ubGw6bJAZQPQs3TJ1qEI)@^pG9eqc)U2(BwnCw;_Qy)`AarP#%|f!X>`p;X zrFc;BQmDo5MerbkQfwQP$sggLAdJWM(3>7Sh~FfjbC}P2Z)V=iJR8o2_lI&DCP#E9 zPxOR{uJsa4!(AA{AMgvDv51yo?kv$m_y|^T?lZiL{OBCfI4qnex(@@m0KdX5*waU} z0yEg|^BYdU#eUl8Y}o1VUVQxm(GV6SY(L;N9D{$L2X7A$J%(Fw3ZB4Kc=ICBJ@^Jz z;dfYvS1)zXy@KuBzzUoj?CyU)h@a1(@U2-mRX8J-7G_y2lGIOF$y)SdnJ7M&2H_f? zSPxR}NtdZaL}^_pnWWXY7B`-XwMG~fBVSqb4?I4Z_(Fv;;!{HTE-RPpQC_;m%Qmyi z?ufJfHh|8=@tw4LTj&&S;Oj?o83e=z!8C&)}|)9Cj`?;E{oS}%;=GdeT+Q+sZ` RH2ScU9(3ZYd2C&={sKH=l$!tm 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." From dad2a0b8133a05cb232be735ea5b3a110e1198ea Mon Sep 17 00:00:00 2001 From: Menuka Ishan Date: Sun, 30 Sep 2018 14:09:57 +0000 Subject: [PATCH 12/54] Translated using Weblate (Sinhala) Currently translated at 20.4% (9 of 44 strings) [CI skip] --- locale/si/LC_MESSAGES/sqlparser.mo | Bin 540 -> 1719 bytes locale/si/LC_MESSAGES/sqlparser.po | 38 +++++++++++------------------ 2 files changed, 14 insertions(+), 24 deletions(-) diff --git a/locale/si/LC_MESSAGES/sqlparser.mo b/locale/si/LC_MESSAGES/sqlparser.mo index 667b0fcdcb8c62a69cfa1dcc6160c6651cfcc808..ce5d946ab366e933520aca1929ea31e24db998ef 100644 GIT binary patch literal 1719 zcmcIkTWcgm6fSkWHHa6)7Zoc{tA?6O7A16&#Wv|^U?vkL6F2&xRAy>tTDz-yt2(*{mPcfND#Fuy%? z>{EirgFOa|VfVp)g1P4g>`^S9MTQV`)`Php5um!^Qq`(Vo)RSt0du6Y08fb zHREJM#Z>Y{+(a`$0!eusf%y=-bfvT~CQ|Z{Z&_tDO43*)LP821i>yZ0lXoC!@;Dm2efu|`(3dL5mzr2%_MXs5!btC1Y>nA0cI zQQ95{gCvqqd0mkzow2qVMg#Wz=FqU7@~OAd>9Kh&N;bB@GvU*zMsu1q8?4c!&1d}+ z&rCL^8Vv-pt~eXH3VU%che4OMJ8U7KFLwO)(&Q_h<ilyO&hPHccm)RZ39)2dxl zM{CKLyVmOFOw3ZQjnH)y)emTWY9g<_)D90O)2ubTd4=1M&^S)fY$ncU^)%*@oT2@Z zW69>$dW&rOAkOu2T4)x^z8YZBd^)`mW!_4>sd>y6l}?OLWm+E1+|&%MUgsn|Nt-j? zI(tD#cVBK8r>b7)iP{t!h_fEC`2|~S+2UQB|6q%Y)aKi^_}J#xZ1IWBcWkjuo!_0` zb0N;{qH>#Gx5Xu!|7eTPOE-S6!dL!YE|ZGw8u*a_7nm-UL{&b>iZ3X5{^#nhuXjof z+Yp9&XcD4#Y`*(1TbV#B7s~vtvRyR#?SJ8OqrvPh{=W5r<8x!efZqOxu%iczsYB9E zC8oMMh${!4e*-=^(EK$wZFFDV#YdQiQ*h)pRw-^nK12T3W&T&?3b@f;FLhtGu8zCd z8aeL%K8_>w*1hd(K(gC1NXM$UO}c^=#M_~DaCH&33#o4XzC-x_6;`e6EnT&4S4tn4 VZ@tEDBq)Q;L*Q;ng*~Wb{|T!A77qXb delta 288 zcmdnaJBP*Mo)F7a1|VPrVi_P-0b*t#)&XJ=umIvmKuJp=4N?OGlixFn*#!D16eJcE zrxqy~a0R6nr=OmWo7Zp1cWEA99CZ^\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." From 472c998fd22138aab0f3a98cafe93a3aac4e6209 Mon Sep 17 00:00:00 2001 From: Ayalos Date: Fri, 5 Oct 2018 17:49:17 +0000 Subject: [PATCH 13/54] Translated using Weblate (Portuguese) Currently translated at 88.6% (39 of 44 strings) [CI skip] --- locale/pt/LC_MESSAGES/sqlparser.mo | Bin 1284 -> 3980 bytes locale/pt/LC_MESSAGES/sqlparser.po | 116 +++++++++++------------------ 2 files changed, 45 insertions(+), 71 deletions(-) diff --git a/locale/pt/LC_MESSAGES/sqlparser.mo b/locale/pt/LC_MESSAGES/sqlparser.mo index 11484e7bd00862f8d477ec91b735080ba9b75673..2fa8dabd742bf84b6fd6c98bacc9064e2055f156 100644 GIT binary patch literal 3980 zcma);Ux*|}9miWu{4>!@a#0ii|J>Xqci#2P&Yp&2?hkHu=i-u`-DPh!i4rii(={`d z>#6Fis-DS;L`3jK5MLAw@!<#|ggh(62O%szB`*OHe94nf2?Tri4(m*YBOa>$efEbGW~b``J%K(f7cYKZze)*{7oDJK$~b+u+OKx4^%Eo8WsO zffw$IqOXFR;FrMx_)YLd@N3{7zz4xM!K>iAAc3duj-rcT1LSp|1s?!^3bIYV0eRgw zLALL2<@*}n%r8%6kwF5&0%;8pM~#Bu{5^Cipw>VetKur|v1@w*s<18zAe^AnX4X_yqV0cozHsTmkQgQeI~rWc!BTW8jM* zfqw*9@83a=*MGqV_`ny6_18ec^K&4t^K+2be--5Ty$xOmKLnd#e5#Q9G06IU0dkyv z4}JxF1LXOCEyq6qIgkGVIbIJT*u3s{L5}m&AVL{UK$sT&3`F=MlvjxBX^=0ZJzQL# z><{bad?5@$AC{k99523DFJIp%Fs*gg_XuwGmvy2fLu`Oh>u@zfT7sQC_7HB)3D-6I zdLM4SxZYuIxY&1;Sn!Dl2siutIo#no+dPxdSfsghG?7-4d?AxPFO!S3pL^46Dc(*PXZ?Rp`^^pu`;p&m`gCPQS!Wuhm~ zx${U)-=J2e*{VlRmIblY-CkOV>d`CVNg|VQc3J`TsG|@~STzf5J=!wlt=KbXNf^=a0lQBnq%?K%)T_8KI&?v z%<<-y)I4Hk&kVHs36hftFM|IIY&Zbr^q#GS%(v}4Wl z2t~Y+#7{}f8@5F|#`=7KlTOmPY?yTpR+Ev^=WDw%!<)F{1}cdk&j&8%PUq!D%ijv$tRUX9}-$b>$%HxiVIRE({NVf0v5`W6;DT2r7BM|^1Zh7t#& z$uS8X1*aTZVMWfcoWM>U3v5ypS$_E1;VTB})l9i4Owv*h^U=|{2%9WKJa^R;dU4td ztZ$X!J%=?z=PFh!ds#(qVV^eWa4-y02`58XXXZn&t!!nLsnuaNGn^G@l~6u2x%8_% zc-f=M3Wf5rqgBSsNiYOk33eoCI~-zcZYKx1O2QCAfTTR1YtJ2>4>-=+vGw883F}m} z!HON38iM7hfE*Dknp+Vv){T~@5!qQpFl9}7QKm>~k%m^+T##8WzB7spl{JQLhX!}} zn&A#7NAx&KyH`Av5+Qw#lIeE}&xeik#l{_Q-lBN{eCD7-!>|x6^a5L$TaRvt)Z=3Z znJ7LpkQB7JP*cc$Xo<7hLzC|*fi;e5D&!YmDN18dAC>5|L&Da2w2eAOK|uh;fNUX# z6;n%rv6)JpSaRhe(5nUr#m5w8+c~cA!r-DSqDp#ZRP@9qnj%Cbd6k7K2~9D_J_)8D zzE0!AJ7|osbcAn~&<$rD68nIsqn>Be5AWoT=Py>gK&+Ju?r-R$1BDHd$o26gtd(sM z{dp>l9OIBN^CNRvpUT3nZS+T7mf&nW?3J`Mk{dgB$+;D~Wh9Umj)+6hhO(zPZ}SyY oc?WgVX>wLe)#(t~Dw94&A3eM?mgz#)+vuU(LIa%~OADPJ0X8IzssI20 delta 367 zcmeB?Z{e!HC&V(90SGvNSO$n=fS4PI=KwJXoB(1iAU+AiK0y2hh;4w_k&%Hx0Z7*Y zX%QejA4n?#=`BE77)W0O(no>#6%bnh`5TxS7=nTHOCaqIq-|Lk7*rV;oETbx43NdE zfwUr!J^`d9f%GdN4b;m3RL{T$#2~-~p}>v>N;9wnG3(?^X4A\n" +"PO-Revision-Date: 2018-10-06 18:32+0000\n" +"Last-Translator: Ayalos \n" "Language-Team: Portuguese \n" "Language: pt\n" @@ -13,7 +13,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 3.1-dev\n" +"X-Generator: Weblate 3.2\n" #: src/Component.php:43 src/Component.php:63 msgid "Not implemented yet." @@ -30,7 +30,7 @@ msgstr "" #, fuzzy #| msgid "Iconic table operations" msgid "Unrecognized alter operation." -msgstr "Tabela de operações em ícones" +msgstr "Operação de alteração não conhecida" #: src/Components/Array2d.php:88 #, php-format @@ -61,129 +61,117 @@ msgid "Unexpected keyword." msgstr "Palavra-chave inesperada." #: src/Components/CaseExpression.php:199 +#, fuzzy msgid "Unexpected end of CASE expression" -msgstr "Fim da expressão CASE inesperado" +msgstr "Fim da expressão CASE inesperada" #: src/Components/CreateDefinition.php:223 +#, fuzzy 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 @@ -191,63 +179,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." From a47a425ad96ca9208866714e03ed4073a78cbd74 Mon Sep 17 00:00:00 2001 From: ssantos Date: Sun, 7 Oct 2018 20:17:26 +0000 Subject: [PATCH 14/54] Translated using Weblate (Portuguese) Currently translated at 100.0% (44 of 44 strings) [CI skip] --- locale/pt/LC_MESSAGES/sqlparser.mo | Bin 3980 -> 4608 bytes locale/pt/LC_MESSAGES/sqlparser.po | 18 +++++------------- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/locale/pt/LC_MESSAGES/sqlparser.mo b/locale/pt/LC_MESSAGES/sqlparser.mo index 2fa8dabd742bf84b6fd6c98bacc9064e2055f156..d5401731fe427c7d3f8a8fd09daa4e5ea5477afc 100644 GIT binary patch delta 1491 zcmZ|OU2GIp6u|Mb-AZX$7pQ{x1*h6l1*UD}yjW_DW| z9u|qpi`tM4AwC&`M8Oaf`r;cT8%a=JG$g(lKc0MPVxmoaFeLoXbV)SPo6P=Z@64Qg z&bc!mY&g~5_^G$^oG`X=Ji+m9LF5Ho=-`L(OHpJq{)&BA>J-_4Lum5{@im-9#hdsz z{)QnI9}syAkK$T9jqCAajqm+v?k;ld(XMcbC!1(7#!4W7i6cowY#7tj)E zp(XYMuExLcN$l=kDrgYx`IpcV97pR+irgw6VTtwSJSVM!$fszDR8~+uUcf>87N5gE zaSXSVM4rY5T0$4m z^Uq;>yR|*ROPmL=sx7c3X_eX_r#vYufQIB>5abK9lm8m*Og^lbUJmP?a`Z?1+#gnf z4PNBDI?LF)z&7QdOb1%E_8HlWW_!7g!$!{%`3qd+oR26U_M&ZU#>K2B^l==hPc>*> zFU~cx+4!)Z)Fg9mV{un&X(F&~Z9PuxZyWKZpWN zS{J=ed3%UN>zU2bV{d8P4`*#i0&a-4o4({BviZ`APl|o}s1enRk(6F7}z3c;i@Qt2->)6V?rRf3XHzLJC6?D`Mh^$yyu>C@1x98qraVwt{BnA zIKh}GG3&+EQa*^8h}k*3hfTPOjrbl%a2q{5A2n;h5j=|1cnat7IKIX@+{AwTik_Ko z$(UI?6Is;46IhFLs7)=S7T!c{@LTx(9=7lvJ7jhk+cASzuob65pW$iV-{M95fhs6n zrg`6NfQKVYOky?8qBigZwV_v-!gr_&KB0d96Sbi~s0!=K&G@r!J}R*vKhVu#RN_S3 z>?{spE9P;G{Pu!}Gx#esnJBg}hpK28l_-zez#?A7H`t83n8OrVwayS~gSW8{=h4Fr zRO0Wbj{QYH%R_BdF~J~uyicMQT0kXOL$&ZDUdG?pg&oP_?{1(HK1OxwB_6|d)cAw=TFjTRUaxq@;!9bdm+QRLoh!uS*Gqz_#Pc9q VIae5{T8RYvHKW1()YH-n_76J^RSW\n" +"PO-Revision-Date: 2018-10-08 21:32+0000\n" +"Last-Translator: ssantos \n" "Language-Team: Portuguese \n" "Language: pt\n" @@ -13,7 +13,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 3.2\n" +"X-Generator: Weblate 3.2.1\n" #: src/Component.php:43 src/Component.php:63 msgid "Not implemented yet." @@ -27,10 +27,8 @@ msgstr "" "anterior." #: src/Components/AlterOperation.php:253 -#, fuzzy -#| msgid "Iconic table operations" msgid "Unrecognized alter operation." -msgstr "Operação de alteração não conhecida" +msgstr "Operação de alteração não reconhecida." #: src/Components/Array2d.php:88 #, php-format @@ -61,12 +59,10 @@ msgid "Unexpected keyword." msgstr "Palavra-chave inesperada." #: src/Components/CaseExpression.php:199 -#, fuzzy msgid "Unexpected end of CASE expression" msgstr "Fim da expressão CASE inesperada" #: src/Components/CreateDefinition.php:223 -#, fuzzy msgid "" "A symbol name was expected! A reserved keyword can not be used as a column " "name without backquotes." @@ -75,14 +71,10 @@ msgstr "" "um nome de coluna sem as chaves." #: src/Components/CreateDefinition.php:237 -#, fuzzy -#| msgid "Table name template" msgid "A symbol name was expected!" 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 "Uma vírgula ou um colchete de fechamento era esperado." @@ -224,4 +216,4 @@ msgstr "Erro #1" #: tests/Lexer/LexerTest.php:46 tests/Parser/ParserTest.php:80 msgid "strict error" -msgstr "Erro severo." +msgstr "Erro severo" From 20ed99420d54d6942e76c94e867ca4729f361669 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Meneghini=20Fauth?= Date: Mon, 8 Oct 2018 23:26:08 -0300 Subject: [PATCH 15/54] Add ChangeLog entry for #198 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Maurício Meneghini Fauth --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c23966df..923cc1da9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## [Unreleased] +* Fix issue with CREATE OR REPLACE VIEW. + ## [4.2.4] - 2017-12-06 * Fix parsing of CREATE TABLE with per field COLLATE. From 1a18d1c5bad164cb0d2e4584578a76273af7feaf Mon Sep 17 00:00:00 2001 From: Brad Mostert Date: Sat, 13 Oct 2018 13:36:28 +0200 Subject: [PATCH 16/54] Add Support for CASE ... END AS alias --- src/Components/CaseExpression.php | 69 +++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/src/Components/CaseExpression.php b/src/Components/CaseExpression.php index 820947bfb..a256f8996 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. * @@ -94,6 +102,13 @@ public static function parse(Parser $parser, TokensList $list, array $options = */ $type = 0; + /** + * Whether an alias is expected + * + * @bool + */ + $alias = false; + ++$list->idx; // Skip 'CASE' for (; $list->idx < $list->count; ++$list->idx) { @@ -201,6 +216,56 @@ public static function parse(Parser $parser, TokensList $list, array $options = $list->tokens[$list->idx - 1] ); } else { + + // Parse alias for CASE statement + for (; $list->idx < $list->count; ++$list->idx) { + $token = $list->tokens[$list->idx]; + + // Skipping whitespaces and comments. + if (($token->type === Token::TYPE_WHITESPACE) + || ($token->type === Token::TYPE_COMMENT) + ) { + continue; + } + + // + if($token->type === Token::TYPE_KEYWORD + && $token->keyword === 'AS'){ + + if ($alias) { + $parser->error( + 'An alias was expected.', + $token + ); + break; + } + $alias = true; + continue; + } + + if ($alias){ + + // An alias is expected (the keyword `AS` was previously found). + if (!empty($ret->alias)) { + $parser->error('An alias was previously found.', $token); + break; + } + $ret->alias = $token->value; + $alias = false; + + continue; + } + + break; + } + if ($alias) { + $parser->error( + 'An alias was expected.', + $list->tokens[$list->idx - 1] + ); + } + + $ret->expr = self::build($ret); } @@ -241,6 +306,10 @@ public static function build($component, array $options = array()) } $ret .= 'END'; + if ($component->alias) { + $ret .= ' AS ' . Context::escape($component->alias); + } + return $ret; } } From f2127a175835f25e4936bb08698a812841a3915d Mon Sep 17 00:00:00 2001 From: Brad Mostert Date: Sat, 13 Oct 2018 14:41:15 +0200 Subject: [PATCH 17/54] Handle CASE alias without AS --- src/Components/CaseExpression.php | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/Components/CaseExpression.php b/src/Components/CaseExpression.php index a256f8996..364b7d701 100644 --- a/src/Components/CaseExpression.php +++ b/src/Components/CaseExpression.php @@ -102,13 +102,6 @@ public static function parse(Parser $parser, TokensList $list, array $options = */ $type = 0; - /** - * Whether an alias is expected - * - * @bool - */ - $alias = false; - ++$list->idx; // Skip 'CASE' for (; $list->idx < $list->count; ++$list->idx) { @@ -217,7 +210,8 @@ public static function parse(Parser $parser, TokensList $list, array $options = ); } else { - // Parse alias for CASE statement + // Parse for alias of CASE expression + $asFound = false; for (; $list->idx < $list->count; ++$list->idx) { $token = $list->tokens[$list->idx]; @@ -228,22 +222,26 @@ public static function parse(Parser $parser, TokensList $list, array $options = continue; } - // + // Handle optional AS keyword before alias if($token->type === Token::TYPE_KEYWORD && $token->keyword === 'AS'){ - if ($alias) { + if ($asFound || !empty($ret->alias)) { $parser->error( - 'An alias was expected.', + 'Potential duplicate alias of CASE expression.', $token ); break; } - $alias = true; + $asFound = true; continue; } - if ($alias){ + 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)) { @@ -251,16 +249,16 @@ public static function parse(Parser $parser, TokensList $list, array $options = break; } $ret->alias = $token->value; - $alias = false; + $asFound = false; continue; } break; } - if ($alias) { + if ($asFound) { $parser->error( - 'An alias was expected.', + 'An alias was expected after AS.', $list->tokens[$list->idx - 1] ); } From f72a44cfd6266e9448e43bf7c1dcf759ea693a72 Mon Sep 17 00:00:00 2001 From: Brad Mostert Date: Sat, 13 Oct 2018 15:44:29 +0200 Subject: [PATCH 18/54] Explicitly handle case where keyword encountered before alias value found --- src/Components/CaseExpression.php | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/Components/CaseExpression.php b/src/Components/CaseExpression.php index 364b7d701..7f6af8cd8 100644 --- a/src/Components/CaseExpression.php +++ b/src/Components/CaseExpression.php @@ -227,16 +227,21 @@ public static function parse(Parser $parser, TokensList $list, array $options = && $token->keyword === 'AS'){ if ($asFound || !empty($ret->alias)) { - $parser->error( - 'Potential duplicate alias of CASE expression.', - $token - ); + $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) @@ -257,10 +262,7 @@ public static function parse(Parser $parser, TokensList $list, array $options = break; } if ($asFound) { - $parser->error( - 'An alias was expected after AS.', - $list->tokens[$list->idx - 1] - ); + $parser->error('An alias was expected after AS.', $list->tokens[$list->idx - 1]); } From 9cc6cc7a51607f9df355a1713d31893aa5e4e53d Mon Sep 17 00:00:00 2001 From: Brad Mostert Date: Sat, 13 Oct 2018 15:53:14 +0200 Subject: [PATCH 19/54] Handle end of statement while parsing CASE alias --- src/Components/CaseExpression.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Components/CaseExpression.php b/src/Components/CaseExpression.php index 7f6af8cd8..ad6b92a82 100644 --- a/src/Components/CaseExpression.php +++ b/src/Components/CaseExpression.php @@ -215,6 +215,10 @@ public static function parse(Parser $parser, TokensList $list, array $options = 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) From 6f76011f86aed4f5645abef6da888c1ae0ee5bcb Mon Sep 17 00:00:00 2001 From: Brad Mostert Date: Sat, 13 Oct 2018 16:04:03 +0200 Subject: [PATCH 20/54] Add tests for parsing of CASE expressions with aliases --- tests/Parser/SelectStatementTest.php | 10 ++++++++++ tests/data/parser/parseSelectCaseAlias1.in | 2 ++ tests/data/parser/parseSelectCaseAlias1.out | 4 ++++ tests/data/parser/parseSelectCaseAlias2.in | 2 ++ tests/data/parser/parseSelectCaseAlias2.out | 4 ++++ tests/data/parser/parseSelectCaseAlias3.in | 2 ++ tests/data/parser/parseSelectCaseAlias3.out | 4 ++++ tests/data/parser/parseSelectCaseAlias4.in | 2 ++ tests/data/parser/parseSelectCaseAlias4.out | 4 ++++ tests/data/parser/parseSelectCaseAlias5.in | 2 ++ tests/data/parser/parseSelectCaseAlias5.out | 4 ++++ tests/data/parser/parseSelectCaseAlias6.in | 2 ++ tests/data/parser/parseSelectCaseAlias6.out | 4 ++++ tests/data/parser/parseSelectCaseAliasErr1.in | 2 ++ tests/data/parser/parseSelectCaseAliasErr1.out | 4 ++++ tests/data/parser/parseSelectCaseAliasErr2.in | 2 ++ tests/data/parser/parseSelectCaseAliasErr2.out | 4 ++++ tests/data/parser/parseSelectCaseAliasErr3.in | 2 ++ tests/data/parser/parseSelectCaseAliasErr3.out | 4 ++++ tests/data/parser/parseSelectCaseAliasErr4.in | 1 + tests/data/parser/parseSelectCaseAliasErr4.out | 1 + 21 files changed, 66 insertions(+) create mode 100644 tests/data/parser/parseSelectCaseAlias1.in create mode 100644 tests/data/parser/parseSelectCaseAlias1.out create mode 100644 tests/data/parser/parseSelectCaseAlias2.in create mode 100644 tests/data/parser/parseSelectCaseAlias2.out create mode 100644 tests/data/parser/parseSelectCaseAlias3.in create mode 100644 tests/data/parser/parseSelectCaseAlias3.out create mode 100644 tests/data/parser/parseSelectCaseAlias4.in create mode 100644 tests/data/parser/parseSelectCaseAlias4.out create mode 100644 tests/data/parser/parseSelectCaseAlias5.in create mode 100644 tests/data/parser/parseSelectCaseAlias5.out create mode 100644 tests/data/parser/parseSelectCaseAlias6.in create mode 100644 tests/data/parser/parseSelectCaseAlias6.out create mode 100644 tests/data/parser/parseSelectCaseAliasErr1.in create mode 100644 tests/data/parser/parseSelectCaseAliasErr1.out create mode 100644 tests/data/parser/parseSelectCaseAliasErr2.in create mode 100644 tests/data/parser/parseSelectCaseAliasErr2.out create mode 100644 tests/data/parser/parseSelectCaseAliasErr3.in create mode 100644 tests/data/parser/parseSelectCaseAliasErr3.out create mode 100644 tests/data/parser/parseSelectCaseAliasErr4.in create mode 100644 tests/data/parser/parseSelectCaseAliasErr4.out diff --git a/tests/Parser/SelectStatementTest.php b/tests/Parser/SelectStatementTest.php index 42fb955c7..f3c812c61 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'), 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 From 61343f63d0a64a14287f2366c2907b8a05eb0a87 Mon Sep 17 00:00:00 2001 From: Brad Mostert Date: Sat, 13 Oct 2018 16:12:30 +0200 Subject: [PATCH 21/54] Add component build tests from CASE expressions with aliases --- tests/Components/CaseExpressionTest.php | 28 +++++++++++++++++++++++++ 1 file changed, 28 insertions(+) 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`' + ); + } } From bf4ad3d3b148ce0868339ee24bca9a5c46821063 Mon Sep 17 00:00:00 2001 From: Brad Mostert Date: Sat, 13 Oct 2018 16:17:46 +0200 Subject: [PATCH 22/54] Apply php-cs-fixer formatting changes --- src/Components/CaseExpression.php | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/Components/CaseExpression.php b/src/Components/CaseExpression.php index ad6b92a82..fc80697f8 100644 --- a/src/Components/CaseExpression.php +++ b/src/Components/CaseExpression.php @@ -57,7 +57,7 @@ class CaseExpression extends Component public $else_result; /** - * The alias of this CASE statement + * The alias of this CASE statement. * * @var string */ @@ -78,8 +78,8 @@ 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 @@ -209,7 +209,6 @@ 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) { @@ -219,6 +218,7 @@ public static function parse(Parser $parser, TokensList $list, array $options = if ($token->type === Token::TYPE_DELIMITER) { break; } + // Skipping whitespaces and comments. if (($token->type === Token::TYPE_WHITESPACE) || ($token->type === Token::TYPE_COMMENT) @@ -227,9 +227,8 @@ public static function parse(Parser $parser, TokensList $list, array $options = } // Handle optional AS keyword before alias - if($token->type === Token::TYPE_KEYWORD - && $token->keyword === 'AS'){ - + if ($token->type === Token::TYPE_KEYWORD + && $token->keyword === 'AS') { if ($asFound || !empty($ret->alias)) { $parser->error('Potential duplicate alias of CASE expression.', $token); break; @@ -240,8 +239,8 @@ public static function parse(Parser $parser, TokensList $list, array $options = 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); + && ($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; } @@ -250,8 +249,7 @@ public static function parse(Parser $parser, TokensList $list, array $options = || $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); @@ -269,7 +267,6 @@ public static function parse(Parser $parser, TokensList $list, array $options = $parser->error('An alias was expected after AS.', $list->tokens[$list->idx - 1]); } - $ret->expr = self::build($ret); } From a156028d60b4b9e11f43cc432f0a19507e87c658 Mon Sep 17 00:00:00 2001 From: Isaac Bennetch Date: Wed, 31 Oct 2018 14:40:52 -0400 Subject: [PATCH 23/54] Prepare to release version 4.2.5 Signed-off-by: Isaac Bennetch --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 923cc1da9..14ca81fd4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log -## [Unreleased] +## [4.2.5] - 2018-10-31 * Fix issue with CREATE OR REPLACE VIEW. From 8e37bb398b9bf7449c6855f3e0639156cef35e7e Mon Sep 17 00:00:00 2001 From: Isaac Bennetch Date: Wed, 31 Oct 2018 14:45:02 -0400 Subject: [PATCH 24/54] Prepare for next release Signed-off-by: Isaac Bennetch --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 14ca81fd4..03f8a9e95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Change Log +## [Unreleased] + ## [4.2.5] - 2018-10-31 * Fix issue with CREATE OR REPLACE VIEW. From 513ed8175bdc0fc17a192ea29757cf8fee178c2a Mon Sep 17 00:00:00 2001 From: Bruno Perel Date: Mon, 26 Nov 2018 19:56:17 +0100 Subject: [PATCH 25/54] Cleanup and improve readability: Avoid duplicate if conditions Use switch/case instead of ifs when possible --- src/Components/CaseExpression.php | 117 ++++---- src/Components/Condition.php | 4 +- src/Components/CreateDefinition.php | 6 +- src/Components/DataType.php | 2 +- src/Components/Expression.php | 46 +-- src/Components/IntoKeyword.php | 8 +- src/Components/JoinKeyword.php | 37 +-- src/Components/ParameterDefinition.php | 2 +- src/Components/UnionKeyword.php | 4 +- src/Context.php | 12 +- src/Lexer.php | 2 +- src/Parser.php | 4 +- src/Statement.php | 12 +- src/Statements/CreateStatement.php | 324 +++++++++++----------- src/Statements/DeleteStatement.php | 175 ++++++------ src/Statements/LoadStatement.php | 16 +- src/Statements/SelectStatement.php | 3 +- src/Statements/TransactionStatement.php | 8 +- src/Token.php | 8 +- src/Utils/BufferedQuery.php | 41 ++- src/Utils/Formatter.php | 14 +- src/Utils/Misc.php | 17 +- src/Utils/Query.php | 33 ++- src/Utils/Table.php | 16 +- src/Utils/Tokens.php | 12 +- tests/Components/CreateDefinitionTest.php | 2 +- tests/Components/LimitTest.php | 1 - tests/Utils/BufferedQueryTest.php | 4 +- 28 files changed, 457 insertions(+), 473 deletions(-) diff --git a/src/Components/CaseExpression.php b/src/Components/CaseExpression.php index 820947bfb..eb91f5f8f 100644 --- a/src/Components/CaseExpression.php +++ b/src/Components/CaseExpression.php @@ -112,29 +112,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; + default: + $parser->error('Unexpected keyword.', $token); + break; + } } else { $ret->value = Expression::parse($parser, $list); $type = 0; @@ -142,54 +141,50 @@ 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; + default: + $parser->error('Unexpected keyword.', $token); + break; + } } - } else { - if ($token->type === Token::TYPE_KEYWORD - && $token->keyword === 'THEN' - ) { + } else if ($token->type === Token::TYPE_KEYWORD) { + if ($token->keyword === 'THEN') { ++$list->idx; // Skip 'THEN' $new_result = Expression::parse($parser, $list); $state = 0; $ret->results[] = $new_result; - } elseif ($token->type === Token::TYPE_KEYWORD) { + } else { $parser->error('Unexpected keyword.', $token); - break; } + break; } } elseif ($state === 2) { if ($type === 0) { - if ($token->type === Token::TYPE_KEYWORD - && $token->keyword === 'THEN' - ) { - ++$list->idx; // Skip 'THEN' - $new_result = Expression::parse($parser, $list); - $ret->results[] = $new_result; - $state = 1; - } elseif ($token->type === Token::TYPE_KEYWORD) { - $parser->error('Unexpected keyword.', $token); - break; + if ($token->type === Token::TYPE_KEYWORD) { + if ($token->keyword === 'THEN') { + ++$list->idx; // Skip 'THEN' + $new_result = Expression::parse($parser, $list); + $ret->results[] = $new_result; + $state = 1; + } else { + $parser->error('Unexpected keyword.', $token); + } } } } diff --git a/src/Components/Condition.php b/src/Components/Condition.php index 99ab34c7e..4e12b3f75 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; } } 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..4a83f63fd 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; + if ($brackets == 0) { + // 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/IntoKeyword.php b/src/Components/IntoKeyword.php index 17615f6cb..dd3f7f65c 100644 --- a/src/Components/IntoKeyword.php +++ b/src/Components/IntoKeyword.php @@ -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..0b5aae961 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; + } + break; } } } elseif ($state === 3) { 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/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..b381aa7b2 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]; @@ -321,15 +319,15 @@ public static function isComment($str, $end = false) 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; } 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..ab97855e3 100644 --- a/src/Parser.php +++ b/src/Parser.php @@ -340,7 +340,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 +488,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..50acb719d 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. @@ -356,7 +356,7 @@ public function parse(Parser $parser, TokensList $list) } 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') ) { diff --git a/src/Statements/CreateStatement.php b/src/Statements/CreateStatement.php index 6510e526f..c164c2507 100644 --- a/src/Statements/CreateStatement.php +++ b/src/Statements/CreateStatement.php @@ -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] @@ -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 ($this->like == null) { + $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; + } 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..20b6bcfd1 100644 --- a/src/Statements/DeleteStatement.php +++ b/src/Statements/DeleteStatement.php @@ -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/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/SelectStatement.php b/src/Statements/SelectStatement.php index cd1d628b5..f2f94a8a2 100644 --- a/src/Statements/SelectStatement.php +++ b/src/Statements/SelectStatement.php @@ -226,8 +226,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/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..9b0cda764 100644 --- a/src/Utils/BufferedQuery.php +++ b/src/Utils/BufferedQuery.php @@ -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; } @@ -321,8 +320,8 @@ public function extract($end = false) // Checking if the delimiter definition ended. if (($delimiter != '') - && ((($i < $len) && (Context::isWhitespace($this->query[$i]))) - || (($i === $len) && ($end))) + && ((($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/Formatter.php b/src/Utils/Formatter.php index df260e7da..4bfdc266a 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); 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..7a8f462f5 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,7 +726,7 @@ 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) { + foreach ($ops as $i => $iValue) { $ret .= $ops[$i][1] . ' '; // Adding everything between this and next replacement. @@ -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; @@ -846,7 +845,7 @@ public static function getClauseStartOffset($statement, $list, $clause) 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/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/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; } From ef7968e5a80de41c2bbd5ad3d93b6f47fe3f9705 Mon Sep 17 00:00:00 2001 From: Bruno Perel Date: Mon, 26 Nov 2018 20:02:58 +0100 Subject: [PATCH 26/54] Use triple (in)equalities when type compatibility is ensured --- src/Components/AlterOperation.php | 2 +- src/Components/Array2d.php | 2 +- src/Components/Condition.php | 2 +- src/Components/Expression.php | 2 +- src/Components/IntoKeyword.php | 4 ++-- src/Components/OptionsArray.php | 8 ++++---- src/Components/SetOperation.php | 4 ++-- src/Context.php | 6 +++--- src/Statement.php | 10 ++++------ src/Statements/CreateStatement.php | 18 +++++++++--------- src/Statements/DeleteStatement.php | 14 +++++++------- src/Statements/InsertStatement.php | 10 +++++----- src/Statements/ReplaceStatement.php | 6 +++--- src/Utils/BufferedQuery.php | 4 ++-- src/Utils/CLI.php | 2 +- src/Utils/Formatter.php | 6 +++--- src/Utils/Query.php | 4 ++-- tools/ContextGenerator.php | 10 +++++----- 18 files changed, 56 insertions(+), 58 deletions(-) diff --git a/src/Components/AlterOperation.php b/src/Components/AlterOperation.php index 9383eca84..1ae28ae69 100644 --- a/src/Components/AlterOperation.php +++ b/src/Components/AlterOperation.php @@ -236,7 +236,7 @@ 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 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/Condition.php b/src/Components/Condition.php index 4e12b3f75..2be0abd49 100644 --- a/src/Components/Condition.php +++ b/src/Components/Condition.php @@ -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/Expression.php b/src/Components/Expression.php index 4a83f63fd..5350e360c 100644 --- a/src/Components/Expression.php +++ b/src/Components/Expression.php @@ -299,7 +299,7 @@ public static function parse(Parser $parser, TokensList $list, array $options = $ret->function = $prev[1]->value; } } elseif ($token->value === ')') { - if ($brackets == 0) { + if ($brackets === 0) { // Not our bracket break; } else { diff --git a/src/Components/IntoKeyword.php b/src/Components/IntoKeyword.php index dd3f7f65c..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; } 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/SetOperation.php b/src/Components/SetOperation.php index 83f2e552b..7dab0a164 100644 --- a/src/Components/SetOperation.php +++ b/src/Components/SetOperation.php @@ -94,7 +94,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; } @@ -113,7 +113,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; } diff --git a/src/Context.php b/src/Context.php index b381aa7b2..869a9bb7e 100644 --- a/src/Context.php +++ b/src/Context.php @@ -313,7 +313,7 @@ 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] === '#') { @@ -382,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] === '@') { @@ -408,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/Statement.php b/src/Statement.php index 50acb719d..418627523 100644 --- a/src/Statement.php +++ b/src/Statement.php @@ -451,9 +451,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; } @@ -489,7 +487,7 @@ public function validateClauseOrder($parser, $list) ); // 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 +499,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 +510,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 c164c2507..3b705c3ec 100644 --- a/src/Statements/CreateStatement.php +++ b/src/Statements/CreateStatement.php @@ -388,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; } @@ -399,18 +399,18 @@ public function parse(Parser $parser, TokensList $list) static::$DB_OPTIONS ); } elseif ($this->options->has('TABLE')) { - if (($token->type == Token::TYPE_KEYWORD) - && ($token->keyword == 'SELECT')) { + 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')) { + } 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') { + } elseif ($token->type === Token::TYPE_KEYWORD + && $token->keyword === 'LIKE') { /* CREATE TABLE `new_tbl` LIKE 'orig_tbl' */ $list->idx = $nextidx; $this->like = Expression::parse( @@ -422,7 +422,7 @@ public function parse(Parser $parser, TokensList $list) ) ); // The 'LIKE' keyword was found, but no table_name was found next to it - if ($this->like == null) { + if (is_null($this->like)) { $parser->error( 'A table name was expected.', $list->tokens[$list->idx] diff --git a/src/Statements/DeleteStatement.php b/src/Statements/DeleteStatement.php index 20b6bcfd1..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); } 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/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/Utils/BufferedQuery.php b/src/Utils/BufferedQuery.php index 9b0cda764..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; } @@ -319,7 +319,7 @@ public function extract($end = false) } // Checking if the delimiter definition ended. - if (($delimiter != '') + if (($delimiter !== '') && ((($i < $len) && Context::isWhitespace($this->query[$i])) || (($i === $len) && $end)) ) { 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 4bfdc266a..c41c69cc5 100644 --- a/src/Utils/Formatter.php +++ b/src/Utils/Formatter.php @@ -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/Query.php b/src/Utils/Query.php index 7a8f462f5..f928ab356 100644 --- a/src/Utils/Query.php +++ b/src/Utils/Query.php @@ -633,7 +633,7 @@ public static function getClause($statement, $list, $clause, $type = 0, $skipFir && ($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; @@ -843,7 +843,7 @@ public static function getClauseStartOffset($statement, $list, $clause) } } - if ($brackets == 0) { + if ($brackets === 0) { if (($token->type === Token::TYPE_KEYWORD) && isset($clauses[$token->keyword]) && ($clause === $token->keyword) 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)); From 2d0b364f6424ce433f77e9f876bc7d1a0e0b6281 Mon Sep 17 00:00:00 2001 From: Bruno Perel Date: Mon, 26 Nov 2018 23:03:59 +0100 Subject: [PATCH 27/54] Fix tests --- src/Components/CaseExpression.php | 41 ++++++++++++++++-------------- src/Components/JoinKeyword.php | 2 +- src/Statements/CreateStatement.php | 2 +- 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/src/Components/CaseExpression.php b/src/Components/CaseExpression.php index eb91f5f8f..19061db67 100644 --- a/src/Components/CaseExpression.php +++ b/src/Components/CaseExpression.php @@ -129,10 +129,10 @@ public static function parse(Parser $parser, TokensList $list, array $options = case 'END': $state = 3; // end of CASE expression ++$list->idx; - break; + break 2; default: $parser->error('Unexpected keyword.', $token); - break; + break 2; } } else { $ret->value = Expression::parse($parser, $list); @@ -148,43 +148,46 @@ public static function parse(Parser $parser, TokensList $list, array $options = $new_value = Expression::parse($parser, $list); $state = 2; $ret->compare_values[] = $new_value; - break; + break; case 'ELSE': ++$list->idx; // Skip 'ELSE' $ret->else_result = Expression::parse($parser, $list); $state = 0; // last clause of CASE expression - break; + break; case 'END': $state = 3; // end of CASE expression ++$list->idx; - break; + break 2; default: $parser->error('Unexpected keyword.', $token); - break; + break 2; } } - } else if ($token->type === Token::TYPE_KEYWORD) { - if ($token->keyword === 'THEN') { + } else { + if ($token->type === Token::TYPE_KEYWORD + && $token->keyword === 'THEN' + ) { ++$list->idx; // Skip 'THEN' $new_result = Expression::parse($parser, $list); $state = 0; $ret->results[] = $new_result; - } else { + } elseif ($token->type === Token::TYPE_KEYWORD) { $parser->error('Unexpected keyword.', $token); + break; } - break; } } elseif ($state === 2) { if ($type === 0) { - if ($token->type === Token::TYPE_KEYWORD) { - if ($token->keyword === 'THEN') { - ++$list->idx; // Skip 'THEN' - $new_result = Expression::parse($parser, $list); - $ret->results[] = $new_result; - $state = 1; - } else { - $parser->error('Unexpected keyword.', $token); - } + if ($token->type === Token::TYPE_KEYWORD + && $token->keyword === 'THEN' + ) { + ++$list->idx; // Skip 'THEN' + $new_result = Expression::parse($parser, $list); + $ret->results[] = $new_result; + $state = 1; + } elseif ($token->type === Token::TYPE_KEYWORD) { + $parser->error('Unexpected keyword.', $token); + break; } } } diff --git a/src/Components/JoinKeyword.php b/src/Components/JoinKeyword.php index 0b5aae961..786092dd9 100644 --- a/src/Components/JoinKeyword.php +++ b/src/Components/JoinKeyword.php @@ -179,7 +179,7 @@ public static function parse(Parser $parser, TokensList $list, array $options = $state = 1; } else { /* Next clause is starting */ - break; + break 2; } break; } diff --git a/src/Statements/CreateStatement.php b/src/Statements/CreateStatement.php index 3b705c3ec..808109ecc 100644 --- a/src/Statements/CreateStatement.php +++ b/src/Statements/CreateStatement.php @@ -507,7 +507,7 @@ public function parse(Parser $parser, TokensList $list) // This is used instead of `++$brackets` because, // initially, `$brackets` is `false` cannot be // incremented. - ++$brackets; + $brackets = $brackets + 1; } elseif ($token->value === ')') { --$brackets; } From 2692733c1cfce3b70c78b8a2d267948bd6f035a2 Mon Sep 17 00:00:00 2001 From: Walter Cheuk Date: Wed, 28 Nov 2018 05:51:50 +0000 Subject: [PATCH 28/54] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (44 of 44 strings) [CI skip] --- locale/zh_TW/LC_MESSAGES/sqlparser.mo | Bin 4323 -> 4408 bytes locale/zh_TW/LC_MESSAGES/sqlparser.po | 10 ++++------ 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/locale/zh_TW/LC_MESSAGES/sqlparser.mo b/locale/zh_TW/LC_MESSAGES/sqlparser.mo index 357eaa79c77df0c0ca9603d79a284fc222ca9abf..ebe8e5ca8816a8c31f89d22914e6286919b70647 100644 GIT binary patch delta 1260 zcmYk*T}V_x6u|LuHOoz{%(Aj_G)>p_#;QbSMlHG8$F7ziP!Yu9-fBr#*}ZAfgB20f zLsk}IZ$U;8M6eY-^+8e3LD54Hil_xbFM$sc^*?uS;K1zf-kH5KbI#066~8DM`j(e* zTTu+^dg`S#rFP<+iyz8Fx>A)miN%cgsHOyvyHOj+eno{>rw&C*9R0K~^KKP2|IFA7=%1%XOqV!+I4!n1$)&8NO6KHXYHF$M|NkNpNZ}ycX=S_ZXxI%qdbyEu;^i92L6ch} z*^uH+VW*Xws<=dUk%J~%s>-TMBf3A_ea1}a0W)rD^K75lWhE!l=Us&d%)x=)ctnRS zZN?(H_k>PZVax0>V^;EW=3`gMo>S47nJ{%lM?4&fTG8HExZ9&E`cCzQ2K|wqXv{M* zoK-OLI;$X3XH-`kHQTjsTfMK&>#Onk+y`5YHnTsP;4`C-46#Ia*y@ef>!!|NP`CI)0o@P?`S%5P`x_hE0`2W1JKTdAd&4nn uM#St-wk-YW%KI^v{Qm06^ziuXv+L7OUe4aRl=S5$UHF|9KiACx@E5Bze+31MlJuOv&~Lcwkb$hhuF|`A%Y;LcC(drXW1DGL0W=t zg-~0!4iOX)5yD>MmDDO*^+K(Tw8P{+R*87X&hcQCmLJePFBYwt9xPm)zXaj3- z9Gmb4GB2wh(r92{4*PH(HLTrO{3sLUg%@xOX0ZcvC>zgt;|thEe+9QC!`jJQK99H5*T*{UxWz*0Z7_KOu;5y2J$Jmaq@dPfToag|n<#`mNn8xk+4&}v* z-t#qYyk>JTqMaz~Pob>0F)IVNXh`U0y$1^@5&4C3S4~xf6Z^3XhfyLkjk3{glzpCh ze!^DztEgi=lV!g_lt|hrAAF~p_)Fs%1Co4iQ8rvcdGQ}_Vq;CQ-{U!oGB1O&;f&Xx zMS`h5B8OLBkN~e2x{CDpuWZ2&mWb)cC&wH;YKJv9W2Ky= z<=Po%Abll0F=fRj5~*M+?&f}$H^h$UMz3y$w2&D-)YD~{h7lMZ(nsP~6HdZT>4TOV z4{N3oV%|ZSXP9C0XqQ0=L@dYEqwCv;wF%4C`uG`0CQ?rD^7v#h9-9oh*K*0glrMTV Ww;Z_VH-jNFf3xC;FMqe{iSIA0kBjjD 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." From 87c68a45cf0aecec98865d72274003f7b9e869c3 Mon Sep 17 00:00:00 2001 From: Kurt Eilertsen Date: Tue, 27 Nov 2018 20:47:53 +0000 Subject: [PATCH 29/54] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegian?= =?UTF-8?q?=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 86.4% (38 of 44 strings) [CI skip] --- locale/nb/LC_MESSAGES/sqlparser.mo | Bin 1480 -> 3860 bytes locale/nb/LC_MESSAGES/sqlparser.po | 104 +++++++++-------------------- 2 files changed, 33 insertions(+), 71 deletions(-) diff --git a/locale/nb/LC_MESSAGES/sqlparser.mo b/locale/nb/LC_MESSAGES/sqlparser.mo index 4b2c743c5dea94aafe56cc9406f76049a7904a5e..7a08d057807c4a65b921358f140f04a53c71b5f2 100644 GIT binary patch literal 3860 zcma)8OKe+36n#LU#r#SsrBFUo_e-1Sd@3MyKj1blM8rvzIHj;DW52O8^?1geH!s1g zKw<$>C00mCNJuQYU;zsxphB$35)}!F6+$dnB3N{bSa9yV=TDr181?0JX70@WoO|c` z*Bx6v2rv%edmLZ&wjg*0c=dMt!Fc_SAUFc#z`ek$z^8zp1LuH00QUg*Yzcxo@HyaP zz>k2tfL{Th1l|CW+#kR(;I=!{d!7M4g!wX%&PgEI@lLk>3Gg81Ujlame*x|X-UO1( zyY5QyG%$~O12_$Q4@h=@m#zN^d>HfXTZ7;M;6Why^DL0`Uj&k03iu%KD)0&5$G}H` z-va6UPe8KocOdz*bsKyE?!%vZfn&g*5yRs^(!Vp8+WS0kALbG8W#GF&y5}e072wTm zUcV>R_ZE=i_95_5;Mc&zz#p^qzkn3qN1>GLo&X*Io(Jv#t^!H^J>YKO7eMm&d*Bh^ zpTIHT?)y@?GVnC!8c6G(0ZIO6AjRWvApQmS-=FGx97yp#2_(5oK-zyBNcO%D+z$K{ zNcMaKB>rvyDXzZ(5kgM}TnV;;6of56It6#*BTi_5Wougxv|*7@vMrsktR~!=5SmHH zI81OWf_1D|l_rUq(Snr4-FD3=rg>XzP_*~I_E?Eo5evI2qP`b(u9-FtI$0899Zqpp zH!5jk-QO6mmoq~1)rI_s?%o!6On?c~7%*4} zDiY>G*}(EbFmIT%T*tiLH*UyV&~K4nB<7fGca+ZsM7=9qA*h09A9AQ6&XFe4bw@1n zLdc|H!IX@R0Vg@5qW>W$kyIUTZQbaGl68lmfpnIq_~pqih`4SC7dDXP9C^a9LRo|A zkr9)cRTAZ7m>O~=5mr)~-0C1%ITVo&x5&Ceu&jHgyj^- zk==+p?&CMIKBRrQwJ;<@6)^wEi_i3tdXi+G?&S0?vrxwIHo7Q&eldugFqnLYa2 z!hAV5hdK_cR3M5wV~gzE^4uJoFICFyWVuqBoqM4)GqYG;S~?9;-As5>gjK=Yw{qa* zigTT~I6l5&Vk)XNQNyL8U~F@|lZGH3hm-9tCnv|_D=PHqX2*5y()_~sKu3}Jm0V@E zQXa%?vM`Z5YqUchhE;G;WKO){#yg5jeS%RA#=@OiuAU302Xf?FL)fsa>xQ19BAc#B zmpiW#%T;*J*mewU9Y2jvO`Txre@|()_Y|8vk-HeaC^Y2}Mdy{&C3dWEER4izE=XIJ zu#rT*t#XU^6R$Z;bYl!{g*7-@OWLx^Zm4I)>(^U?nijp<{WFE2tXZrQ2NxqjjSGE? zihAf?FQdB*LR<-j()U*+TK9CqNobB+QYqm?Q^OFYOdBsOp6n(7W*KW`6Uhvt($1y% zs@|w*?_d*;)}~#CqqwFfR`9Ahrr}UaC~~QVq?VY#FbN-$7IZ*8w6}~hu+!g`z(?k! zs=>!tQX9tOfjjYJ!CWsg8XI(9-^u=K-N{J7GyHgH_>lNJ5i8qmwKn=k{X(OQ!Hmo< z#2Jn9G8*29h9#oJ8=1DS5kk)OIA?sdX@!pIu`C2j8OLxuU!9%HkE)*^gp7UwWW3{! z0k?R$DkwYU(;@Ss5X^dl)3(;?+dJ?)?P_>?XNiSDTeIY>UcZKR2R>m|XZ;#hR*)ql z+!ulwZ0j!dzrJM3%&kS6yzPH}{10IyK>9M1fj8T+|Ui4L^@1OF3cDcF4KUT?p**^DEdn3%Yq$(^D&Tao!b ztdfcv@~zACyA`QHKF7Y8es9cI%A|^sY^aO39CRQ#Q6^)Y)MB-q==uqehL7|`)go%yB`NhEx z;BH)W@B`>-;>tHL(bdW4gm{vFf9*;8wjC|Jg$CnU?T)Z?ltK*@Mz2V%Z?uMf&>~7r z5tZORtioG32ftt%dOSo?Xuvq!g7dHlKXH!*)x2$uXo+Y*6`UMnV+b$d2TZ`jX`&T) z2Gs`*VH%EL3_e55BS2n+xr9f_kJQijP!OpVm@qjS*=1XFtwu*)iyL;lf*-v@KGllx zla?#$&2~dJrQ=Fl^rg$T&q$OV*=x(H+Ok`&N&nY8_9yw>AL89WMbB)mXYwMuQ^@l} z;3c|opqDJC*0E}`Ae;(c1@E<-naglQ&#}~d{HxdbX(q`>;ni@tt6u1;>8{Cp5hHeS OjvZlJuI2XI(xg9VqE4Lv diff --git a/locale/nb/LC_MESSAGES/sqlparser.po b/locale/nb/LC_MESSAGES/sqlparser.po index a935fb530..de71f93bc 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: 2018-11-29 06:08+0000\n" +"Last-Translator: Kurt Eilertsen \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.3-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 @@ -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,10 +72,8 @@ 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 @@ -95,25 +90,21 @@ 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." @@ -125,20 +116,16 @@ 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 @@ -147,16 +134,12 @@ msgid "A rename operation was expected." msgstr "Raden er slettet." #: 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." @@ -164,33 +147,28 @@ msgstr "" #: 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 +176,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" From ad6a0ce1efcde74726e28e9b3da9ffad3fc4c474 Mon Sep 17 00:00:00 2001 From: Hardik Jogadia Date: Tue, 4 Dec 2018 12:35:50 +0000 Subject: [PATCH 30/54] Translated using Weblate (Gujarati) Currently translated at 34.1% (15 of 44 strings) [CI skip] --- locale/gu/LC_MESSAGES/sqlparser.mo | Bin 534 -> 2529 bytes locale/gu/LC_MESSAGES/sqlparser.po | 39 +++++++++++++++-------------- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/locale/gu/LC_MESSAGES/sqlparser.mo b/locale/gu/LC_MESSAGES/sqlparser.mo index b36a1107881737a576ac251a8aa1f13173e67dbc..84b897d15666c7b89209bee690000590f196c585 100644 GIT binary patch literal 2529 zcmb_dU27aw7#_8Lt)HkMSjE@U61AQENG+tBq_|BsF__JUWTVx)*`1Tkw6o`oGiS3| zy=enlA&7`n!3IJx)iN8KqKJA^EeQS#ncL!p*Io!d=gelayQb#GfwRw?Iq%2wKJPoT zzdv!{l7Z`StY@*-v7T1jve!!|8jZk+|xU_K+Z;<1Wk z_Ax5gB`u0Nx9P~>VLNH$sN#yi;Z-X8R^=R%)Ubk%y*?MUnnl7VYhP2&8Wc!NvKr%Y zAe}1C$_3fXb!v`eK9!klFviJ|WPyuZV&wU3*%9@C1ZT+06$zgOfg^Z7Cr)B8W<&Tk9V!(M^~IbKlAN07YU<3UCX-2{1X{wiiCZzQKH@R+c8~XD#JNFM3N}p_#L54u2^z$2{Rnvk+7r+dN&b24+cQDKT3tnPWcF zY0PmnFH3{z%#fKGG}9+2b0V8Qc{DwkPQ%cgLyJ_3w%uF#+?-h`n&UZot(YxL9eukv zlTS=rfiz3L#RJ!p!q3vg!t^xFP%8131!mp;hxZog#+GN6`Ar}%i+URSyEBt=t6129NM*0#Vj)4%=3z{F<)64DmyYU z>(+hCH7A5$3$nyLy$wbOhbg`t<#dWN!-+HIB;%@+N{u(;TIhK471L(RiTG`e!Vf44 z!>IL96yAu!OHp_eH+Xa{YMtMCm!t4~ZF5l>D9azB@aHJpgxOC3SRT_s!Y={WqwqUz zv>mlBMBys6-*_GT+o-h`g+FTd)hPTN_FL`TtvEV|vN_%rRXVTCH2nj}E6n?Lx zq6k!Q9cJKsRX#tsyw>AO|)e{}r}))UARtiFI0Q>jaXh9>QI~5#S;K zbfLMrLoF!bvSJ)6?jM6b0QG&LYsIfJLo1-=hw%yWf1};jV`D_?wCYBOLktW?chmdS|1=6)s+-DYV^4?PDN)(rgZko}cb$u%&&_ zL)BEoMRjV^39vhseX8~l(*gA?^o!p%gEJz>)vEWcXY3W5|8mBe8oc;_VW$l}gA2-Q v`vmEiTqRXsk(QPLvyGuZvFa-lD~OnA%{KOJ9rvSoB_1h+flvR(DQWxzP%VSX delta 312 zcmYL^&q~8U5XLLbDMvkc@i1aLZBK02%oW{2r9U1pzYHDbPac*wQ&tTl6GMhlPUDc+H* zO=%U}UQeOYt|kYfdFyV!dZ%rjYhSv0Ts>FCi%tt;BTGJU;R8;{l56i)a8FPC0YMxkn9?fj`~s(0R8s%| 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." From 4b3684f16ecb3539057cbba3141473c059141a45 Mon Sep 17 00:00:00 2001 From: Bruno Perel Date: Sun, 9 Dec 2018 09:47:08 +0100 Subject: [PATCH 31/54] Fix unused variable --- src/Utils/Query.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Utils/Query.php b/src/Utils/Query.php index f928ab356..b43a35e1f 100644 --- a/src/Utils/Query.php +++ b/src/Utils/Query.php @@ -726,12 +726,12 @@ public static function replaceClauses($statement, $list, array $ops) $ret .= static::getClause($statement, $list, $ops[0][0], -1) . ' '; // Doing replacements. - foreach ($ops as $i => $iValue) { - $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]) . ' '; } } From 37df692dce830d3d30bd60c8165c0c0a05703d38 Mon Sep 17 00:00:00 2001 From: Deven Bansod Date: Thu, 20 Dec 2018 17:37:56 +0530 Subject: [PATCH 32/54] Add support for PURGE statements Fix #207 Signed-off-by: Deven Bansod --- src/Parser.php | 2 + src/Statements/PurgeStatement.php | 143 +++++++++++++++++++++++++++ tests/Builder/PurgeStatementTest.php | 22 +++++ tests/Parser/PurgeStatementTest.php | 31 ++++++ tests/data/parser/parsePurge.in | 1 + tests/data/parser/parsePurge.out | 1 + tests/data/parser/parsePurge2.in | 1 + tests/data/parser/parsePurge2.out | 1 + tests/data/parser/parsePurge3.in | 1 + tests/data/parser/parsePurge3.out | 1 + tests/data/parser/parsePurge4.in | 1 + tests/data/parser/parsePurge4.out | 1 + tests/data/parser/parsePurgeErr.in | 1 + tests/data/parser/parsePurgeErr.out | 1 + tests/data/parser/parsePurgeErr2.in | 1 + tests/data/parser/parsePurgeErr2.out | 1 + tests/data/parser/parsePurgeErr3.in | 1 + tests/data/parser/parsePurgeErr3.out | 1 + 18 files changed, 212 insertions(+) create mode 100644 src/Statements/PurgeStatement.php create mode 100644 tests/Builder/PurgeStatementTest.php create mode 100644 tests/Parser/PurgeStatementTest.php create mode 100644 tests/data/parser/parsePurge.in create mode 100644 tests/data/parser/parsePurge.out create mode 100644 tests/data/parser/parsePurge2.in create mode 100644 tests/data/parser/parsePurge2.out create mode 100644 tests/data/parser/parsePurge3.in create mode 100644 tests/data/parser/parsePurge3.out create mode 100644 tests/data/parser/parsePurge4.in create mode 100644 tests/data/parser/parsePurge4.out create mode 100644 tests/data/parser/parsePurgeErr.in create mode 100644 tests/data/parser/parsePurgeErr.out create mode 100644 tests/data/parser/parsePurgeErr2.in create mode 100644 tests/data/parser/parsePurgeErr2.out create mode 100644 tests/data/parser/parsePurgeErr3.in create mode 100644 tests/data/parser/parsePurgeErr3.out diff --git a/src/Parser.php b/src/Parser.php index ab97855e3..ca756f51e 100644 --- a/src/Parser.php +++ b/src/Parser.php @@ -86,6 +86,8 @@ 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', ); /** 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/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/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/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 From 64ffe88a1ce27777b4e52de42f549cb697d4a1fb Mon Sep 17 00:00:00 2001 From: Deven Bansod Date: Thu, 20 Dec 2018 18:31:25 +0530 Subject: [PATCH 33/54] Add tests for builder of CREATE or REPLACE VIEW Signed-off-by: Deven Bansod --- tests/Builder/CreateStatementTest.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) 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() From d046cb2b4bf0a0c072644efe391c0cdbd3cfd7f4 Mon Sep 17 00:00:00 2001 From: Deven Bansod Date: Thu, 20 Dec 2018 22:34:01 +0530 Subject: [PATCH 34/54] Fix building of RenameStatement * The nuance here is that we don't treat `RENAME TABLE` as the keyword of the clause, only `RENAME` is considered. * That's why we can't use `Statement::$CLAUSES` directly here (even with value of `3` (see `Statement::$CLAUSES`)) * Providing an overriden definition of `build()` in RenameStatement Signed-off-by: Deven Bansod --- src/Components/RenameOperation.php | 2 +- src/Statements/CreateStatement.php | 2 +- src/Statements/RenameStatement.php | 8 +++++ tests/Builder/RenameStatementTest.php | 42 +++++++++++++++++++++++++++ 4 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 tests/Builder/RenameStatementTest.php 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/Statements/CreateStatement.php b/src/Statements/CreateStatement.php index 808109ecc..65cdbbb26 100644 --- a/src/Statements/CreateStatement.php +++ b/src/Statements/CreateStatement.php @@ -411,7 +411,7 @@ public function parse(Parser $parser, TokensList $list) $this->select = new SelectStatement($parser, $list); } elseif ($token->type === Token::TYPE_KEYWORD && $token->keyword === 'LIKE') { - /* CREATE TABLE `new_tbl` LIKE 'orig_tbl' */ + /* CREATE TABLE `new_tbl` LIKE 'orig_tbl' */ $list->idx = $nextidx; $this->like = Expression::parse( $parser, 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/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() + ); + } +} From e135782aca6e54e9535e43aaa34259392d92dc89 Mon Sep 17 00:00:00 2001 From: Deven Bansod Date: Fri, 21 Dec 2018 11:43:44 +0530 Subject: [PATCH 35/54] Add support for end options in SET statement * Support `[{ COLLATE expr | DEFAULT }] in `SET NAMES` statement Signed-off-by: Deven Bansod --- src/Statement.php | 15 ++++++++-- src/Statements/SetStatement.php | 22 +++++++++++++-- tests/Builder/SetStatementTest.php | 34 +++++++++++++++++++---- tests/data/parser/parseSetNames2.in | 1 + tests/data/parser/parseSetNames2.out | 1 + tests/data/parser/parseSetNames3.in | 1 + tests/data/parser/parseSetNames3.out | 1 + tests/data/parser/parseSetNamesError2.in | 1 + tests/data/parser/parseSetNamesError2.out | 1 + tests/data/parser/parseSetNamesError3.in | 1 + tests/data/parser/parseSetNamesError3.out | 1 + 11 files changed, 69 insertions(+), 10 deletions(-) create mode 100644 tests/data/parser/parseSetNames2.in create mode 100644 tests/data/parser/parseSetNames2.out create mode 100644 tests/data/parser/parseSetNames3.in create mode 100644 tests/data/parser/parseSetNames3.out create mode 100644 tests/data/parser/parseSetNamesError2.in create mode 100644 tests/data/parser/parseSetNamesError2.out create mode 100644 tests/data/parser/parseSetNamesError3.in create mode 100644 tests/data/parser/parseSetNamesError3.out diff --git a/src/Statement.php b/src/Statement.php index 418627523..ec715c2c0 100644 --- a/src/Statement.php +++ b/src/Statement.php @@ -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 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, 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/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/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 From aab096048673cea6d763be8b9d8759b8d5d09aec Mon Sep 17 00:00:00 2001 From: Deven Bansod Date: Fri, 21 Dec 2018 19:29:44 +0530 Subject: [PATCH 36/54] Fix: Add missing support for STRAIGHT_JOIN * This was originally added in v3.0.8 but was erroneously removed in https://github.com/phpmyadmin/sql-parser/commit/848610a2004e37ec374c2c7a688c8c9131cd5687#diff-1041b02aae148a89853dc0d2710afc9c * Added a test case for this so that we don't remove it in future releases Signed-off-by: Deven Bansod --- src/Parser.php | 4 ++++ tests/data/parser/parseSelectJoinStraight.in | 3 +++ tests/data/parser/parseSelectJoinStraight.out | 7 +++++++ 3 files changed, 14 insertions(+) create mode 100644 tests/data/parser/parseSelectJoinStraight.in create mode 100644 tests/data/parser/parseSelectJoinStraight.out diff --git a/src/Parser.php b/src/Parser.php index ca756f51e..738872ade 100644 --- a/src/Parser.php +++ b/src/Parser.php @@ -246,6 +246,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', 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 From 98ccf7333c014dceba827b0f5a472ddbdce7c0c8 Mon Sep 17 00:00:00 2001 From: Deven Bansod Date: Fri, 21 Dec 2018 18:23:54 +0530 Subject: [PATCH 37/54] Throw a parse error if a comma missing between two alter operations Signed-off-by: Deven Bansod --- src/Components/AlterOperation.php | 23 +++++++++++++++++++++++ tests/Parser/AlterStatementTest.php | 3 +++ tests/data/parser/parseAlter7.in | 1 + tests/data/parser/parseAlter7.out | 1 + tests/data/parser/parseAlterErr.in | 2 ++ tests/data/parser/parseAlterErr.out | 4 ++++ tests/data/parser/parseAlterErr2.in | 2 ++ tests/data/parser/parseAlterErr2.out | 4 ++++ 8 files changed, 40 insertions(+) create mode 100644 tests/data/parser/parseAlter7.in create mode 100644 tests/data/parser/parseAlter7.out create mode 100644 tests/data/parser/parseAlterErr.in create mode 100644 tests/data/parser/parseAlterErr.out create mode 100644 tests/data/parser/parseAlterErr2.in create mode 100644 tests/data/parser/parseAlterErr2.out diff --git a/src/Components/AlterOperation.php b/src/Components/AlterOperation.php index 1ae28ae69..b9e64d228 100644 --- a/src/Components/AlterOperation.php +++ b/src/Components/AlterOperation.php @@ -243,6 +243,16 @@ public static function parse(Parser $parser, TokensList $list, array $options = ); 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'); + // 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/tests/Parser/AlterStatementTest.php b/tests/Parser/AlterStatementTest.php index 33de19d85..6b7d4a2d7 100644 --- a/tests/Parser/AlterStatementTest.php +++ b/tests/Parser/AlterStatementTest.php @@ -25,6 +25,9 @@ public function testAlterProvider() array('parser/parseAlter4'), array('parser/parseAlter5'), array('parser/parseAlter6'), + array('parser/parseAlter7'), + array('parser/parseAlterErr'), + array('parser/parseAlterErr2'), ); } } 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/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 From db91c1d4eb328f233d9973079a24c92303040d83 Mon Sep 17 00:00:00 2001 From: Deven Bansod Date: Sat, 22 Dec 2018 10:03:52 +0530 Subject: [PATCH 38/54] Throw a parser error on extraneous comma in UPDATE statement Signed-off-by: Deven Bansod --- src/Components/SetOperation.php | 22 ++++++++++++++++++---- tests/Parser/UpdateStatementTest.php | 1 + tests/data/parser/parseUpdateErr.in | 7 +++++++ tests/data/parser/parseUpdateErr.out | 19 +++++++++++++++++++ 4 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 tests/data/parser/parseUpdateErr.in create mode 100644 tests/data/parser/parseUpdateErr.out diff --git a/src/Components/SetOperation.php b/src/Components/SetOperation.php index 7dab0a164..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. @@ -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( @@ -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/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/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 From 09faf92c59feed5c2db7490372ba3dd3947707e8 Mon Sep 17 00:00:00 2001 From: Deven Bansod Date: Sat, 22 Dec 2018 14:11:48 +0530 Subject: [PATCH 39/54] Add support for LOCK and UNLOCK Statements Signed-off-by: Deven Bansod --- src/Components/LockExpression.php | 203 ++++++++++++++++++++++++ src/Parser.php | 5 + src/Statements/LockStatement.php | 128 +++++++++++++++ tests/Builder/LockStatementTest.php | 68 ++++++++ tests/Components/LockExpressionTest.php | 71 +++++++++ tests/Parser/LockStatementTest.php | 41 +++++ tests/data/parser/parseLock1.in | 1 + tests/data/parser/parseLock1.out | 1 + tests/data/parser/parseLock2.in | 1 + tests/data/parser/parseLock2.out | 1 + tests/data/parser/parseLock3.in | 1 + tests/data/parser/parseLock3.out | 1 + tests/data/parser/parseLock4.in | 1 + tests/data/parser/parseLock4.out | 1 + tests/data/parser/parseLock5.in | 1 + tests/data/parser/parseLock5.out | 1 + tests/data/parser/parseLock6.in | 1 + tests/data/parser/parseLock6.out | 1 + tests/data/parser/parseLockErr1.in | 1 + tests/data/parser/parseLockErr1.out | 1 + tests/data/parser/parseLockErr10.in | 1 + tests/data/parser/parseLockErr10.out | 1 + tests/data/parser/parseLockErr2.in | 1 + tests/data/parser/parseLockErr2.out | 1 + tests/data/parser/parseLockErr3.in | 2 + tests/data/parser/parseLockErr3.out | 4 + tests/data/parser/parseLockErr4.in | 2 + tests/data/parser/parseLockErr4.out | 4 + tests/data/parser/parseLockErr5.in | 2 + tests/data/parser/parseLockErr5.out | 4 + tests/data/parser/parseLockErr6.in | 2 + tests/data/parser/parseLockErr6.out | 4 + tests/data/parser/parseLockErr7.in | 1 + tests/data/parser/parseLockErr7.out | 1 + tests/data/parser/parseLockErr8.in | 1 + tests/data/parser/parseLockErr8.out | 1 + tests/data/parser/parseLockErr9.in | 1 + tests/data/parser/parseLockErr9.out | 1 + tests/data/parser/parseUnlock1.in | 1 + tests/data/parser/parseUnlock1.out | 1 + tests/data/parser/parseUnlockErr1.in | 1 + tests/data/parser/parseUnlockErr1.out | 1 + 42 files changed, 568 insertions(+) create mode 100644 src/Components/LockExpression.php create mode 100644 src/Statements/LockStatement.php create mode 100644 tests/Builder/LockStatementTest.php create mode 100644 tests/Components/LockExpressionTest.php create mode 100644 tests/Parser/LockStatementTest.php create mode 100644 tests/data/parser/parseLock1.in create mode 100644 tests/data/parser/parseLock1.out create mode 100644 tests/data/parser/parseLock2.in create mode 100644 tests/data/parser/parseLock2.out create mode 100644 tests/data/parser/parseLock3.in create mode 100644 tests/data/parser/parseLock3.out create mode 100644 tests/data/parser/parseLock4.in create mode 100644 tests/data/parser/parseLock4.out create mode 100644 tests/data/parser/parseLock5.in create mode 100644 tests/data/parser/parseLock5.out create mode 100644 tests/data/parser/parseLock6.in create mode 100644 tests/data/parser/parseLock6.out create mode 100644 tests/data/parser/parseLockErr1.in create mode 100644 tests/data/parser/parseLockErr1.out create mode 100644 tests/data/parser/parseLockErr10.in create mode 100644 tests/data/parser/parseLockErr10.out create mode 100644 tests/data/parser/parseLockErr2.in create mode 100644 tests/data/parser/parseLockErr2.out create mode 100644 tests/data/parser/parseLockErr3.in create mode 100644 tests/data/parser/parseLockErr3.out create mode 100644 tests/data/parser/parseLockErr4.in create mode 100644 tests/data/parser/parseLockErr4.out create mode 100644 tests/data/parser/parseLockErr5.in create mode 100644 tests/data/parser/parseLockErr5.out create mode 100644 tests/data/parser/parseLockErr6.in create mode 100644 tests/data/parser/parseLockErr6.out create mode 100644 tests/data/parser/parseLockErr7.in create mode 100644 tests/data/parser/parseLockErr7.out create mode 100644 tests/data/parser/parseLockErr8.in create mode 100644 tests/data/parser/parseLockErr8.out create mode 100644 tests/data/parser/parseLockErr9.in create mode 100644 tests/data/parser/parseLockErr9.out create mode 100644 tests/data/parser/parseUnlock1.in create mode 100644 tests/data/parser/parseUnlock1.out create mode 100644 tests/data/parser/parseUnlockErr1.in create mode 100644 tests/data/parser/parseUnlockErr1.out 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/Parser.php b/src/Parser.php index 738872ade..c4db416e3 100644 --- a/src/Parser.php +++ b/src/Parser.php @@ -88,6 +88,11 @@ class Parser extends Core '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', ); /** 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/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/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/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/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/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 From b422d7de078dc70d635b4fefd63ce8a8ec5cd857 Mon Sep 17 00:00:00 2001 From: Deven Bansod Date: Sat, 22 Dec 2018 20:43:49 +0530 Subject: [PATCH 40/54] Add support for INDEX hints in SELECT statement Signed-off-by: Deven Bansod --- src/Components/IndexHint.php | 193 ++++++++++++++++++ src/Parser.php | 12 ++ src/Statement.php | 11 + src/Statements/SelectStatement.php | 10 + tests/Builder/SelectStatementTest.php | 12 ++ tests/Parser/SelectStatementTest.php | 6 + tests/data/parser/parseSelectIndexHint1.in | 1 + tests/data/parser/parseSelectIndexHint1.out | 1 + tests/data/parser/parseSelectIndexHint2.in | 1 + tests/data/parser/parseSelectIndexHint2.out | 1 + tests/data/parser/parseSelectIndexHintErr1.in | 1 + .../data/parser/parseSelectIndexHintErr1.out | 1 + tests/data/parser/parseSelectIndexHintErr2.in | 1 + .../data/parser/parseSelectIndexHintErr2.out | 1 + tests/data/parser/parseSelectIndexHintErr3.in | 1 + .../data/parser/parseSelectIndexHintErr3.out | 1 + tests/data/parser/parseSelectIndexHintErr4.in | 1 + .../data/parser/parseSelectIndexHintErr4.out | 1 + 18 files changed, 256 insertions(+) create mode 100644 src/Components/IndexHint.php create mode 100644 tests/data/parser/parseSelectIndexHint1.in create mode 100644 tests/data/parser/parseSelectIndexHint1.out create mode 100644 tests/data/parser/parseSelectIndexHint2.in create mode 100644 tests/data/parser/parseSelectIndexHint2.out create mode 100644 tests/data/parser/parseSelectIndexHintErr1.in create mode 100644 tests/data/parser/parseSelectIndexHintErr1.out create mode 100644 tests/data/parser/parseSelectIndexHintErr2.in create mode 100644 tests/data/parser/parseSelectIndexHintErr2.out create mode 100644 tests/data/parser/parseSelectIndexHintErr3.in create mode 100644 tests/data/parser/parseSelectIndexHintErr3.out create mode 100644 tests/data/parser/parseSelectIndexHintErr4.in create mode 100644 tests/data/parser/parseSelectIndexHintErr4.out 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/Parser.php b/src/Parser.php index c4db416e3..ec8637adb 100644 --- a/src/Parser.php +++ b/src/Parser.php @@ -177,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', @@ -190,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', @@ -308,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', diff --git a/src/Statement.php b/src/Statement.php index ec715c2c0..6eb42c748 100644 --- a/src/Statement.php +++ b/src/Statement.php @@ -497,6 +497,17 @@ 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 ($minJoin === 0 && stripos($clauseType, 'JOIN')) { diff --git a/src/Statements/SelectStatement.php b/src/Statements/SelectStatement.php index f2f94a8a2..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. * 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/Parser/SelectStatementTest.php b/tests/Parser/SelectStatementTest.php index 42fb955c7..747249f17 100644 --- a/tests/Parser/SelectStatementTest.php +++ b/tests/Parser/SelectStatementTest.php @@ -69,6 +69,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/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 From 84d4cc4019b0da7c87f39bec43b6c991c8041460 Mon Sep 17 00:00:00 2001 From: tmtisfree Date: Sat, 22 Dec 2018 15:26:47 +0000 Subject: [PATCH 41/54] Translated using Weblate (French) Currently translated at 100.0% (44 of 44 strings) [CI skip] --- locale/fr/LC_MESSAGES/sqlparser.mo | Bin 4715 -> 4678 bytes locale/fr/LC_MESSAGES/sqlparser.po | 10 +++++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/locale/fr/LC_MESSAGES/sqlparser.mo b/locale/fr/LC_MESSAGES/sqlparser.mo index 62fd9e78ac9bf46867f8391fc811c16bc607f70d..f348d3e1358de877bb0858cf25a0443600037cba 100644 GIT binary patch delta 544 zcmYMwPbhNIzR?k#8;ORAXt9FG3D00B z%)vhR4OQr>Bu_*H?Db>pfyk~%U1Sa%we4m&1xOjo* z(a1vTW+eIFH!q1HCI^{Mr$K@bdf^9Rb1-We?S~`Q52-BbnyMOq2MjA`+lG2`F@_e&BCw3#`8@3TSnx~ zVUg=1@}gJdB7VjTxQ$nEq))`)9FF4$Jcr+L6%QQ|IgKxI7~kS0{M7CL#^cm|{UWz< z6z%+0zqEG))@hufv4y8_8_PJ57b)NawCl@w3}0grH*f@hpuJFbU@!PQj#A%87oVYz z@49}$6V&;^`rg3tLBeR1aW@c;QZJ(oe$`!nkM@Ee@g#mld!Ze)1BZr0&f;a{r%DC+ z7Mbt-%x?9xTTfcED>rJ5u&HX%C9r4Rrb%;i_p0hAiw68TARmCiY z3H$E+w{cqO3CEi*O%%s8PwsAzq^i1~NO~g;lZDtA=i2`3jIG^;c1 N-vb%dd6@r`{Rh#bZ_EGy 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." From 12b1e994bdd17e896baa4a0693f95148371c00c9 Mon Sep 17 00:00:00 2001 From: Deven Bansod Date: Sun, 23 Dec 2018 10:32:16 +0530 Subject: [PATCH 42/54] Add missing ChangeLog entries Signed-off-by: Deven Bansod --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 03f8a9e95..0ab8c561d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,15 @@ ## [Unreleased] +* Add support for INDEX hints in SELECT statement +* Add support for LOCK and UNLOCK TABLES statement +* Add detection of extraneous comma in UPDATE statement +* Add detection of a missing comma between two ALTER operations +* Add missing support for STRAIGHT_JOIN +* Add support for end options in SET statement +* Fix building of RENAME statements +* Add support for PURGE statements + ## [4.2.5] - 2018-10-31 * Fix issue with CREATE OR REPLACE VIEW. From 66ef8022152b1fed9b0bf85e7e4cecd591ee492e Mon Sep 17 00:00:00 2001 From: Isaac Bennetch Date: Tue, 25 Dec 2018 13:03:42 -0500 Subject: [PATCH 43/54] Add issue numbers and improve CHANGELOG entries Signed-off-by: Isaac Bennetch --- CHANGELOG.md | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ab8c561d..d1e8831d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,14 +2,16 @@ ## [Unreleased] -* Add support for INDEX hints in SELECT statement -* Add support for LOCK and UNLOCK TABLES statement -* Add detection of extraneous comma in UPDATE statement -* Add detection of a missing comma between two ALTER operations -* Add missing support for STRAIGHT_JOIN -* Add support for end options in SET statement -* Fix building of RENAME statements -* Add support for PURGE statements +* 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 From b79984b9cdf70138bd3ffd7c5fa1ac8525abaced Mon Sep 17 00:00:00 2001 From: Isaac Bennetch Date: Tue, 25 Dec 2018 13:04:38 -0500 Subject: [PATCH 44/54] CHANGELOG dates for 4.3.0 release Signed-off-by: Isaac Bennetch --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d1e8831d2..5548dfa7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log -## [Unreleased] +## [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) From 63527f46ef0a6bd29a9b972baede4b781f1b8497 Mon Sep 17 00:00:00 2001 From: Isaac Bennetch Date: Tue, 25 Dec 2018 13:06:54 -0500 Subject: [PATCH 45/54] Prepare CHANGELOG for next release Signed-off-by: Isaac Bennetch --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5548dfa7e..4f97600c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Change Log +## [Unreleased] + ## [4.3.0] - 2018-12-25 * Add support for aliases on CASE expressions (#162 and #192) From 33dce6f1fef727c057c3e55de359e5a93ed6f2b0 Mon Sep 17 00:00:00 2001 From: Deven Bansod Date: Thu, 3 Jan 2019 18:10:02 +0530 Subject: [PATCH 46/54] Fix incorrect error on DEFAULT keyword in ALTER operation Signed-off-by: Deven Bansod --- src/Components/AlterOperation.php | 2 +- tests/Parser/AlterStatementTest.php | 1 + tests/data/parser/parseAlter8.in | 1 + tests/data/parser/parseAlter8.out | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 tests/data/parser/parseAlter8.in create mode 100644 tests/data/parser/parseAlter8.out diff --git a/src/Components/AlterOperation.php b/src/Components/AlterOperation.php index b9e64d228..e3893f7f0 100644 --- a/src/Components/AlterOperation.php +++ b/src/Components/AlterOperation.php @@ -294,7 +294,7 @@ public static function build($component, array $options = array()) * @param string $tokenValue Value of current token */ private static function checkIfColumnDefinitionKeyword($tokenValue) { - $common_options = array('AUTO_INCREMENT', 'COMMENT'); + $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/tests/Parser/AlterStatementTest.php b/tests/Parser/AlterStatementTest.php index 6b7d4a2d7..3582bf353 100644 --- a/tests/Parser/AlterStatementTest.php +++ b/tests/Parser/AlterStatementTest.php @@ -26,6 +26,7 @@ public function testAlterProvider() array('parser/parseAlter5'), array('parser/parseAlter6'), array('parser/parseAlter7'), + array('parser/parseAlter8'), array('parser/parseAlterErr'), array('parser/parseAlterErr2'), ); 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 From f1623b05642a6e18d3b7c4ca974f819d7b10f6d9 Mon Sep 17 00:00:00 2001 From: Deven Bansod Date: Thu, 3 Jan 2019 18:11:35 +0530 Subject: [PATCH 47/54] Add ChangeLog for Issue 218 Signed-off-by: Deven Bansod --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f97600c3..821ee495f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## [Unreleased] +* 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) From 0eb16ef5e3acacbc792be336754e42d98791a33f Mon Sep 17 00:00:00 2001 From: Isaac Bennetch Date: Sat, 5 Jan 2019 08:46:38 -0500 Subject: [PATCH 48/54] Prepare to release 4.3.1 Signed-off-by: Isaac Bennetch --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 821ee495f..4b1959fab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log -## [Unreleased] +## [4.3.1] - 2019-01-05 * Fixed incorrect error thrown on DEFAULT keyword in ALTER statement (#218) From 34fe5fbd951b453fab70ed2d4d4383431bdd31e5 Mon Sep 17 00:00:00 2001 From: Isaac Bennetch Date: Sat, 5 Jan 2019 09:21:35 -0500 Subject: [PATCH 49/54] Prepare for next release Signed-off-by: Isaac Bennetch --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b1959fab..5b611eb03 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Change Log +## [Unreleased] + ## [4.3.1] - 2019-01-05 * Fixed incorrect error thrown on DEFAULT keyword in ALTER statement (#218) From ab691fac3ca2496433e2e629a26a281661198403 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Sun, 6 Jan 2019 23:10:50 +0000 Subject: [PATCH 50/54] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegian?= =?UTF-8?q?=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 93.2% (41 of 44 strings) [CI skip] --- locale/nb/LC_MESSAGES/sqlparser.mo | Bin 3860 -> 4137 bytes locale/nb/LC_MESSAGES/sqlparser.po | 20 +++++++++----------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/locale/nb/LC_MESSAGES/sqlparser.mo b/locale/nb/LC_MESSAGES/sqlparser.mo index 7a08d057807c4a65b921358f140f04a53c71b5f2..e689627ad13bd7506f6a1d34110b3c26fd620eae 100644 GIT binary patch delta 1158 zcmZwGOGs2v9LMqFIM(i#M0#0$6$Z{S|Mi(R-<^eeV;Uc1$p zVcd_JYy#UD-`wG#kqghT2H&7&`VlpdFHlIV3F|l?!VsQBW?*8d=VwqAoJY;@G4eC7 z_^ZNod{1>hqY_xIAYsNg-#BQ;U?sD{LF~dA)C(7I3fGF~2YH(YK8q^p1UBOwDzOLH zjjP4`8>l5HuP#)`K~;JLXFE8s9Mt1Y)PwhM2foC7B~Tgrf`z5(L-jk4$MIV6`U_P5 z@2E=EQBEE;?Wh3Q0s8Z{%&BY$c2Z`qgRQZ*Ns-sZ(6pWuwShG+<`bbzk(?e4zX)UFe z&7o;SZie;*E0GUXSJBwZA74_w9NKJJSIto6>!k4&nQ~fy){+}7T?wVF8@X(qWXh%^ znRwE5rX!wXucT}=V=v~K{XYV(lZ?eYo5}t5r$QseJI?f_c*c6ENYr+FJ9{-Y}3J3OAX zZiZ3bR{RN$xVqp?Ud_66&8=1@+fQtEaK;i5cQRwg>9h7U?Rb;%M8fKPslV!r?=NOn BlGy+N delta 931 zcmX}qKS-NF7{~D^CYtysY3je4nrf_VA`&6CSYs)1aF+x~2sOm4L&m zAP9;=DGu$>&_5Ih+oeOXAUcV3D4mK9uEoLc@7}aWE}!=cNBj%hE|N0 zp(p9%0kZ)tRq;ie3YzueL+rv5cH&#Sk3X;-+e2p4IEYtq4O{U8cHkcBy%Wr0q}r`h zv;iKPn0SEt<5N^1bCvl`Of!Cu&3KGA@C+4nYmILKuQPs(d0apR{8|ui-jg!5!2Bho}JmpiUHya2o99s{ylkL>7lo0W{b70S{w0 z<3~7(^O$6RJLF*&&oqJ4_5Ox0P^nwR1b)OG+^@|4MWr~wt_nPdH*pLb@j2@K1#H82 zs1kn1UOdHOmWQ^e|KbQ17|)>Q-=O|*gv!V{^08RV-!O?v`90Kolc?Wcq5@vRIBuf? z`iv^!9xAiHV&tDJx`J>Ri%=LcXWS{PrK>Dzl-f1j$uwPyY2gfAcY%ZaZ`weMt7Mei z-6?QQK~WW#B?auREEm$9PD78@!v#m&a\n" +"PO-Revision-Date: 2019-01-08 01:07+0000\n" +"Last-Translator: Allan Nordhøy \n" "Language-Team: Norwegian Bokmål \n" "Language: nb\n" @@ -13,7 +13,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 3.3-dev\n" +"X-Generator: Weblate 3.4-dev\n" #: src/Component.php:43 src/Component.php:63 msgid "Not implemented yet." @@ -37,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 @@ -79,7 +79,7 @@ msgstr "Et symbolnavn var forventet!" #, 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." @@ -108,7 +108,7 @@ 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 @@ -128,10 +128,8 @@ msgid "The new name of the table was expected." 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 msgid "Missing expression." @@ -143,7 +141,7 @@ 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." From 6e83a0306ea128aac84e40c00f18fae3d79f22cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Meneghini=20Fauth?= Date: Tue, 8 Jan 2019 14:05:20 -0200 Subject: [PATCH 51/54] Rename phpunit.xml to phpunit.xml.dist MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Maurício Meneghini Fauth --- .gitignore | 1 + phpunit.xml => phpunit.xml.dist | 0 2 files changed, 1 insertion(+) rename phpunit.xml => phpunit.xml.dist (100%) 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/phpunit.xml b/phpunit.xml.dist similarity index 100% rename from phpunit.xml rename to phpunit.xml.dist From 591608f92ec9f2d1d6495468fc711f6d54e6b648 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Meneghini=20Fauth?= Date: Tue, 8 Jan 2019 14:28:09 -0200 Subject: [PATCH 52/54] Fix phpunit config name on Travis MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Maurício Meneghini Fauth --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5d1570ec8..a42c95f74 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,6 +40,6 @@ cache: directories: - $HOME/.composer/cache -script: - - if [ "$DOCS" != "yes" ] ; then ./vendor/bin/phpunit --configuration phpunit.xml ; 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 From 2941ff6b8b9c4d50362f3bc9bb79f086376c4acc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Meneghini=20Fauth?= Date: Tue, 8 Jan 2019 14:12:57 -0200 Subject: [PATCH 53/54] Bump minimum version to PHP 7.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Drop support for PHP 5.3, PHP 5.4, PHP 5.5, PHP 5.6, PHP 7.0 and HHVM Signed-off-by: Maurício Meneghini Fauth --- .travis.yml | 23 +++++++---------------- CHANGELOG.md | 3 ++- composer.json | 4 ++-- phpunit.xml.dist | 3 +-- 4 files changed, 12 insertions(+), 21 deletions(-) diff --git a/.travis.yml b/.travis.yml index a42c95f74..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.2" + - 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 [ $(php -r "echo PHP_MAJOR_VERSION;") -lt 7 ] ; then sed -i '/sami/D' composer.json ; fi - if [ -n "$REQUIRE" ] ; then composer require "$REQUIRE" ; fi - composer install diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b611eb03..98af7b845 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## [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) @@ -333,4 +335,3 @@ __Breaking changes:__ ## [1.0.0] - 2015-08-20 * First release of this library. - diff --git a/composer.json b/composer.json index d6e1c0970..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": { "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/phpunit.xml.dist b/phpunit.xml.dist index d96b96d7a..36faf5035 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -9,8 +9,7 @@ convertNoticesToExceptions="true" convertWarningsToExceptions="true" processIsolation="false" - stopOnFailure="false" - syntaxCheck="false"> + stopOnFailure="false"> From 28427543566b6dd32fe44db704ea41368ba55c0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Meneghini=20Fauth?= Date: Fri, 11 Jan 2019 00:08:41 -0200 Subject: [PATCH 54/54] Create CODE_OF_CONDUCT.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Maurício Meneghini Fauth --- CODE_OF_CONDUCT.md | 76 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 CODE_OF_CONDUCT.md 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