diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Components/IntoKeyword.php | 108 | ||||
-rw-r--r-- | src/Contexts/ContextMySql50000.php | 8 | ||||
-rw-r--r-- | src/Contexts/ContextMySql50100.php | 8 | ||||
-rw-r--r-- | src/Contexts/ContextMySql50500.php | 8 | ||||
-rw-r--r-- | src/Contexts/ContextMySql50600.php | 8 | ||||
-rw-r--r-- | src/Contexts/ContextMySql50700.php | 8 |
6 files changed, 123 insertions, 25 deletions
diff --git a/src/Components/IntoKeyword.php b/src/Components/IntoKeyword.php index d90963d..1a182ff 100644 --- a/src/Components/IntoKeyword.php +++ b/src/Components/IntoKeyword.php @@ -25,6 +25,30 @@ class IntoKeyword extends Component { /** + * FIELDS/COLUMNS Options for `SELECT...INTO` statements. + * + * @var array + */ + public static $FIELDS_OPTIONS = array( + + 'TERMINATED BY' => array(1, 'expr'), + 'OPTIONALLY' => 2, + 'ENCLOSED BY' => array(3, 'expr'), + 'ESCAPED BY' => array(4, 'expr'), + ); + + /** + * LINES Options for `SELECT...INTO` statements. + * + * @var array + */ + public static $LINES_OPTIONS = array( + + 'STARTING BY' => array(1, 'expr'), + 'TERMINATED BY' => array(2, 'expr'), + ); + + /** * Type of target (OUTFILE or SYMBOL). * * @var string @@ -53,6 +77,29 @@ class IntoKeyword extends Component public $values; /** + * Options for FIELDS/COLUMNS keyword + * + * @var OptionsArray + * @see static::$FIELDS_OPTIONS + */ + public $fields_options; + + /** + * Whether to use `FIELDS` or `COLUMNS` while building + * + * @var boolean + */ + public $fields_keyword; + + /** + * Options for OPTIONS keyword + * + * @var OptionsArray + * @see static::$LINES_OPTIONS + */ + public $lines_options; + + /** * @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. @@ -104,8 +151,10 @@ class IntoKeyword extends Component continue; } - // No other keyword is expected. - break; + // No other keyword is expected except for $state = 4, which expects `LINES` + if ($state !== 4) { + break; + } } if ($state === 0) { @@ -134,8 +183,18 @@ class IntoKeyword extends Component break; } elseif ($state === 2) { $ret->dest = $token->value; - ++$list->idx; - break; + + $state = 3; + } elseif ($state == 3) { + $ret->parseFileOptions($parser, $list, $token->value); + $state = 4; + } elseif ($state == 4) { + if ($token->type === Token::TYPE_KEYWORD && $token->value !== 'LINES') { + break; + } + + $ret->parseFileOptions($parser, $list, $token->value); + $state = 5; } } @@ -143,6 +202,32 @@ class IntoKeyword extends Component return $ret; } + public function parseFileOptions(Parser $parser, TokensList $list, $keyword='FIELDS') { + ++$list->idx; + + if ($keyword === 'FIELDS' || $keyword === 'COLUMNS') { + // parse field options + $this->fields_options = OptionsArray::parse( + $parser, + $list, + static::$FIELDS_OPTIONS + ); + + if ($keyword === 'FIELDS') { + $this->fields_keyword = true; + } else { + $this->fields_keyword = false; + } + } else { + // parse line options + $this->lines_options = OptionsArray::parse( + $parser, + $list, + static::$LINES_OPTIONS + ); + } + } + /** * @param IntoKeyword $component The component to be built. * @param array $options Parameters for building. @@ -158,7 +243,20 @@ class IntoKeyword extends Component } elseif (isset($component->values)) { return ExpressionArray::build($component->values); } else { - return 'OUTFILE "' . $component->dest . '"'; + $ret = 'OUTFILE "' . $component->dest . '"'; + + $fields_options_str = OptionsArray::build($component->fields_options); + if (trim($fields_options_str) !== '') { + $ret .= ($component->fields_keyword) ? ' FIELDS' : ' COLUMNS'; + $ret .= ' ' . $fields_options_str; + } + + $lines_options_str = OptionsArray::build($component->lines_options, array('expr' => true)); + if (trim($lines_options_str) !== '') { + $ret .= ' LINES ' . $lines_options_str; + } + + return $ret; } } }
\ No newline at end of file diff --git a/src/Contexts/ContextMySql50000.php b/src/Contexts/ContextMySql50000.php index f05cacc..798057b 100644 --- a/src/Contexts/ContextMySql50000.php +++ b/src/Contexts/ContextMySql50000.php @@ -145,12 +145,12 @@ class ContextMySql50000 extends Context 'AND CHAIN' => 7, 'FULL JOIN' => 7, 'IF EXISTS' => 7, 'LEFT JOIN' => 7, 'LESS THAN' => 7, 'NO ACTION' => 7, 'ON DELETE' => 7, 'ON UPDATE' => 7, 'UNION ALL' => 7, - 'CROSS JOIN' => 7, 'FOR UPDATE' => 7, 'INNER JOIN' => 7, 'LINEAR KEY' => 7, - 'NO RELEASE' => 7, 'OR REPLACE' => 7, 'RIGHT JOIN' => 7, - 'LINEAR HASH' => 7, + 'CROSS JOIN' => 7, 'ESCAPED BY' => 7, 'FOR UPDATE' => 7, 'INNER JOIN' => 7, + 'LINEAR KEY' => 7, 'NO RELEASE' => 7, 'OR REPLACE' => 7, 'RIGHT JOIN' => 7, + 'ENCLOSED BY' => 7, 'LINEAR HASH' => 7, 'STARTING BY' => 7, 'AND NO CHAIN' => 7, 'FOR EACH ROW' => 7, 'NATURAL JOIN' => 7, 'PARTITION BY' => 7, 'SET PASSWORD' => 7, 'SQL SECURITY' => 7, - 'CHARACTER SET' => 7, 'IF NOT EXISTS' => 7, + 'CHARACTER SET' => 7, 'IF NOT EXISTS' => 7, 'TERMINATED BY' => 7, 'DATA DIRECTORY' => 7, 'UNION DISTINCT' => 7, 'DEFAULT CHARSET' => 7, 'DEFAULT COLLATE' => 7, 'FULL OUTER JOIN' => 7, 'INDEX DIRECTORY' => 7, 'LEFT OUTER JOIN' => 7, 'SUBPARTITION BY' => 7, diff --git a/src/Contexts/ContextMySql50100.php b/src/Contexts/ContextMySql50100.php index d529b8f..c87198d 100644 --- a/src/Contexts/ContextMySql50100.php +++ b/src/Contexts/ContextMySql50100.php @@ -159,12 +159,12 @@ class ContextMySql50100 extends Context 'AND CHAIN' => 7, 'FULL JOIN' => 7, 'IF EXISTS' => 7, 'LEFT JOIN' => 7, 'LESS THAN' => 7, 'NO ACTION' => 7, 'ON DELETE' => 7, 'ON UPDATE' => 7, 'UNION ALL' => 7, - 'CROSS JOIN' => 7, 'FOR UPDATE' => 7, 'INNER JOIN' => 7, 'LINEAR KEY' => 7, - 'NO RELEASE' => 7, 'OR REPLACE' => 7, 'RIGHT JOIN' => 7, - 'LINEAR HASH' => 7, + 'CROSS JOIN' => 7, 'ESCAPED BY' => 7, 'FOR UPDATE' => 7, 'INNER JOIN' => 7, + 'LINEAR KEY' => 7, 'NO RELEASE' => 7, 'OR REPLACE' => 7, 'RIGHT JOIN' => 7, + 'ENCLOSED BY' => 7, 'LINEAR HASH' => 7, 'STARTING BY' => 7, 'AND NO CHAIN' => 7, 'FOR EACH ROW' => 7, 'NATURAL JOIN' => 7, 'PARTITION BY' => 7, 'SET PASSWORD' => 7, 'SQL SECURITY' => 7, - 'CHARACTER SET' => 7, 'IF NOT EXISTS' => 7, + 'CHARACTER SET' => 7, 'IF NOT EXISTS' => 7, 'TERMINATED BY' => 7, 'DATA DIRECTORY' => 7, 'UNION DISTINCT' => 7, 'DEFAULT CHARSET' => 7, 'DEFAULT COLLATE' => 7, 'FULL OUTER JOIN' => 7, 'INDEX DIRECTORY' => 7, 'LEFT OUTER JOIN' => 7, 'SUBPARTITION BY' => 7, diff --git a/src/Contexts/ContextMySql50500.php b/src/Contexts/ContextMySql50500.php index a76f8fe..7028429 100644 --- a/src/Contexts/ContextMySql50500.php +++ b/src/Contexts/ContextMySql50500.php @@ -163,12 +163,12 @@ class ContextMySql50500 extends Context 'AND CHAIN' => 7, 'FULL JOIN' => 7, 'IF EXISTS' => 7, 'LEFT JOIN' => 7, 'LESS THAN' => 7, 'NO ACTION' => 7, 'ON DELETE' => 7, 'ON UPDATE' => 7, 'UNION ALL' => 7, - 'CROSS JOIN' => 7, 'FOR UPDATE' => 7, 'INNER JOIN' => 7, 'LINEAR KEY' => 7, - 'NO RELEASE' => 7, 'OR REPLACE' => 7, 'RIGHT JOIN' => 7, - 'LINEAR HASH' => 7, + 'CROSS JOIN' => 7, 'ESCAPED BY' => 7, 'FOR UPDATE' => 7, 'INNER JOIN' => 7, + 'LINEAR KEY' => 7, 'NO RELEASE' => 7, 'OR REPLACE' => 7, 'RIGHT JOIN' => 7, + 'ENCLOSED BY' => 7, 'LINEAR HASH' => 7, 'STARTING BY' => 7, 'AND NO CHAIN' => 7, 'FOR EACH ROW' => 7, 'NATURAL JOIN' => 7, 'PARTITION BY' => 7, 'SET PASSWORD' => 7, 'SQL SECURITY' => 7, - 'CHARACTER SET' => 7, 'IF NOT EXISTS' => 7, + 'CHARACTER SET' => 7, 'IF NOT EXISTS' => 7, 'TERMINATED BY' => 7, 'DATA DIRECTORY' => 7, 'UNION DISTINCT' => 7, 'DEFAULT CHARSET' => 7, 'DEFAULT COLLATE' => 7, 'FULL OUTER JOIN' => 7, 'INDEX DIRECTORY' => 7, 'LEFT OUTER JOIN' => 7, 'SUBPARTITION BY' => 7, diff --git a/src/Contexts/ContextMySql50600.php b/src/Contexts/ContextMySql50600.php index f6723d5..f9264b3 100644 --- a/src/Contexts/ContextMySql50600.php +++ b/src/Contexts/ContextMySql50600.php @@ -169,12 +169,12 @@ class ContextMySql50600 extends Context 'AND CHAIN' => 7, 'FULL JOIN' => 7, 'IF EXISTS' => 7, 'LEFT JOIN' => 7, 'LESS THAN' => 7, 'NO ACTION' => 7, 'ON DELETE' => 7, 'ON UPDATE' => 7, 'UNION ALL' => 7, - 'CROSS JOIN' => 7, 'FOR UPDATE' => 7, 'INNER JOIN' => 7, 'LINEAR KEY' => 7, - 'NO RELEASE' => 7, 'OR REPLACE' => 7, 'RIGHT JOIN' => 7, - 'LINEAR HASH' => 7, + 'CROSS JOIN' => 7, 'ESCAPED BY' => 7, 'FOR UPDATE' => 7, 'INNER JOIN' => 7, + 'LINEAR KEY' => 7, 'NO RELEASE' => 7, 'OR REPLACE' => 7, 'RIGHT JOIN' => 7, + 'ENCLOSED BY' => 7, 'LINEAR HASH' => 7, 'STARTING BY' => 7, 'AND NO CHAIN' => 7, 'FOR EACH ROW' => 7, 'NATURAL JOIN' => 7, 'PARTITION BY' => 7, 'SET PASSWORD' => 7, 'SQL SECURITY' => 7, - 'CHARACTER SET' => 7, 'IF NOT EXISTS' => 7, + 'CHARACTER SET' => 7, 'IF NOT EXISTS' => 7, 'TERMINATED BY' => 7, 'DATA DIRECTORY' => 7, 'UNION DISTINCT' => 7, 'DEFAULT CHARSET' => 7, 'DEFAULT COLLATE' => 7, 'FULL OUTER JOIN' => 7, 'INDEX DIRECTORY' => 7, 'LEFT OUTER JOIN' => 7, 'SUBPARTITION BY' => 7, diff --git a/src/Contexts/ContextMySql50700.php b/src/Contexts/ContextMySql50700.php index 1cac664..8f761f3 100644 --- a/src/Contexts/ContextMySql50700.php +++ b/src/Contexts/ContextMySql50700.php @@ -175,12 +175,12 @@ class ContextMySql50700 extends Context 'AND CHAIN' => 7, 'FULL JOIN' => 7, 'IF EXISTS' => 7, 'LEFT JOIN' => 7, 'LESS THAN' => 7, 'NO ACTION' => 7, 'ON DELETE' => 7, 'ON UPDATE' => 7, 'UNION ALL' => 7, - 'CROSS JOIN' => 7, 'FOR UPDATE' => 7, 'INNER JOIN' => 7, 'LINEAR KEY' => 7, - 'NO RELEASE' => 7, 'OR REPLACE' => 7, 'RIGHT JOIN' => 7, - 'LINEAR HASH' => 7, + 'CROSS JOIN' => 7, 'ESCAPED BY' => 7, 'FOR UPDATE' => 7, 'INNER JOIN' => 7, + 'LINEAR KEY' => 7, 'NO RELEASE' => 7, 'OR REPLACE' => 7, 'RIGHT JOIN' => 7, + 'ENCLOSED BY' => 7, 'LINEAR HASH' => 7, 'STARTING BY' => 7, 'AND NO CHAIN' => 7, 'FOR EACH ROW' => 7, 'NATURAL JOIN' => 7, 'PARTITION BY' => 7, 'SET PASSWORD' => 7, 'SQL SECURITY' => 7, - 'CHARACTER SET' => 7, 'IF NOT EXISTS' => 7, + 'CHARACTER SET' => 7, 'IF NOT EXISTS' => 7, 'TERMINATED BY' => 7, 'DATA DIRECTORY' => 7, 'UNION DISTINCT' => 7, 'DEFAULT CHARSET' => 7, 'DEFAULT COLLATE' => 7, 'FULL OUTER JOIN' => 7, 'INDEX DIRECTORY' => 7, 'LEFT OUTER JOIN' => 7, 'SUBPARTITION BY' => 7, |