Skip to content

Commit 394fe16

Browse files
authored
Merge pull request #94 from devenbansod/fix_57
Enable Lexing of begin_label in the in-procedure statements
2 parents 8463b6d + a54adc8 commit 394fe16

File tree

8 files changed

+164
-1
lines changed

8 files changed

+164
-1
lines changed

src/Context.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,16 @@ abstract class Context
2929
*/
3030
const KEYWORD_MAX_LENGTH = 30;
3131

32+
/**
33+
* The maximum length of a label.
34+
*
35+
* @see static::$TOKEN_LABEL
36+
* Ref: https://dev.mysql.com/doc/refman/5.7/en/statement-labels.html
37+
*
38+
* @var int
39+
*/
40+
const LABEL_MAX_LENGTH = 16;
41+
3242
/**
3343
* The maximum length of an operator.
3444
*

src/Lexer.php

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ class Lexer
7676

7777
'parseDelimiter', 'parseWhitespace', 'parseNumber',
7878
'parseComment', 'parseOperator', 'parseBool', 'parseString',
79-
'parseSymbol', 'parseKeyword', 'parseUnknown'
79+
'parseSymbol', 'parseKeyword', 'parseLabel', 'parseUnknown'
8080
);
8181

8282
/**
@@ -441,6 +441,61 @@ public function parseKeyword()
441441
return $ret;
442442
}
443443

444+
/**
445+
* Parses a label.
446+
*
447+
* @return Token
448+
*/
449+
public function parseLabel()
450+
{
451+
$token = '';
452+
453+
/**
454+
* Value to be returned.
455+
*
456+
* @var Token $ret
457+
*/
458+
$ret = null;
459+
460+
/**
461+
* The value of `$this->last` where `$token` ends in `$this->str`.
462+
*
463+
* @var int $iEnd
464+
*/
465+
$iEnd = $this->last;
466+
467+
/**
468+
* Whether last parsed character is a whitespace.
469+
*
470+
* @var bool $lastSpace
471+
*/
472+
$lastSpace = false;
473+
474+
for ($j = 1; $j < Context::LABEL_MAX_LENGTH && $this->last < $this->len; ++$j, ++$this->last) {
475+
// Composed keywords shouldn't have more than one whitespace between
476+
// keywords.
477+
if (Context::isWhitespace($this->str[$this->last])) {
478+
if ($lastSpace) {
479+
--$j; // The size of the keyword didn't increase.
480+
continue;
481+
} else {
482+
$lastSpace = true;
483+
}
484+
} elseif ($this->str[$this->last] === ':') {
485+
$token .= $this->str[$this->last];
486+
$ret = new Token($token, Token::TYPE_LABEL);
487+
$iEnd = $this->last;
488+
break;
489+
} else {
490+
$lastSpace = false;
491+
}
492+
$token .= $this->str[$this->last];
493+
}
494+
495+
$this->last = $iEnd;
496+
return $ret;
497+
}
498+
444499
/**
445500
* Parses an operator.
446501
*

src/Token.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,18 @@ class Token
119119
*/
120120
const TYPE_DELIMITER = 9;
121121

122+
/**
123+
* Labels in LOOP statement, ITERATE statement etc.
124+
* For example (only for begin label):
125+
* begin_label: BEGIN [statement_list] END [end_label]
126+
* begin_label: LOOP [statement_list] END LOOP [end_label]
127+
* begin_label: REPEAT [statement_list] ... END REPEAT [end_label]
128+
* begin_label: WHILE ... DO [statement_list] END WHILE [end_label]
129+
*
130+
* @var int
131+
*/
132+
const TYPE_LABEL = 10;
133+
122134
// Flags that describe the tokens in more detail.
123135
// All keywords must have flag 1 so `Context::isKeyword` method doesn't
124136
// require strict comparison.

tests/Lexer/LexerTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ public function testLexProvider()
8080
array('lexer/lexSymbolErr3'),
8181
array('lexer/lexSymbolUser'),
8282
array('lexer/lexWhitespace'),
83+
array('lexer/lexLabel1'),
84+
array('lexer/lexLabel2'),
8385
);
8486
}
8587
}

tests/data/lexer/lexLabel1.in

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
CREATE PROCEDURE doiterate(p1 INT)
2+
BEGIN
3+
label1 : LOOP
4+
SET p1 = p1 + 1;
5+
IF p1 < 10 THEN
6+
ITERATE label1;
7+
END IF;
8+
LEAVE label1;
9+
END LOOP label1;
10+
SET @x = p1;
11+
END

