Skip to content

Commit

Permalink
Overcome "SQLSTATE[HY000]: General error: 1 too many SQL variables" e…
Browse files Browse the repository at this point in the history
…rror during merging
  • Loading branch information
aik099 committed Jul 31, 2024
1 parent 0c53b51 commit 2c17576
Show file tree
Hide file tree
Showing 10 changed files with 44 additions and 8 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ This project adheres to [Semantic Versioning](http://semver.org/).
- The cache delete/set commands were displayed as "cache hit"/"cache miss" operations during verbose output.
- When there was a cache miss, then explain why (absent, invalidated, expired) during verbose output.
- Queue SVN-Buddy new repository commit discovery, after a new commit in SVN-Buddy was made.
- The `log` and `merge` commands no longer fails with large (>999) revision lists on SQLite <= 3.32.0.

## [0.7.0] - 2024-04-12
### Added
Expand Down
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
"ext-zlib": "*",
"ext-json": "*",
"ext-pdo": "*",
"ext-sqlite3": "*",
"fiasco/symfony-console-style-markdown": "^1.2"
},
"require-dev": {
Expand Down
5 changes: 3 additions & 2 deletions composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

33 changes: 33 additions & 0 deletions src/SVNBuddy/Repository/RevisionLog/Plugin/AbstractPlugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,39 @@ private function _resetParsingStatistics()
}
}

/**
* Returns raw information about revisions.
*
* @param string $sql SQL.
* @param string $revisions_param_name Revisions param name.
* @param array $revisions Revisions.
* @param boolean $assoc Use first column as returned array key.
*
* @return array
*/
protected function getRawRevisionsData($sql, $revisions_param_name, array $revisions, $assoc = false)
{
// Several queries on a smaller revision set appear to be much faster, then one query for all revisions.
$revisions_data = array();

if ( $assoc ) {
foreach ( array_chunk($revisions, 500) as $revisions_chunk ) {
$revisions_data += $this->database->fetchAssoc($sql, array($revisions_param_name => $revisions_chunk));
}

return $revisions_data;
}

foreach ( array_chunk($revisions, 500) as $revisions_chunk ) {
$revisions_data = array_merge(
$revisions_data,
$this->database->fetchAll($sql, array($revisions_param_name => $revisions_chunk))
);
}

return $revisions_data;
}

/**
* Hook, that is called before "RevisionLog::refresh" method call.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -436,7 +436,7 @@ public function getRevisionsData(array $revisions)
$sql = 'SELECT Revision, Bug
FROM CommitBugs
WHERE Revision IN (:revisions)';
$revisions_data = $this->database->fetchAll($sql, array('revisions' => $revisions));
$revisions_data = $this->getRawRevisionsData($sql, 'revisions', $revisions);

foreach ( $revisions_data as $revision_data ) {
$revision = $revision_data['Revision'];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ public function getRevisionsData(array $revisions)
$sql = 'SELECT Revision, ProjectId
FROM CommitProjects
WHERE Revision IN (:revisions)';
$revisions_data = $this->database->fetchAll($sql, array('revisions' => $revisions));
$revisions_data = $this->getRawRevisionsData($sql, 'revisions', $revisions);

foreach ( $revisions_data as $revision_data ) {
$revision = $revision_data['Revision'];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ public function getRevisionsData(array $revisions)
FROM CommitRefs cr
JOIN ProjectRefs pr ON pr.Id = cr.RefId
WHERE cr.Revision IN (:revisions)';
$revisions_data = $this->database->fetchAll($sql, array('revisions' => $revisions));
$revisions_data = $this->getRawRevisionsData($sql, 'revisions', $revisions);

foreach ( $revisions_data as $revision_data ) {
$revision = $revision_data['Revision'];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ public function getRevisionsData(array $revisions)
$sql = 'SELECT MergeRevision, MergedRevision
FROM Merges
WHERE MergedRevision IN (:merged_revisions)';
$revisions_data = $this->database->fetchAll($sql, array('merged_revisions' => $revisions));
$revisions_data = $this->getRawRevisionsData($sql, 'merged_revisions', $revisions);

foreach ( $revisions_data as $revision_data ) {
$merge_revision = $revision_data['MergeRevision'];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -928,7 +928,7 @@ public function getRevisionsData(array $revisions)
JOIN Paths p1 ON p1.Id = cp.PathId
LEFT JOIN Paths p2 ON p2.Id = cp.CopyPathId
WHERE cp.Revision IN (:revision_ids)';
$revisions_data = $this->database->fetchAll($sql, array('revision_ids' => $revisions));
$revisions_data = $this->getRawRevisionsData($sql, 'revision_ids', $revisions);

foreach ( $revisions_data as $revision_data ) {
$revision = $revision_data['Revision'];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ public function getRevisionsData(array $revisions)
$sql = 'SELECT Revision, Author AS author, Date AS date, Message AS msg
FROM Commits
WHERE Revision IN (:revision_ids)';
$results = $this->database->fetchAssoc($sql, array('revision_ids' => $revisions));
$results = $this->getRawRevisionsData($sql, 'revision_ids', $revisions, true);

foreach ( array_keys($results) as $revision ) {
unset($results[$revision]['Revision']);
Expand Down

0 comments on commit 2c17576

Please sign in to comment.