Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Add handler for Alter table auto increment
  • Loading branch information
Andrew Svirin committed Oct 6, 2021
commit 138dc7c0565e26bc841c5886c8cf55941252558a
18 changes: 18 additions & 0 deletions src/FakePdoStatementTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,10 @@ public function universalExecute(?array $params = null)
return true;
}

if(false !== stripos($sql, 'SET')){
return true;
}

//echo "\n" . $sql . "\n";

try {
Expand Down Expand Up @@ -304,6 +308,7 @@ function ($row) {
$parsed_query
)
);

break;

case Query\ShowColumnsQuery::class:
Expand All @@ -315,6 +320,19 @@ function ($row) {
$parsed_query
)
);

break;

case Query\AlterTableAutoincrementQuery::class:
[$databaseName, $tableName] = Processor\Processor::parseTableName($this->conn, $parsed_query->table);
$td = $this->conn->getServer()->getTableDefinition($databaseName, $tableName);

foreach ($td->columns as $columnName => $column) {
if ($column instanceof Schema\Column\IntegerColumn && $column->isAutoIncrement()) {
$td->autoIncrementOffsets[$columnName] = $parsed_query->value - 1;
}
}

break;

default:
Expand Down
2 changes: 2 additions & 0 deletions src/FakePdoTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ public function getAttribute($key)
switch ($key) {
case \PDO::ATTR_CASE:
$value = $this->lowercaseResultKeys ? \PDO::CASE_LOWER : \PDO::CASE_UPPER;
case \PDO::ATTR_SERVER_VERSION:
$value = '5.7.0';
}

return $value;
Expand Down
89 changes: 89 additions & 0 deletions src/Parser/AlterTableParser.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
<?php

namespace Vimeo\MysqlEngine\Parser;

use Vimeo\MysqlEngine\Query\AlterTableAutoincrementQuery;
use Vimeo\MysqlEngine\Query\ShowColumnsQuery;
use Vimeo\MysqlEngine\Query\ShowIndexQuery;
use Vimeo\MysqlEngine\Query\ShowTablesQuery;
use Vimeo\MysqlEngine\TokenType;

/**
* Very limited parser for ALTER TABLE {table} AUTO_INCREMENT=1
*/
final class AlterTableParser
{
/**
* @var int
*/
private $pointer = 0;

/**
* @var array<int, Token>
*/
private $tokens;

/**
* @var string
*/
private $sql;

/**
* @param array<int, Token> $tokens
*/
public function __construct(array $tokens, string $sql)
{
$this->tokens = $tokens;
$this->sql = $sql;
}

/**
* @return AlterTableAutoincrementQuery
* @throws ParserException
*/
public function parse()
{
if ($this->tokens[$this->pointer]->value !== 'ALTER') {
throw new ParserException("Parser error: expected ALTER");
}

$this->pointer++;

if ($this->tokens[$this->pointer]->value !== 'TABLE') {
throw new ParserException("Parser error: expected ALTER TABLE");
}

$this->pointer++;

if ($this->tokens[$this->pointer]->type !== TokenType::IDENTIFIER) {
throw new ParserException("Expected table name after TABLE");
}
$table = $this->tokens[$this->pointer]->value;

$this->pointer++;

switch ($this->tokens[$this->pointer]->value) {
case 'AUTO_INCREMENT':
return $this->parseAlterTableAutoIncrement($table);
}
}

private function parseAlterTableAutoIncrement(string $table): AlterTableAutoincrementQuery
{
$this->pointer++;

if ($this->tokens[$this->pointer]->value !== '=') {
throw new ParserException("Parser error: expected ALTER TABLE {table} AUTO_INCREMENT=");
}

$this->pointer++;

if ($this->tokens[$this->pointer]->type !== TokenType::NUMERIC_CONSTANT) {
throw new ParserException("Expected numeric after =");
}

$token = $this->tokens[$this->pointer] ?? null;

return new AlterTableAutoincrementQuery($table, $token->value, $this->sql);
}
}
33 changes: 23 additions & 10 deletions src/Parser/SQLParser.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@
namespace Vimeo\MysqlEngine\Parser;

use Vimeo\MysqlEngine\TokenType;
use Vimeo\MysqlEngine\Query\{SelectQuery,
use Vimeo\MysqlEngine\Query\{AlterTableAutoincrementQuery,
SelectQuery,
DeleteQuery,
ShowIndexQuery,
TruncateQuery,
InsertQuery,
UpdateQuery,
DropTableQuery,
ShowTablesQuery,
ShowColumnsQuery
};
ShowColumnsQuery};

final class SQLParser
{
Expand Down Expand Up @@ -159,7 +159,7 @@ public static function parse(string $sql)
}

/**
* @return SelectQuery|InsertQuery|UpdateQuery|TruncateQuery|DeleteQuery|DropTableQuery|ShowTablesQuery|ShowIndexQuery|ShowColumnsQuery
* @return SelectQuery|InsertQuery|UpdateQuery|TruncateQuery|DeleteQuery|DropTableQuery|ShowTablesQuery|ShowIndexQuery|ShowColumnsQuery|AlterTableAutoincrementQuery
*/
private static function parseImpl(string $sql)
{
Expand All @@ -171,10 +171,20 @@ private static function parseImpl(string $sql)
$tokens = \array_slice($tokens, 1, $close - 1);
$token = $tokens[0];
}
if ($token->type !== TokenType::CLAUSE) {
if ($token->type === TokenType::CLAUSE) {
$command = $token->value;
} elseif ($token->type === TokenType::IDENTIFIER) {
$nextToken = $tokens[1];
if ($nextToken->type === TokenType::RESERVED) {
$command = $token->value . ' ' . $nextToken->value;
} else {
throw new ParserException("Unexpected {$token->value}");
}
} else {
throw new ParserException("Unexpected {$token->value}");
}
switch ($token->value) {

switch ($command) {
case 'SELECT':
$select = new SelectParser(0, $tokens, $sql);
return $select->parse();
Expand All @@ -191,11 +201,14 @@ private static function parseImpl(string $sql)
$truncate = new TruncateParser($tokens, $sql);
return $truncate->parse();
case 'DROP':
$truncate = new DropParser($tokens, $sql);
return $truncate->parse();
$drop = new DropParser($tokens, $sql);
return $drop->parse();
case 'SHOW':
$truncate = new ShowParser($tokens, $sql);
return $truncate->parse();
$show = new ShowParser($tokens, $sql);
return $show->parse();
case 'ALTER TABLE':
$alter = new AlterTableParser($tokens, $sql);
return $alter->parse();
default:
throw new ParserException("Unexpected {$token->value}");
}
Expand Down
27 changes: 27 additions & 0 deletions src/Query/AlterTableAutoincrementQuery.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php
namespace Vimeo\MysqlEngine\Query;

use Vimeo\MysqlEngine\Query\Expression\Expression;

final class AlterTableAutoincrementQuery
{
/**
* @var string
*/
public $table;
/**
* @var int
*/
public $value;
/**
* @var string
*/
public $sql;

public function __construct(string $table, int $value, string $sql)
{
$this->table = $table;
$this->value = $value;
$this->sql = $sql;
}
}