GeezerVison is showing github.com — Fix ALTER statement not constructed properly, phpmyadmin/sql-parser#33 · phpmyadmin/sql-parser@d6888fb
File treeExpand file treeCollapse file tree Open diff view settings Expand file treeCollapse file tree Open diff view settings Collapse file Copy file name to clipboardExpand all lines: src/Components/AlterOperation.php +27-10Lines changed: 27 additions & 10 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -26,19 +26,31 @@ class AlterOperation extends Component | 26 | 26 | { | 27 | 27 |
| 28 | 28 | /** | 29 | | - * All alter operations. | 30 | | - * | | 29 | + * All database options | | 30 | + * | 31 | 31 | * @var array | 32 | 32 | */ | 33 | | - public static $OPTIONS = array( | | 33 | + public static $DB_OPTIONS = array( | | 34 | + 'CHARACTER SET' => array(1, 'var'), | | 35 | + 'CHARSET' => array(1, 'var'), | | 36 | + 'DEFAULT CHARACTER SET' => array(1, 'var'), | | 37 | + 'DEFAULT CHARSET' => array(1, 'var'), | | 38 | + 'UPGRADE' => array(1, 'var'), | | 39 | + 'COLLATE' => array(2, 'var'), | | 40 | + 'DEFAULT COLLATE' => array(2, 'var'), | | 41 | + ); | 34 | 42 |
| 35 | | - // table_options | | 43 | + /** | | 44 | + * All table options | | 45 | + * | | 46 | + * @var array | | 47 | + */ | | 48 | + public static $TABLE_OPTIONS = array( | 36 | 49 | 'ENGINE' => array(1, 'var='), | 37 | 50 | 'AUTO_INCREMENT' => array(1, 'var='), | 38 | 51 | 'AVG_ROW_LENGTH' => array(1, 'var'), | 39 | 52 | 'MAX_ROWS' => array(1, 'var'), | 40 | 53 | 'ROW_FORMAT' => array(1, 'var'), | 41 | | - | 42 | 54 | 'ADD' => 1, | 43 | 55 | 'ALTER' => 1, | 44 | 56 | 'ANALYZE' => 1, | @@ -60,6 +72,7 @@ class AlterOperation extends Component | 60 | 72 | 'RENAME' => 1, | 61 | 73 | 'REORGANIZE' => 1, | 62 | 74 | 'REPAIR' => 1, | | 75 | + 'UPGRADE' => 1, | 63 | 76 |
| 64 | 77 | 'COLUMN' => 2, | 65 | 78 | 'CONSTRAINT' => 2, | @@ -75,11 +88,15 @@ class AlterOperation extends Component | 75 | 88 | 'SPATIAL' => 2, | 76 | 89 | 'TABLESPACE' => 2, | 77 | 90 | 'INDEX' => 2, | | 91 | + ); | 78 | 92 |
| 79 | | - 'DEFAULT CHARACTER SET' => array(3, 'var'), | 80 | | - 'DEFAULT CHARSET' => array(3, 'var'), | 81 | | - | 82 | | - 'COLLATE' => array(4, 'var'), | | 93 | + /** | | 94 | + * All view options | | 95 | + * | | 96 | + * @var array | | 97 | + */ | | 98 | + public static $VIEW_OPTIONS = array( | | 99 | + 'AS' => 1, | 83 | 100 | ); | 84 | 101 |
| 85 | 102 | /** | @@ -165,7 +182,7 @@ public static function parse(Parser $parser, TokensList $list, array $options = | 165 | 182 | } | 166 | 183 |
| 167 | 184 | if ($state === 0) { | 168 | | - $ret->options = OptionsArray::parse($parser, $list, static::$OPTIONS); | | 185 | + $ret->options = OptionsArray::parse($parser, $list, $options); | 169 | 186 | $state = 1; | 170 | 187 | } elseif ($state === 1) { | 171 | 188 | $ret->field = Expression::parse( | |
Collapse file Copy file name to clipboardExpand all lines: src/Statements/AlterStatement.php +23-7Lines changed: 23 additions & 7 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -51,6 +51,15 @@ class AlterStatement extends Statement | 51 | 51 | 'ONLINE' => 1, | 52 | 52 | 'OFFLINE' => 1, | 53 | 53 | 'IGNORE' => 2, | | 54 | + | | 55 | + 'DATABASE' => 3, | | 56 | + 'EVENT' => 3, | | 57 | + 'FUNCTION' => 3, | | 58 | + 'PROCEDURE' => 3, | | 59 | + 'SERVER' => 3, | | 60 | + 'TABLE' => 3, | | 61 | + 'TABLESPACE' => 3, | | 62 | + 'VIEW' => 3, | 54 | 63 | ); | 55 | 64 |
| 56 | 65 | /** | @@ -67,16 +76,14 @@ public function parse(Parser $parser, TokensList $list) | 67 | 76 | $list, | 68 | 77 | static::$OPTIONS | 69 | 78 | ); | 70 | | - | 71 | | - // Skipping `TABLE`. | 72 | | - $list->getNextOfTypeAndValue(Token::TYPE_KEYWORD, 'TABLE'); | | 79 | + ++$list->idx; | 73 | 80 |
| 74 | 81 | // Parsing affected table. | 75 | 82 | $this->table = Expression::parse( | 76 | 83 | $parser, | 77 | 84 | $list, | 78 | 85 | array( | 79 | | - 'parseField' => 'column', | | 86 | + 'parseField' => 'table', | 80 | 87 | 'breakOnAlias' => true, | 81 | 88 | ) | 82 | 89 | ); | @@ -114,7 +121,16 @@ public function parse(Parser $parser, TokensList $list) | 114 | 121 | } | 115 | 122 |
| 116 | 123 | if ($state === 0) { | 117 | | - $this->altered[] = AlterOperation::parse($parser, $list); | | 124 | + $options = array(); | | 125 | + if ($this->options->has('DATABASE')) { | | 126 | + $options = AlterOperation::$DB_OPTIONS; | | 127 | + } elseif ($this->options->has('TABLE')) { | | 128 | + $options = AlterOperation::$TABLE_OPTIONS; | | 129 | + } elseif ($this->options->has('VIEW')) { | | 130 | + $options = AlterOperation::$VIEW_OPTIONS; | | 131 | + } | | 132 | + | | 133 | + $this->altered[] = AlterOperation::parse($parser, $list, $options); | 118 | 134 | $state = 1; | 119 | 135 | } elseif ($state === 1) { | 120 | 136 | if (($token->type === Token::TYPE_OPERATOR) && ($token->value === ',')) { | @@ -135,7 +151,7 @@ public function build() | 135 | 151 | } | 136 | 152 |
| 137 | 153 | return 'ALTER ' . OptionsArray::build($this->options) | 138 | | - . ' TABLE ' . Expression::build($this->table) | 139 | | - . ' ' . implode(', ', $tmp); | | 154 | + . ' ' . Expression::build($this->table) | | 155 | + . ' ' . implode(', ', $tmp); | 140 | 156 | } | 141 | 157 | } |
|