Skip to content

Commit 748d1c4

Browse files
committed
parse table/column names including DB name
1 parent ed28c7d commit 748d1c4

28 files changed

+2439
-400
lines changed

src/Analyser/AnalyserState.php

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,7 @@ private function analyseSingleSelectQuery(SimpleSelectQuery $select): array
393393
break;
394394
case SelectExprTypeEnum::ALL_COLUMNS:
395395
assert($selectExpr instanceof AllColumns);
396-
$allFields = $this->columnResolver->resolveAllColumns($selectExpr->tableName);
396+
$allFields = $this->columnResolver->resolveAllColumns($selectExpr->tableName?->name);
397397

398398
foreach ($allFields as $field) {
399399
$this->columnResolver->registerField($field, true);
@@ -464,16 +464,17 @@ private function analyseTableReference(TableReference $fromClause, ColumnResolve
464464
$columnResolver = clone $columnResolver;
465465

466466
try {
467-
$tableType = $columnResolver->registerTable($fromClause->name, $fromClause->alias);
467+
$tableType = $columnResolver->registerTable($fromClause->name->name, $fromClause->alias);
468468

469469
if ($tableType === ColumnInfoTableTypeEnum::TABLE) {
470-
$this->referencedTables[$fromClause->name] ??= new ReferencedSymbol\Table($fromClause->name);
470+
$this->referencedTables[$fromClause->name->name]
471+
??= new ReferencedSymbol\Table($fromClause->name->name);
471472
}
472473
} catch (AnalyserException | DbReflectionException $e) {
473474
$this->errors[] = $e->toAnalyserError();
474475
}
475476

476-
return [[$fromClause->alias ?? $fromClause->name], $columnResolver];
477+
return [[$fromClause->alias ?? $fromClause->name->name], $columnResolver];
477478
case TableReferenceTypeEnum::SUBQUERY:
478479
assert($fromClause instanceof Subquery);
479480
$columnResolver = clone $columnResolver;
@@ -548,7 +549,7 @@ private function analyseDeleteQuery(DeleteQuery $query): array
548549

549550
// don't report missing tables to delete if the table reference is not parsed successfully
550551
foreach ($query->tablesToDelete as $table) {
551-
if ($this->columnResolver->hasTableForDelete($table)) {
552+
if ($this->columnResolver->hasTableForDelete($table->name)) {
552553
continue;
553554
}
554555

@@ -557,12 +558,12 @@ private function analyseDeleteQuery(DeleteQuery $query): array
557558
$query->table instanceof Table
558559
&& $query->table->alias === null
559560
&& count($query->tablesToDelete) === 1
560-
&& $query->table->name === $table
561+
&& $query->table->name->name === $table->name
561562
) {
562563
continue;
563564
}
564565

565-
$this->errors[] = AnalyserErrorBuilder::createTableDoesntExistError($table);
566+
$this->errors[] = AnalyserErrorBuilder::createTableDoesntExistError($table->name);
566567
}
567568
} catch (AnalyserException | DbReflectionException $e) {
568569
$this->errors[] = $e->toAnalyserError();
@@ -631,7 +632,7 @@ private function analyseInsertOrReplaceQuery(InsertQuery|ReplaceQuery $query): a
631632
$this->errors[] = $e->toAnalyserError();
632633
}
633634

634-
$tableSchema = $this->columnResolver->findTableSchema($query->tableName);
635+
$tableSchema = $this->columnResolver->findTableSchema($query->tableName->name);
635636
$setColumnNames = [];
636637
$onDuplicateKeyAnalyser = $this;
637638

@@ -759,7 +760,7 @@ private function analyseInsertOrReplaceQuery(InsertQuery|ReplaceQuery $query): a
759760
private function analyseTruncateQuery(TruncateQuery $query): void
760761
{
761762
try {
762-
$this->dbReflection->findTableSchema($query->tableName);
763+
$this->dbReflection->findTableSchema($query->tableName->name);
763764
} catch (DbReflectionException $e) {
764765
$this->errors[] = $e->toAnalyserError();
765766
}
@@ -781,7 +782,7 @@ private function resolveExprType(
781782
try {
782783
$resolvedColumn = $this->columnResolver->resolveColumn(
783784
$expr->name,
784-
$expr->tableName,
785+
$expr->tableName?->name,
785786
$this->fieldBehavior,
786787
$condition,
787788
);

src/Ast/Expr/Column.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace MariaStan\Ast\Expr;
66

77
use MariaStan\Ast\BaseNode;
8+
use MariaStan\Ast\Query\TableReference\TableName;
89
use MariaStan\Parser\Position;
910

1011
final class Column extends BaseNode implements Expr
@@ -13,7 +14,7 @@ public function __construct(
1314
Position $startPosition,
1415
Position $endPosition,
1516
public readonly string $name,
16-
public readonly ?string $tableName = null,
17+
public readonly ?TableName $tableName = null,
1718
) {
1819
parent::__construct($startPosition, $endPosition);
1920
}

src/Ast/Query/DeleteQuery.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,15 @@
88
use MariaStan\Ast\Exception\InvalidAstException;
99
use MariaStan\Ast\Expr\Expr;
1010
use MariaStan\Ast\OrderBy;
11+
use MariaStan\Ast\Query\TableReference\TableName;
1112
use MariaStan\Ast\Query\TableReference\TableReference;
1213
use MariaStan\Parser\Position;
1314

1415
use function count;
1516

1617
final class DeleteQuery extends BaseNode implements Query
1718
{
18-
/** @param non-empty-array<string> $tablesToDelete */
19+
/** @param non-empty-array<TableName> $tablesToDelete */
1920
public function __construct(
2021
Position $startPosition,
2122
Position $endPosition,

src/Ast/Query/InsertQuery.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use MariaStan\Ast\BaseNode;
88
use MariaStan\Ast\Expr\Assignment;
99
use MariaStan\Ast\Query\InsertBody\InsertBody;
10+
use MariaStan\Ast\Query\TableReference\TableName;
1011
use MariaStan\Parser\Position;
1112

1213
final class InsertQuery extends BaseNode implements Query
@@ -15,7 +16,7 @@ final class InsertQuery extends BaseNode implements Query
1516
public function __construct(
1617
Position $startPosition,
1718
Position $endPosition,
18-
public readonly string $tableName,
19+
public readonly TableName $tableName,
1920
public readonly InsertBody $insertBody,
2021
public readonly ?array $onDuplicateKeyUpdate = null,
2122
public readonly bool $ignoreErrors = false,

src/Ast/Query/ReplaceQuery.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@
66

77
use MariaStan\Ast\BaseNode;
88
use MariaStan\Ast\Query\InsertBody\InsertBody;
9+
use MariaStan\Ast\Query\TableReference\TableName;
910
use MariaStan\Parser\Position;
1011

1112
final class ReplaceQuery extends BaseNode implements Query
1213
{
1314
public function __construct(
1415
Position $startPosition,
1516
Position $endPosition,
16-
public readonly string $tableName,
17+
public readonly TableName $tableName,
1718
public readonly InsertBody $insertBody,
1819
) {
1920
parent::__construct($startPosition, $endPosition);

src/Ast/Query/TableReference/Table.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ final class Table extends BaseNode implements TableReference
1313
public function __construct(
1414
Position $startPosition,
1515
Position $endPosition,
16-
public readonly string $name,
16+
public readonly TableName $name,
1717
public readonly ?string $alias = null,
1818
public readonly array $indexHints = [],
1919
) {
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace MariaStan\Ast\Query\TableReference;
6+
7+
use MariaStan\Ast\BaseNode;
8+
use MariaStan\Parser\Position;
9+
10+
final class TableName extends BaseNode
11+
{
12+
public function __construct(
13+
Position $startPosition,
14+
Position $endPosition,
15+
public readonly string $name,
16+
// TODO: consider datbaseName during analysis
17+
public readonly ?string $databaseName = null,
18+
) {
19+
parent::__construct($startPosition, $endPosition);
20+
}
21+
}

src/Ast/Query/TruncateQuery.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,15 @@
77
use MariaStan\Ast\BaseNode;
88
use MariaStan\Ast\Lock\NoWait;
99
use MariaStan\Ast\Lock\Wait;
10+
use MariaStan\Ast\Query\TableReference\TableName;
1011
use MariaStan\Parser\Position;
1112

1213
final class TruncateQuery extends BaseNode implements Query
1314
{
1415
public function __construct(
1516
Position $startPosition,
1617
Position $endPosition,
17-
public readonly string $tableName,
18+
public readonly TableName $tableName,
1819
public readonly Wait|NoWait|null $wait = null,
1920
) {
2021
parent::__construct($startPosition, $endPosition);

src/Ast/SelectExpr/AllColumns.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@
55
namespace MariaStan\Ast\SelectExpr;
66

77
use MariaStan\Ast\BaseNode;
8+
use MariaStan\Ast\Query\TableReference\TableName;
89
use MariaStan\Parser\Position;
910

1011
final class AllColumns extends BaseNode implements SelectExpr
1112
{
1213
public function __construct(
1314
Position $startPosition,
1415
Position $endPosition,
15-
public readonly ?string $tableName = null,
16+
public readonly ?TableName $tableName = null,
1617
) {
1718
parent::__construct($startPosition, $endPosition);
1819
}

src/PHPStan/Helper/PHPStanReturnTypeHelper.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ private function findColumnTypeOverride(?ColumnInfo $column): ?Type
385385
);
386386
}
387387

388-
$conflictingType = $this->columnTypeOverrides[$expr->tableName][$expr->name] ?? null;
388+
$conflictingType = $this->columnTypeOverrides[$expr->tableName->name][$expr->name] ?? null;
389389

390390
if ($conflictingType !== null) {
391391
throw new InvalidArgumentException(
@@ -396,7 +396,7 @@ private function findColumnTypeOverride(?ColumnInfo $column): ?Type
396396

397397
// I add null, so that it can be intersected with nullable columns
398398
// (e.g. WHERE col IS NULL, LEFT JOIN, ...)
399-
$this->columnTypeOverrides[$expr->tableName][$expr->name] = TypeCombinator::addNull($type);
399+
$this->columnTypeOverrides[$expr->tableName->name][$expr->name] = TypeCombinator::addNull($type);
400400
}
401401
}
402402

0 commit comments

Comments
 (0)