summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Ungureanu <udan1107@gmail.com>2016-02-12 23:36:16 +0200
committerDan Ungureanu <udan1107@gmail.com>2016-02-12 23:36:16 +0200
commit8383942ce5abc1527c4e11842ae1b1acbf5030d0 (patch)
tree58a132d10d971d012ee0ac6ac870bffb4f2a836f
parentde8b3efbbca418f7c867909dbcb3fbe4b4a20497 (diff)
downloadsql-parser-8383942ce5abc1527c4e11842ae1b1acbf5030d0.zip
sql-parser-8383942ce5abc1527c4e11842ae1b1acbf5030d0.tar.gz
sql-parser-8383942ce5abc1527c4e11842ae1b1acbf5030d0.tar.bz2
Expression: Refactored parsing options.v3.3.0
-rw-r--r--src/Components/AlterOperation.php4
-rw-r--r--src/Components/CreateDefinition.php2
-rw-r--r--src/Components/Expression.php75
-rw-r--r--src/Components/IntoKeyword.php5
-rw-r--r--src/Components/JoinKeyword.php2
-rw-r--r--src/Components/PartitionDefinition.php4
-rw-r--r--src/Components/Reference.php5
-rw-r--r--src/Components/RenameOperation.php10
-rw-r--r--src/Components/SetOperation.php2
-rw-r--r--src/Parser.php24
-rw-r--r--src/Statements/AlterStatement.php4
-rw-r--r--src/Statements/CreateStatement.php10
-rw-r--r--tests/Components/ArrayObjTest.php2
-rw-r--r--tests/Components/ExpressionArrayTest.php4
-rw-r--r--tests/Components/OptionsArrayTest.php2
15 files changed, 93 insertions, 62 deletions
diff --git a/src/Components/AlterOperation.php b/src/Components/AlterOperation.php
index 8dad8e8..d0b09f1 100644
--- a/src/Components/AlterOperation.php
+++ b/src/Components/AlterOperation.php
@@ -172,8 +172,8 @@ class AlterOperation extends Component
$parser,
$list,
array(
- 'noAlias' => true,
- 'noBrackets' => true,
+ 'breakOnAlias' => true,
+ 'parseField' => 'column',
)
);
if ($ret->field === null) {
diff --git a/src/Components/CreateDefinition.php b/src/Components/CreateDefinition.php
index 66ea4b2..13e5e83 100644
--- a/src/Components/CreateDefinition.php
+++ b/src/Components/CreateDefinition.php
@@ -55,7 +55,7 @@ class CreateDefinition extends Component
// Generated columns options.
'GENERATED ALWAYS' => 8,
- 'AS' => array(9, 'expr', array('bracketsDelimited' => true)),
+ 'AS' => array(9, 'expr', array('parenthesesDelimited' => true)),
'VIRTUAL' => 10,
'PERSISTENT' => 11,
'STORED' => 11,
diff --git a/src/Components/Expression.php b/src/Components/Expression.php
index a365d32..f6d3895 100644
--- a/src/Components/Expression.php
+++ b/src/Components/Expression.php
@@ -119,6 +119,31 @@ class Expression extends Component
}
/**
+ * Possible options:
+ *
+ * `field`
+ *
+ * First field to be filled.
+ * If this is not specified, it takes the value of `parseField`.
+ *
+ * `parseField`
+ *
+ * Specifies the type of the field parsed. It may be `database`,
+ * `table` or `column`. These expressions may not include
+ * parentheses.
+ *
+ * `breakOnAlias`
+ *
+ * If not empty, breaks when the alias occurs (it is not included).
+ *
+ * `breakOnParentheses`
+ *
+ * If not empty, breaks when the first parentheses occurs.
+ *
+ * `parenthesesDelimited`
+ *
+ * If not empty, breaks after last parentheses occurred.
+ *
* @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.
@@ -164,6 +189,12 @@ class Expression extends Component
*/
$prev = array(null, null);
+ // When a field is parsed, no parentheses are expected.
+ if (!empty($options['parseField'])) {
+ $options['breakOnParentheses'] = true;
+ $options['field'] = $options['parseField'];
+ }
+
for (; $list->idx < $list->count; ++$list->idx) {
/**
@@ -195,7 +226,9 @@ class Expression extends Component
// A `(` was previously found and this keyword is the
// beginning of a statement, so this is a subquery.
$ret->subquery = $token->value;
- } elseif ($token->flags & Token::FLAG_KEYWORD_FUNCTION) {
+ } elseif (($token->flags & Token::FLAG_KEYWORD_FUNCTION)
+ && (empty($options['parseField']))
+ ) {
$isExpr = true;
} elseif (($token->flags & Token::FLAG_KEYWORD_RESERVED)
&& ($brackets === 0)
@@ -207,7 +240,7 @@ class Expression extends Component
break;
}
if ($token->value === 'AS') {
- if (!empty($options['noAlias'])) {
+ if (!empty($options['breakOnAlias'])) {
break;
}
if (!empty($ret->alias)) {
@@ -224,8 +257,24 @@ class Expression extends Component
}
}
+ if (($token->type === Token::TYPE_NUMBER)
+ || ($token->type === Token::TYPE_BOOL)
+ || (($token->type === Token::TYPE_SYMBOL)
+ && ($token->flags & Token::FLAG_SYMBOL_VARIABLE))
+ || (($token->type === Token::TYPE_OPERATOR)
+ && ($token->value !== '.'))
+ ) {
+ if (!empty($options['parseField'])) {
+ break;
+ }
+
+ // Numbers, booleans and operators (except dot) are usually part
+ // of expressions.
+ $isExpr = true;
+ }
+
if ($token->type === Token::TYPE_OPERATOR) {
- if ((!empty($options['noBrackets']))
+ if ((!empty($options['breakOnParentheses']))
&& (($token->value === '(') || ($token->value === ')'))
) {
// No brackets were expected.
@@ -244,7 +293,7 @@ class Expression extends Component
} elseif ($token->value === ')') {
--$brackets;
if ($brackets === 0) {
- if (!empty($options['bracketsDelimited'])) {
+ if (!empty($options['parenthesesDelimited'])) {
// The current token is the last bracket, the next
// one will be outside the expression.
$ret->expr .= $token->token;
@@ -264,19 +313,7 @@ class Expression extends Component
}
}
- if (($token->type === Token::TYPE_NUMBER)
- || ($token->type === Token::TYPE_BOOL)
- || (($token->type === Token::TYPE_SYMBOL)
- && ($token->flags & Token::FLAG_SYMBOL_VARIABLE))
- || (($token->type === Token::TYPE_OPERATOR)
- && ($token->value !== '.'))
- ) {
- // Numbers, booleans and operators (except dot) are usually part
- // of expressions.
- $isExpr = true;
- }
-
- // Saving the previous token.
+ // Saving the previous tokens.
$prev[0] = $prev[1];
$prev[1] = $token;
@@ -323,14 +360,14 @@ class Expression extends Component
$dot = true;
$ret->expr .= $token->token;
} else {
- $field = (!empty($options['skipColumn'])) ? 'table' : 'column';
+ $field = empty($options['field']) ? 'column' : $options['field'];
if (empty($ret->$field)) {
$ret->$field = $token->value;
$ret->expr .= $token->token;
$dot = false;
} else {
// No alias is expected.
- if (!empty($options['noAlias'])) {
+ if (!empty($options['breakOnAlias'])) {
break;
}
if (!empty($ret->alias)) {
diff --git a/src/Components/IntoKeyword.php b/src/Components/IntoKeyword.php
index 1ac7be8..56f349f 100644
--- a/src/Components/IntoKeyword.php
+++ b/src/Components/IntoKeyword.php
@@ -107,9 +107,8 @@ class IntoKeyword extends Component
$parser,
$list,
array(
- 'noAlias' => true,
- 'noBrackets' => true,
- 'skipColumn' => true,
+ 'parseField' => 'table',
+ 'breakOnAlias' => true,
)
);
$state = 1;
diff --git a/src/Components/JoinKeyword.php b/src/Components/JoinKeyword.php
index 224e802..d8e6ee9 100644
--- a/src/Components/JoinKeyword.php
+++ b/src/Components/JoinKeyword.php
@@ -128,7 +128,7 @@ class JoinKeyword extends Component
break;
}
} elseif ($state === 1) {
- $expr->expr = Expression::parse($parser, $list, array('skipColumn' => true));
+ $expr->expr = Expression::parse($parser, $list, array('field' => 'table'));
$state = 2;
} elseif ($state === 2) {
if (($token->type === Token::TYPE_KEYWORD) && ($token->value === 'ON')) {
diff --git a/src/Components/PartitionDefinition.php b/src/Components/PartitionDefinition.php
index 8c54e22..06dc5fc 100644
--- a/src/Components/PartitionDefinition.php
+++ b/src/Components/PartitionDefinition.php
@@ -169,8 +169,8 @@ class PartitionDefinition extends Component
$parser,
$list,
array(
- 'bracketsDelimited' => true,
- 'noAlias' => true,
+ 'parenthesesDelimited' => true,
+ 'breakOnAlias' => true,
)
);
}
diff --git a/src/Components/Reference.php b/src/Components/Reference.php
index 7dce166..7acd92e 100644
--- a/src/Components/Reference.php
+++ b/src/Components/Reference.php
@@ -121,9 +121,8 @@ class Reference extends Component
$parser,
$list,
array(
- 'noAlias' => true,
- 'skipColumn' => true,
- 'noBrackets' => true,
+ 'parseField' => 'table',
+ 'breakOnAlias' => true,
)
);
$state = 1;
diff --git a/src/Components/RenameOperation.php b/src/Components/RenameOperation.php
index 8776963..c0ecf6c 100644
--- a/src/Components/RenameOperation.php
+++ b/src/Components/RenameOperation.php
@@ -93,9 +93,8 @@ class RenameOperation extends Component
$parser,
$list,
array(
- 'noAlias' => true,
- 'noBrackets' => true,
- 'skipColumn' => true,
+ 'breakOnAlias' => true,
+ 'parseField' => 'table',
)
);
if (empty($expr->old)) {
@@ -120,9 +119,8 @@ class RenameOperation extends Component
$parser,
$list,
array(
- 'noBrackets' => true,
- 'skipColumn' => true,
- 'noAlias' => true,
+ 'breakOnAlias' => true,
+ 'parseField' => 'table',
)
);
if (empty($expr->new)) {
diff --git a/src/Components/SetOperation.php b/src/Components/SetOperation.php
index 38aa7f6..9306d43 100644
--- a/src/Components/SetOperation.php
+++ b/src/Components/SetOperation.php
@@ -100,7 +100,7 @@ class SetOperation extends Component
$parser,
$list,
array(
- 'noAlias' => true,
+ 'breakOnAlias' => true,
)
);
if ($tmp == null) {
diff --git a/src/Parser.php b/src/Parser.php
index 2aca938..e878570 100644
--- a/src/Parser.php
+++ b/src/Parser.php
@@ -125,17 +125,17 @@ class Parser
'ALTER' => array(
'class' => 'SqlParser\\Components\\Expression',
'field' => 'table',
- 'options' => array('skipColumn' => true),
+ 'options' => array('parseField' => 'table'),
),
'ANALYZE' => array(
'class' => 'SqlParser\\Components\\ExpressionArray',
'field' => 'tables',
- 'options' => array('skipColumn' => true),
+ 'options' => array('parseField' => 'table'),
),
'BACKUP' => array(
'class' => 'SqlParser\\Components\\ExpressionArray',
'field' => 'tables',
- 'options' => array('skipColumn' => true),
+ 'options' => array('parseField' => 'table'),
),
'CALL' => array(
'class' => 'SqlParser\\Components\\FunctionCall',
@@ -144,22 +144,22 @@ class Parser
'CHECK' => array(
'class' => 'SqlParser\\Components\\ExpressionArray',
'field' => 'tables',
- 'options' => array('skipColumn' => true),
+ 'options' => array('parseField' => 'table'),
),
'CHECKSUM' => array(
'class' => 'SqlParser\\Components\\ExpressionArray',
'field' => 'tables',
- 'options' => array('skipColumn' => true),
+ 'options' => array('parseField' => 'table'),
),
'DROP' => array(
'class' => 'SqlParser\\Components\\ExpressionArray',
'field' => 'fields',
- 'options' => array('skipColumn' => true),
+ 'options' => array('parseField' => 'table'),
),
'FROM' => array(
'class' => 'SqlParser\\Components\\ExpressionArray',
'field' => 'from',
- 'options' => array('skipColumn' => true),
+ 'options' => array('parseField' => 'table'),
),
'GROUP BY' => array(
'class' => 'SqlParser\\Components\\OrderKeyword',
@@ -212,7 +212,7 @@ class Parser
'OPTIMIZE' => array(
'class' => 'SqlParser\\Components\\ExpressionArray',
'field' => 'tables',
- 'options' => array('skipColumn' => true),
+ 'options' => array('parseField' => 'table'),
),
'ORDER BY' => array(
'class' => 'SqlParser\\Components\\OrderKeyword',
@@ -233,12 +233,12 @@ class Parser
'REPAIR' => array(
'class' => 'SqlParser\\Components\\ExpressionArray',
'field' => 'tables',
- 'options' => array('skipColumn' => true),
+ 'options' => array('parseField' => 'table'),
),
'RESTORE' => array(
'class' => 'SqlParser\\Components\\ExpressionArray',
'field' => 'tables',
- 'options' => array('skipColumn' => true),
+ 'options' => array('parseField' => 'table'),
),
'SET' => array(
'class' => 'SqlParser\\Components\\SetOperation',
@@ -251,12 +251,12 @@ class Parser
'TRUNCATE' => array(
'class' => 'SqlParser\\Components\\Expression',
'field' => 'table',
- 'options' => array('skipColumn' => true),
+ 'options' => array('parseField' => 'table'),
),
'UPDATE' => array(
'class' => 'SqlParser\\Components\\ExpressionArray',
'field' => 'tables',
- 'options' => array('skipColumn' => true),
+ 'options' => array('parseField' => 'table'),
),
'VALUE' => array(
'class' => 'SqlParser\\Components\\Array2d',
diff --git a/src/Statements/AlterStatement.php b/src/Statements/AlterStatement.php
index 275eae7..c8786bd 100644
--- a/src/Statements/AlterStatement.php
+++ b/src/Statements/AlterStatement.php
@@ -76,8 +76,8 @@ class AlterStatement extends Statement
$parser,
$list,
array(
- 'noAlias' => true,
- 'noBrackets' => true,
+ 'parseField' => 'column',
+ 'breakOnAlias' => true,
)
);
++$list->idx; // Skipping field.
diff --git a/src/Statements/CreateStatement.php b/src/Statements/CreateStatement.php
index fe6693b..d5e23ad 100644
--- a/src/Statements/CreateStatement.php
+++ b/src/Statements/CreateStatement.php
@@ -342,9 +342,8 @@ class CreateStatement extends Statement
$parser,
$list,
array(
- 'noAlias' => true,
- 'noBrackets' => true,
- 'skipColumn' => true,
+ 'parseField' => 'table',
+ 'breakOnAlias' => true,
)
);
@@ -538,9 +537,8 @@ class CreateStatement extends Statement
$parser,
$list,
array(
- 'noAlias' => true,
- 'noBrackets' => true,
- 'skipColumn' => true,
+ 'parseField' => 'table',
+ 'breakOnAlias' => true,
)
);
++$list->idx;
diff --git a/tests/Components/ArrayObjTest.php b/tests/Components/ArrayObjTest.php
index c71ab37..d62c9d3 100644
--- a/tests/Components/ArrayObjTest.php
+++ b/tests/Components/ArrayObjTest.php
@@ -30,7 +30,7 @@ class ArrayObjTest extends TestCase
array(
'type' => 'SqlParser\\Components\\Expression',
'typeOptions' => array(
- 'noBrackets' => true,
+ 'breakOnParentheses' => true,
),
)
);
diff --git a/tests/Components/ExpressionArrayTest.php b/tests/Components/ExpressionArrayTest.php
index 0fad913..3d8cd77 100644
--- a/tests/Components/ExpressionArrayTest.php
+++ b/tests/Components/ExpressionArrayTest.php
@@ -16,7 +16,7 @@ class ExpressionArrayTest extends TestCase
new Parser(),
$this->getTokensList('(expr)'),
array(
- 'noBrackets' => true,
+ 'breakOnParentheses' => true,
)
);
$this->assertEquals(array(), $component);
@@ -28,7 +28,7 @@ class ExpressionArrayTest extends TestCase
new Parser(),
$this->getTokensList('(expr) +'),
array(
- 'bracketsDelimited' => true,
+ 'parenthesesDelimited' => true,
)
);
$this->assertEquals(1, count($component));
diff --git a/tests/Components/OptionsArrayTest.php b/tests/Components/OptionsArrayTest.php
index 1c8823e..5df776b 100644
--- a/tests/Components/OptionsArrayTest.php
+++ b/tests/Components/OptionsArrayTest.php
@@ -42,7 +42,7 @@ class OptionsArrayTest extends TestCase
new Parser(),
$this->getTokensList('SUM = (3 + 5) RESULT = 8'),
array(
- 'SUM' => array(1, 'expr', array('bracketsDelimited' => true)),
+ 'SUM' => array(1, 'expr', array('parenthesesDelimited' => true)),
'RESULT' => array(2, 'var'),
)
);