/** * ReferenceDefinition ::= REFERENCES tbl_name (index_col_name,...) * [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE] * [ON DELETE reference_option] * [ON UPDATE reference_option] * * @return \TYPO3\CMS\Core\Database\Schema\Parser\AST\ReferenceDefinition * @throws \TYPO3\CMS\Core\Database\Schema\Exception\StatementException */ protected function referenceDefinition() : AST\ReferenceDefinition { $this->match(Lexer::T_REFERENCES); $tableName = $this->schemaObjectName(); $this->match(Lexer::T_OPEN_PARENTHESIS); $referenceColumns = []; $referenceColumns[] = $this->indexColumnName(); while ($this->lexer->isNextToken(Lexer::T_COMMA)) { $this->match(Lexer::T_COMMA); $referenceColumns[] = $this->indexColumnName(); } $this->match(Lexer::T_CLOSE_PARENTHESIS); $referenceDefinition = new AST\ReferenceDefinition($tableName, $referenceColumns); while (!$this->lexer->isNextTokenAny([Lexer::T_COMMA, Lexer::T_CLOSE_PARENTHESIS])) { switch ($this->lexer->lookahead['type']) { case Lexer::T_MATCH: $this->match(Lexer::T_MATCH); $referenceDefinition->match = $this->lexer->lookahead['value']; $this->lexer->moveNext(); break; case Lexer::T_ON: $this->match(Lexer::T_ON); if ($this->lexer->isNextToken(Lexer::T_DELETE)) { $this->match(Lexer::T_DELETE); $referenceDefinition->onDelete = $this->referenceOption(); } else { $this->match(Lexer::T_UPDATE); $referenceDefinition->onUpdate = $this->referenceOption(); } break; default: $this->syntaxError('MATCH, ON DELETE or ON UPDATE'); } } return $referenceDefinition; }