|
20 | 20 | use PhpMyAdmin\Identifiers\DatabaseName; |
21 | 21 | use PhpMyAdmin\Message; |
22 | 22 | use PhpMyAdmin\ResponseRenderer; |
| 23 | +use PhpMyAdmin\SqlParser\Components\Limit; |
| 24 | +use PhpMyAdmin\SqlParser\Parser; |
| 25 | +use PhpMyAdmin\SqlParser\Statements\SelectStatement; |
23 | 26 | use PhpMyAdmin\Template; |
24 | 27 | use PhpMyAdmin\Url; |
25 | 28 | use PhpMyAdmin\UrlParams; |
@@ -80,18 +83,7 @@ public function __invoke(ServerRequest $request): Response |
80 | 83 | return $this->response->response(); |
81 | 84 | } |
82 | 85 |
|
83 | | - $meta = $this->getColumnMeta($sqlQuery); |
84 | | - |
85 | | - // Find the candidate fields for label column and spatial column |
86 | | - $labelCandidates = []; |
87 | | - $spatialCandidates = []; |
88 | | - foreach ($meta as $columnMeta) { |
89 | | - if ($columnMeta->isMappedTypeGeometry) { |
90 | | - $spatialCandidates[] = $columnMeta->name; |
91 | | - } else { |
92 | | - $labelCandidates[] = $columnMeta->name; |
93 | | - } |
94 | | - } |
| 86 | + [$labelCandidates, $spatialCandidates] = $this->getCandidateColumns($sqlQuery); |
95 | 87 |
|
96 | 88 | if ($spatialCandidates === []) { |
97 | 89 | $this->response->setRequestStatus(false); |
@@ -254,4 +246,28 @@ private function getColumnMeta(string $sqlQuery): array |
254 | 246 |
|
255 | 247 | return $result === false ? [] : $this->dbi->getFieldsMeta($result); |
256 | 248 | } |
| 249 | + |
| 250 | + /** @return array{list<string>, list<string>} */ |
| 251 | + private function getCandidateColumns(string $sqlQuery): array |
| 252 | + { |
| 253 | + $parser = new Parser($sqlQuery); |
| 254 | + /** @var SelectStatement $statement */ |
| 255 | + $statement = $parser->statements[0]; |
| 256 | + $statement->limit = new Limit(0, 0); |
| 257 | + $limitedSqlQuery = $statement->build(); |
| 258 | + |
| 259 | + $meta = $this->getColumnMeta($limitedSqlQuery); |
| 260 | + |
| 261 | + $labelCandidates = []; |
| 262 | + $spatialCandidates = []; |
| 263 | + foreach ($meta as $columnMeta) { |
| 264 | + if ($columnMeta->isMappedTypeGeometry) { |
| 265 | + $spatialCandidates[] = $columnMeta->name; |
| 266 | + } else { |
| 267 | + $labelCandidates[] = $columnMeta->name; |
| 268 | + } |
| 269 | + } |
| 270 | + |
| 271 | + return [$labelCandidates, $spatialCandidates]; |
| 272 | + } |
257 | 273 | } |
0 commit comments