tests/data/lexer/lexLabel1.out

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
a:4:{s:5:"query";s:187:"CREATE PROCEDURE doiterate(p1 INT)
2+
BEGIN
3+
label1 : LOOP
4+
SET p1 = p1 + 1;
5+
IF p1 < 10 THEN
6+
ITERATE label1;
7+
END IF;
8+
LEAVE label1;
9+
END LOOP label1;
10+
SET @x = p1;
11+
END";s:5:"lexer";O:15:"SqlParser\Lexer":8:{s:6:"strict";b:0;s:3:"str";s:187:"CREATE PROCEDURE doiterate(p1 INT)
12+
BEGIN
13+
label1 : LOOP
14+
SET p1 = p1 + 1;
15+
IF p1 < 10 THEN
16+
ITERATE label1;
17+
END IF;
18+
LEAVE label1;
19+
END LOOP label1;
20+
SET @x = p1;
21+
END";s:3:"len";i:187;s:4:"last";i:187;s:4:"list";O:20:"SqlParser\TokensList":3:{s:6:"tokens";a:73:{i:0;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"CREATE";s:5:"value";s:6:"CREATE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:6;}i:2;O:15:"SqlParser\Token":5:{s:5:"token";s:9:"PROCEDURE";s:5:"value";s:9:"PROCEDURE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:7;}i:3;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:16;}i:4;O:15:"SqlParser\Token":5:{s:5:"token";s:9:"doiterate";s:5:"value";s:9:"doiterate";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:17;}i:5;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:26;}i:6;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"p1";s:5:"value";s:2:"p1";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:27;}i:7;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:29;}i:8;O:15:"SqlParser\Token":5:{s:5:"token";s:3:"INT";s:5:"value";s:3:"INT";s:4:"type";i:1;s:5:"flags";i:11;s:8:"position";i:30;}i:9;O:15:"SqlParser\Token":5:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:33;}i:10;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"
22+
";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:34;}i:11;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"BEGIN";s:5:"value";s:5:"BEGIN";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:35;}i:12;O:15:"SqlParser\Token":5:{s:5:"token";s:3:"
23+
";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:40;}i:13;O:15:"SqlParser\Token":5:{s:5:"token";s:8:"label1 :";s:5:"value";s:8:"label1 :";s:4:"type";i:10;s:5:"flags";i:0;s:8:"position";i:43;}i:14;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:51;}i:15;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"LOOP";s:5:"value";s:4:"LOOP";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:52;}i:16;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"
24+
";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:56;}i:17;O:15:"SqlParser\Token":5:{s:5:"token";s:3:"SET";s:5:"value";s:3:"SET";s:4:"type";i:1;s:5:"flags";i:11;s:8:"position";i:61;}i:18;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:64;}i:19;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"p1";s:5:"value";s:2:"p1";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:65;}i:20;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:67;}i:21;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"=";s:5:"value";s:1:"=";s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:68;}i:22;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:69;}i:23;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"p1";s:5:"value";s:2:"p1";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:70;}i:24;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:72;}i:25;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"+";s:5:"value";s:1:"+";s:4:"type";i:2;s:5:"flags";i:1;s:8:"position";i:73;}i:26;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:74;}i:27;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"1";s:5:"value";i:1;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:75;}i:28;O:15:"SqlParser\Token":5:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:76;}i:29;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"
25+
";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:77;}i:30;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"IF";s:5:"value";s:2:"IF";s:4:"type";i:1;s:5:"flags";i:35;s:8:"position";i:82;}i:31;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:84;}i:32;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"p1";s:5:"value";s:2:"p1";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:85;}i:33;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:87;}i:34;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"<";s:5:"value";s:1:"<";s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:88;}i:35;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:89;}i:36;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"10";s:5:"value";i:10;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:90;}i:37;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:92;}i:38;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"THEN";s:5:"value";s:4:"THEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:93;}i:39;O:15:"SqlParser\Token":5:{s:5:"token";s:7:"
26+
";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:97;}i:40;O:15:"SqlParser\Token":5:{s:5:"token";s:7:"ITERATE";s:5:"value";s:7:"ITERATE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:104;}i:41;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:111;}i:42;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"label1";s:5:"value";s:6:"label1";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:112;}i:43;O:15:"SqlParser\Token":5:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:118;}i:44;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"
27+
";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:119;}i:45;O:15:"SqlParser\Token":5:{s:5:"token";s:3:"END";s:5:"value";s:3:"END";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:124;}i:46;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:127;}i:47;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"IF";s:5:"value";s:2:"IF";s:4:"type";i:1;s:5:"flags";i:35;s:8:"position";i:128;}i:48;O:15:"SqlParser\Token":5:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:130;}i:49;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"
28+
";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:131;}i:50;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"LEAVE";s:5:"value";s:5:"LEAVE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:136;}i:51;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:141;}i:52;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"label1";s:5:"value";s:6:"label1";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:142;}i:53;O:15:"SqlParser\Token":5:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:148;}i:54;O:15:"SqlParser\Token":5:{s:5:"token";s:3:"
29+
";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:149;}i:55;O:15:"SqlParser\Token":5:{s:5:"token";s:3:"END";s:5:"value";s:3:"END";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:152;}i:56;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:155;}i:57;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"LOOP";s:5:"value";s:4:"LOOP";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:156;}i:58;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:160;}i:59;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"label1";s:5:"value";s:6:"label1";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:161;}i:60;O:15:"SqlParser\Token":5:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:167;}i:61;O:15:"SqlParser\Token":5:{s:5:"token";s:3:"
30+
";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:168;}i:62;O:15:"SqlParser\Token":5:{s:5:"token";s:3:"SET";s:5:"value";s:3:"SET";s:4:"type";i:1;s:5:"flags";i:11;s:8:"position";i:171;}i:63;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:174;}i:64;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"@x";s:5:"value";s:1:"x";s:4:"type";i:8;s:5:"flags";i:1;s:8:"position";i:175;}i:65;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:177;}i:66;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"=";s:5:"value";s:1:"=";s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:178;}i:67;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:179;}i:68;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"p1";s:5:"value";s:2:"p1";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:180;}i:69;O:15:"SqlParser\Token":5:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:182;}i:70;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"
31+
";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:183;}i:71;O:15:"SqlParser\Token":5:{s:5:"token";s:3:"END";s:5:"value";s:3:"END";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:184;}i:72;O:15:"SqlParser\Token":5:{s:5:"token";N;s:5:"value";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:73;s:3:"idx";i:74;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"errors";a:0:{}}s:6:"parser";O:16:"SqlParser\Parser":5:{s:4:"list";r:8;s:6:"strict";b:0;s:6:"errors";a:0:{}s:10:"statements";a:1:{i:0;O:36:"SqlParser\Statements\CreateStatement":17:{s:4:"name";O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:9:"doiterate";s:6:"column";N;s:4:"expr";s:9:"doiterate";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:13:"entityOptions";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}s:6:"fields";N;s:6:"select";N;s:4:"like";N;s:11:"partitionBy";N;s:13:"partitionsNum";N;s:14:"subpartitionBy";N;s:16:"subpartitionsNum";N;s:10:"partitions";N;s:5:"table";N;s:6:"return";N;s:10:"parameters";a:1:{i:0;O:40:"SqlParser\Components\ParameterDefinition":3:{s:4:"name";s:2:"p1";s:5:"inOut";N;s:4:"type";O:29:"SqlParser\Components\DataType":3:{s:4:"name";s:3:"INT";s:10:"parameters";a:0:{}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}}}s:4:"body";a:62:{i:0;r:76;i:1;r:82;i:2;r:88;i:3;r:94;i:4;r:100;i:5;r:106;i:6;r:112;i:7;r:118;i:8;r:124;i:9;r:130;i:10;r:136;i:11;r:142;i:12;r:148;i:13;r:154;i:14;r:160;i:15;r:166;i:16;r:172;i:17;r:178;i:18;r:184;i:19;r:190;i:20;r:196;i:21;r:202;i:22;r:208;i:23;r:214;i:24;r:220;i:25;r:226;i:26;r:232;i:27;r:238;i:28;r:244;i:29;r:250;i:30;r:256;i:31;r:262;i:32;r:268;i:33;r:274;i:34;r:280;i:35;r:286;i:36;r:292;i:37;r:298;i:38;r:304;i:39;r:310;i:40;r:316;i:41;r:322;i:42;r:328;i:43;r:334;i:44;r:340;i:45;r:346;i:46;r:352;i:47;r:358;i:48;r:364;i:49;r:370;i:50;r:376;i:51;r:382;i:52;r:388;i:53;r:394;i:54;r:400;i:55;r:406;i:56;r:412;i:57;r:418;i:58;r:424;i:59;r:430;i:60;r:436;i:61;r:442;}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:6;s:9:"PROCEDURE";}}s:5:"first";i:0;s:4:"last";i:73;}}s:8:"brackets";i:0;}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}}

tests/data/lexer/lexLabel2.in

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
CREATE PROCEDURE doiterate(p1 INT)
2+
BEGIN
3+
label1: LOOP
4+
SET p1 = p1 + 1;
5+
IF p1 < 10 THEN
6+
ITERATE label1;
7+
END IF;
8+
LEAVE label1;
9+
END LOOP label1;
10+
SET @x = p1;
11+
END

0 commit comments

Comments
 (0)