Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix PollMapper for PostgreSQL usage #3394

Merged
merged 8 commits into from
Mar 29, 2024
Merged

fix PollMapper for PostgreSQL usage #3394

merged 8 commits into from
Mar 29, 2024

Conversation

dartcafe
Copy link
Collaborator

@dartcafe dartcafe commented Mar 28, 2024

fixes #3393
fixes #3396
fixes #3399

  • added testFind to unit tests
  • adding and maintaining grouping statements

Signed-off-by: dartcafe <github@dartcafe.de>
Signed-off-by: dartcafe <github@dartcafe.de>
@dartcafe dartcafe added this to the 7.0.1 milestone Mar 28, 2024
@dartcafe dartcafe added the bug label Mar 28, 2024
Signed-off-by: dartcafe <github@dartcafe.de>
@joergmschulz joergmschulz mentioned this pull request Mar 28, 2024
12 tasks
@joergmschulz
Copy link
Contributor

sorry, in Postgres we still have

[index] Fehler: An exception occurred while executing a query: SQLSTATE[42803]: Grouping error: 7 ERROR:  column "shares.type" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: ...."vote_answer") AS "current_user_votes", coalesce(shares.typ...
                                                             ^
	GET /apps/polls/polls?time=1711655716981
	...

and

[core] Fehler: Error while running background job (class: OCA\Polls\Cron\AutoReminderCron, arguments: )
	von ? von -- um 28.03.2024, 20:55:01

@dartcafe
Copy link
Collaborator Author

@joergmschulz Are you referring to the app store installed version or the changed version with this PR?

Signed-off-by: dartcafe <github@dartcafe.de>
Signed-off-by: dartcafe <github@dartcafe.de>
Signed-off-by: dartcafe <github@dartcafe.de>
Signed-off-by: dartcafe <github@dartcafe.de>
Signed-off-by: dartcafe <github@dartcafe.de>
@dartcafe
Copy link
Collaborator Author

OK. It turned out, that IQueryBuilder::addGroupBy() did not really add the grouping statement for the joined table, without prior IQueryBuilder::groupBy() statement.

The order matters.

@dartcafe dartcafe merged commit 3e76a8c into master Mar 29, 2024
15 checks passed
@delete-merged-branch delete-merged-branch bot deleted the fix/poll-mapper-pgsql branch March 29, 2024 09:42
@dartcafe dartcafe mentioned this pull request Mar 29, 2024
12 tasks
@joergmschulz
Copy link
Contributor

Cool, thank you for fixing. I can confirm polls work using postgres and nextcloud 28.0.4

@dartcafe
Copy link
Collaborator Author

Great, thank you for feedback.

@dartcafe dartcafe mentioned this pull request Apr 2, 2024
8 tasks
@pierreozoux
Copy link
Member

Hi!

we are hitting this issue on PG and version 6.3.0, would it be possible to backport this fix on 6.3 line, and publish 6.3.1?

Thanks for your help!

@unteem
Copy link

unteem commented May 13, 2024

this patch below seems to fix it. I can make a PR for v6 in the coming days

--- apps/polls/lib/Db/CommentMapper.php
+++ apps/polls/lib/Db/CommentMapper.php
@@ -110,17 +110,10 @@ class CommentMapper extends QBMapperWithUser {
 		$qb = $this->db->getQueryBuilder();
 
 		$qb->select(self::TABLE . '.*')
-			->from($this->getTableName(), self::TABLE);
-		$anonAlias = $this->joinAnon($qb, self::TABLE);
-
-		$qb->groupBy(
-			self::TABLE . '.id',
-			$anonAlias . '.anonymous',
-			$anonAlias . '.owner',
-			$anonAlias . '.show_results',
-			$anonAlias . '.expire',
-		);
-
+			->from($this->getTableName(), self::TABLE)
+			->groupBy(self::TABLE . '.id');
+		
+		$this->joinAnon($qb, self::TABLE);
 		return $qb;
 	}
 }
--- apps/polls/lib/Db/PollMapper.php
+++ apps/polls/lib/Db/PollMapper.php
@@ -174,13 +174,13 @@ class PollMapper extends QBMapper {
 		$qb = $this->db->getQueryBuilder();
 
 		$qb->select(self::TABLE . '.*')
-			// TODO: check if this is necessary, in case of empty table to avoid possibly nulled columns
-			// ->groupBy(self::TABLE . '.id')
-			->from($this->getTableName(), self::TABLE);
+			->from($this->getTableName(), self::TABLE)
+			->groupBy(self::TABLE . '.id');
+
+
 		$this->joinOptionsForMaxDate($qb, self::TABLE);
 		$this->joinCurrentUserVotes($qb, self::TABLE, $currentUserId);
 		$this->joinUserRole($qb, self::TABLE, $currentUserId);
-		$qb->groupBy(self::TABLE . '.id');
 		return $qb;
 	}
 
@@ -192,7 +192,13 @@ class PollMapper extends QBMapper {
 	 */
 	protected function joinUserRole(IQueryBuilder &$qb, string $fromAlias, string $currentUserId): void {
 		$joinAlias = 'shares';
-		$qb->addSelect($qb->createFunction('coalesce(' . $joinAlias . '.type, "") AS user_role'));
+		$emptyString = $qb->createNamedParameter("", IQueryBuilder::PARAM_STR);
+
+		$qb->addSelect($qb->createFunction('coalesce(' . $joinAlias . '.type, '. $emptyString . ') AS user_role'))
+			->addGroupBy($joinAlias . '.type');
+
+		$qb->selectAlias($joinAlias . '.locked', 'is_current_user_locked')
+			->addGroupBy($joinAlias . '.locked');
 
 		$qb->leftJoin(
 			$fromAlias,
@@ -201,8 +207,10 @@ class PollMapper extends QBMapper {
 			$qb->expr()->andX(
 				$qb->expr()->eq($fromAlias . '.id', $joinAlias . '.poll_id'),
 				$qb->expr()->eq($joinAlias . '.user_id', $qb->createNamedParameter($currentUserId, IQueryBuilder::PARAM_STR)),
+				$qb->expr()->eq($joinAlias . '.deleted', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT)),
 			)
 		);
+
 	}
 
 	/**
@@ -213,9 +221,11 @@ class PollMapper extends QBMapper {
 	 */
 	protected function joinOptionsForMaxDate(IQueryBuilder &$qb, string $fromAlias): void {
 		$joinAlias = 'options';
-		$saveMin = (string) time();
 
-		$qb->addSelect($qb->createFunction('coalesce(MAX(' . $joinAlias . '.timestamp), 0) AS max_date'))
+		$zero = $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT);
+		$saveMin = $qb->createNamedParameter(time(), IQueryBuilder::PARAM_INT);
+
+		$qb->addSelect($qb->createFunction('coalesce(MAX(' . $joinAlias . '.timestamp), '. $zero  . ') AS max_date'))
 			->addSelect($qb->createFunction('coalesce(MIN(' . $joinAlias . '.timestamp), ' . $saveMin . ') AS min_date'));
 
 		$qb->leftJoin(
@@ -232,7 +242,7 @@ class PollMapper extends QBMapper {
 	 * the min value is the current time,
 	 * the max value is null
 	 */
-	protected function joinCurrentUserVotes(IQueryBuilder &$qb, string $fromAlias, $currentUserId): void {
+	protected function joinCurrentUserVotes(IQueryBuilder &$qb, string $fromAlias, string $currentUserId): void {
 		$joinAlias = 'user_vote';
 		// force value into a MIN function to avoid grouping errors
 		$qb->selectAlias($qb->func()->count($joinAlias . '.vote_answer'), 'current_user_votes');

--- apps/polls/lib/Db/Preferences.php
+++ apps/polls/lib/Db/Preferences.php
@@ -69,7 +69,7 @@ class Preferences extends Entity implements JsonSerializable {
 	}
 
 	public function getPreferences_decoded(): mixed {
-		return json_decode((string) $this->getPreferences());
+		return json_decode($this->getPreferences() ?? '');
 	}
 
 	/**

--- apps/polls/lib/Db/QBMapperWithUser.php
+++ apps/polls/lib/Db/QBMapperWithUser.php
@@ -50,14 +50,19 @@ abstract class QBMapperWithUser extends QBMapper {
 	/**
 	 * Joins anonymous setting of poll
 	 */
-	protected function joinAnon(IQueryBuilder &$qb, string $fromAlias): string {
+	protected function joinAnon(IQueryBuilder &$qb, string $fromAlias): void {
 		$joinAlias = 'anon';
 
 		$qb->selectAlias($joinAlias . '.anonymous', 'anonymized')
 			->selectAlias($joinAlias . '.owner', 'poll_owner_id')
 			->selectAlias($joinAlias . '.show_results', 'poll_show_results')
 			->selectAlias($joinAlias . '.expire', 'poll_expire')
-		;
+			->addGroupBy(
+				$joinAlias . '.anonymous',
+				$joinAlias . '.owner',
+				$joinAlias . '.show_results',
+				$joinAlias . '.expire',
+			);
 
 		$qb->leftJoin(
 			$fromAlias,
@@ -65,6 +70,6 @@ abstract class QBMapperWithUser extends QBMapper {
 			$joinAlias,
 			$qb->expr()->eq($joinAlias . '.id', $fromAlias . '.poll_id'),
 		);
-		return $joinAlias;
+
 	}
 }

--- apps/polls/lib/Db/ShareMapper.php
+++ apps/polls/lib/Db/ShareMapper.php
@@ -60,7 +60,7 @@ class ShareMapper extends QBMapper {
 		$qb = $this->db->getQueryBuilder();
 
 		$qb->select(self::TABLE . '.*')
-		->from($this->getTableName(), self::TABLE)
+		    ->from($this->getTableName(), self::TABLE)
 			->groupBy(self::TABLE . '.id')
 			->where($qb->expr()->eq(self::TABLE . '.poll_id', $qb->createNamedParameter($pollId, IQueryBuilder::PARAM_INT)));
 
@@ -120,7 +120,8 @@ class ShareMapper extends QBMapper {
 		$qb = $this->db->getQueryBuilder();
 
 		$qb->select(self::TABLE . '.*')
-		->from($this->getTableName(), self::TABLE)
+			->from($this->getTableName(), self::TABLE)
+			->groupBy(self::TABLE . '.id')
 			->where($qb->expr()->eq(self::TABLE . '.poll_id', $qb->createNamedParameter($pollId, IQueryBuilder::PARAM_INT)))
 			->andWhere($qb->expr()->eq(self::TABLE . '.user_id', $qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR)))
 			->andWhere($qb->expr()->isNotNull(self::TABLE . '.id'));
@@ -160,7 +161,8 @@ class ShareMapper extends QBMapper {
 		$qb = $this->db->getQueryBuilder();
 
 		$qb->select(self::TABLE . '.*')
-		->from($this->getTableName(), self::TABLE)
+			->from($this->getTableName(), self::TABLE)
+			->groupBy(self::TABLE . '.id')
 			->where($qb->expr()->eq(self::TABLE . '.token', $qb->createNamedParameter($token, IQueryBuilder::PARAM_STR)));
 
 		if (!$getDeleted) {
@@ -176,6 +178,7 @@ class ShareMapper extends QBMapper {
 		}
 	}
 
+
 	/**
 	 * @return void
 	 */
@@ -218,8 +221,6 @@ class ShareMapper extends QBMapper {
 				$qb->expr()->eq($fromAlias . '.user_id', $joinAlias . '.user_id'),
 			)
 		);
-		// avoid result with nulled columns
-		$qb->groupBy($fromAlias . '.id');
 	}
 
 }

--- apps/polls/lib/Db/VoteMapper.php
+++ apps/polls/lib/Db/VoteMapper.php
@@ -118,10 +118,10 @@ class VoteMapper extends QBMapperWithUser {
 
 		$qb->selectDistinct([self::TABLE . '.user_id', self::TABLE . '.poll_id'])
 			->from($this->getTableName(), self::TABLE)
+			->groupBy(self::TABLE . '.user_id', self::TABLE . '.poll_id')
 			->where(
 				$qb->expr()->eq(self::TABLE . '.poll_id', $qb->createNamedParameter($pollId, IQueryBuilder::PARAM_INT))
 			);
-		$qb->addGroupBy(self::TABLE . '.user_id', self::TABLE . '.poll_id');
 
 		return $this->findEntities($qb);
 	}
@@ -211,28 +211,20 @@ class VoteMapper extends QBMapperWithUser {
 
 	protected function buildQuery(bool $findOrphaned = false): IQueryBuilder {
 		$qb = $this->db->getQueryBuilder();
-
+		
 		$qb->select(self::TABLE . '.*')
-			->from($this->getTableName(), self::TABLE);
+			->from($this->getTableName(), self::TABLE)
+			->groupBy(self::TABLE . '.id');
 
 		$optionAlias = $this->joinOption($qb, self::TABLE);
 		
-		
 		if ($findOrphaned) {
 			$qb->where($qb->expr()->isNull($optionAlias . '.id'));
 		} else {
 			$qb->where($qb->expr()->isNotNull($optionAlias . '.id'));
 		}
-		$anonAlias = $this->joinAnon($qb, self::TABLE);
+		$this->joinAnon($qb, self::TABLE);
 
-		$qb->groupBy(
-			self::TABLE . '.id',
-			$optionAlias . '.id',
-			$anonAlias . '.anonymous',
-			$anonAlias . '.owner',
-			$anonAlias . '.show_results',
-			$anonAlias . '.expire',
-		);
 		
 		return $qb;
 	}
@@ -244,7 +236,8 @@ class VoteMapper extends QBMapperWithUser {
 	protected function joinOption(IQueryBuilder &$qb, string $fromAlias): string {
 		$joinAlias = 'options';
 		
-		$qb->selectAlias($joinAlias . '.id', 'option_id');
+		$qb->selectAlias($joinAlias . '.id', 'option_id')
+			->addGroupBy($joinAlias . '.id');
 
 		$qb->leftJoin(
 			$fromAlias,

--- apps/polls/lib/Db/OptionMapper.php
+++ apps/polls/lib/Db/OptionMapper.php
@@ -176,21 +176,15 @@ class OptionMapper extends QBMapperWithUser {
 
 		$qb->select(self::TABLE . '.*')
 			->from($this->getTableName(), self::TABLE)
+			->groupBy(self::TABLE . '.id')
 			->orderBy('order', 'ASC');
 
+
 		$this->joinVotesCount($qb, self::TABLE, $hideVotes);
 		$this->joinPollForLimits($qb, self::TABLE);
 		$this->joinCurrentUserVote($qb, self::TABLE, $currentUserId);
 		$this->joinCurrentUserVoteCount($qb, self::TABLE, $currentUserId);
-		$anonAlias = $this->joinAnon($qb, self::TABLE);
-
-		$qb->groupBy(
-			self::TABLE . '.id',
-			$anonAlias . '.anonymous',
-			$anonAlias . '.owner',
-			$anonAlias . '.show_results',
-			$anonAlias . '.expire',
-		);
+		$this->joinAnon($qb, self::TABLE);
 
 		return $qb;
 	}


@voidus
Copy link

voidus commented May 22, 2024

Could this be backported to the 6.x branch?

@dartcafe
Copy link
Collaborator Author

dartcafe commented May 27, 2024

@voidus You will find a 6.4.0-beta1 in the releases. Would be good if you were able to check, if this solves your problem.

@pierreozoux as well...

@voidus
Copy link

voidus commented May 28, 2024

@dartcafe I asked the person who maintains our nextcloud and they said that we probably won't be able to do it. Not 100%, but don't count on feedback from us =/

@dartcafe
Copy link
Collaborator Author

@voidus Nevermind. I tested against mySQL and things seem to work. Which Nextcloud version are you using?

I will cook a release this evening.

@voidus
Copy link

voidus commented May 29, 2024 via email

@hartsberger
Copy link

@dartcafe, for us it does not solve the problem.
We are running on 27.1.9 and 26.0.13

I have applied the patch mentioned here manually as a workaround.
It is only working with the patch, not with the new app update 6.4.

For details see my issue: #3508

@dartcafe
Copy link
Collaborator Author

Thanks for the info, but If you would have any loglines representing the issue, I can see what I missed.

@hartsberger
Copy link

Every time I open the polls app, this line is generated in the nextcloud.log file:

[index] Fehler: OC\DB\Exceptions\DbalException: An exception occurred while executing a query: SQLSTATE[42601]: Syntax error: 7 ERROR:  zero-length delimited identifier at or near """"
LINE 1: ...), 1716989883) AS min_date, coalesce(shares.type, "") AS use...
                                                             ^ at <<closure>>

 0. /var/www/nextcloud/lib/private/DB/QueryBuilder/QueryBuilder.php line 295
    OC\DB\Exceptions\DbalException::wrap()
 1. /var/www/nextcloud/lib/public/AppFramework/Db/QBMapper.php line 335
    OC\DB\QueryBuilder\QueryBuilder->executeQuery()
 2. /var/www/nextcloud/apps/polls/lib/Db/PollMapper.php line 84
    OCP\AppFramework\Db\QBMapper->findEntities()
 3. /var/www/nextcloud/apps/polls/lib/Service/PollService.php line 80
    OCA\Polls\Db\PollMapper->findForMe()
 4. /var/www/nextcloud/apps/polls/lib/Controller/PollController.php line 61
    OCA\Polls\Service\PollService->list()
 5. /var/www/nextcloud/apps/polls/lib/Controller/BaseController.php line 55
    OCA\Polls\Controller\PollController->OCA\Polls\Controller\{closure}("*** sensitive parameters replaced ***")
 6. /var/www/nextcloud/apps/polls/lib/Controller/PollController.php line 65
    OCA\Polls\Controller\BaseController->response()
 7. /var/www/nextcloud/lib/private/AppFramework/Http/Dispatcher.php line 230
    OCA\Polls\Controller\PollController->list()
 8. /var/www/nextcloud/lib/private/AppFramework/Http/Dispatcher.php line 137
    OC\AppFramework\Http\Dispatcher->executeController()
 9. /var/www/nextcloud/lib/private/AppFramework/App.php line 183
    OC\AppFramework\Http\Dispatcher->dispatch()
10. /var/www/nextcloud/lib/private/Route/Router.php line 315
    OC\AppFramework\App::main()
11. /var/www/nextcloud/lib/base.php line 1068
    OC\Route\Router->match()
12. /var/www/nextcloud/index.php line 38
    OC::handleRequest()

Caused by:

Doctrine\DBAL\Exception\SyntaxErrorException: An exception occurred while executing a query: SQLSTATE[42601]: Syntax error: 7 ERROR:  zero-length delimited identifier at or near """"
LINE 1: ...), 1716989883) AS min_date, coalesce(shares.type, "") AS use...
                                                             ^ at <<closure>>

 0. /var/www/nextcloud/3rdparty/doctrine/dbal/src/Connection.php line 1814
    Doctrine\DBAL\Driver\API\PostgreSQL\ExceptionConverter->convert()
 1. /var/www/nextcloud/3rdparty/doctrine/dbal/src/Connection.php line 1749
    Doctrine\DBAL\Connection->handleDriverException()
 2. /var/www/nextcloud/3rdparty/doctrine/dbal/src/Connection.php line 1055
    Doctrine\DBAL\Connection->convertExceptionDuringQuery()
 3. /var/www/nextcloud/lib/private/DB/Connection.php line 262
    Doctrine\DBAL\Connection->executeQuery()
 4. /var/www/nextcloud/3rdparty/doctrine/dbal/src/Query/QueryBuilder.php line 345
    OC\DB\Connection->executeQuery()
 5. /var/www/nextcloud/lib/private/DB/QueryBuilder/QueryBuilder.php line 280
    Doctrine\DBAL\Query\QueryBuilder->execute()
 6. /var/www/nextcloud/lib/private/DB/QueryBuilder/QueryBuilder.php line 293
    OC\DB\QueryBuilder\QueryBuilder->execute()
 7. /var/www/nextcloud/lib/public/AppFramework/Db/QBMapper.php line 335
    OC\DB\QueryBuilder\QueryBuilder->executeQuery()
 8. /var/www/nextcloud/apps/polls/lib/Db/PollMapper.php line 84
    OCP\AppFramework\Db\QBMapper->findEntities()
 9. /var/www/nextcloud/apps/polls/lib/Service/PollService.php line 80
    OCA\Polls\Db\PollMapper->findForMe()
10. /var/www/nextcloud/apps/polls/lib/Controller/PollController.php line 61
    OCA\Polls\Service\PollService->list()
11. /var/www/nextcloud/apps/polls/lib/Controller/BaseController.php line 55
    OCA\Polls\Controller\PollController->OCA\Polls\Controller\{closure}("*** sensitive parameters replaced ***")
12. /var/www/nextcloud/apps/polls/lib/Controller/PollController.php line 65
    OCA\Polls\Controller\BaseController->response()
13. /var/www/nextcloud/lib/private/AppFramework/Http/Dispatcher.php line 230
    OCA\Polls\Controller\PollController->list()
14. /var/www/nextcloud/lib/private/AppFramework/Http/Dispatcher.php line 137
    OC\AppFramework\Http\Dispatcher->executeController()
15. /var/www/nextcloud/lib/private/AppFramework/App.php line 183
    OC\AppFramework\Http\Dispatcher->dispatch()
16. /var/www/nextcloud/lib/private/Route/Router.php line 315
    OC\AppFramework\App::main()
17. /var/www/nextcloud/lib/base.php line 1068
    OC\Route\Router->match()
18. /var/www/nextcloud/index.php line 38
    OC::handleRequest()

Caused by:

Doctrine\DBAL\Driver\PDO\Exception: SQLSTATE[42601]: Syntax error: 7 ERROR:  zero-length delimited identifier at or near """"
LINE 1: ...), 1716989883) AS min_date, coalesce(shares.type, "") AS use...
                                                             ^ at <<closure>>

 0. /var/www/nextcloud/3rdparty/doctrine/dbal/src/Driver/PDO/Statement.php line 103
    Doctrine\DBAL\Driver\PDO\Exception::new()
 1. /var/www/nextcloud/3rdparty/doctrine/dbal/src/Connection.php line 1045
    Doctrine\DBAL\Driver\PDO\Statement->execute()
 2. /var/www/nextcloud/lib/private/DB/Connection.php line 262
    Doctrine\DBAL\Connection->executeQuery()
 3. /var/www/nextcloud/3rdparty/doctrine/dbal/src/Query/QueryBuilder.php line 345
    OC\DB\Connection->executeQuery()
 4. /var/www/nextcloud/lib/private/DB/QueryBuilder/QueryBuilder.php line 280
    Doctrine\DBAL\Query\QueryBuilder->execute()
 5. /var/www/nextcloud/lib/private/DB/QueryBuilder/QueryBuilder.php line 293
    OC\DB\QueryBuilder\QueryBuilder->execute()
 6. /var/www/nextcloud/lib/public/AppFramework/Db/QBMapper.php line 335
    OC\DB\QueryBuilder\QueryBuilder->executeQuery()
 7. /var/www/nextcloud/apps/polls/lib/Db/PollMapper.php line 84
    OCP\AppFramework\Db\QBMapper->findEntities()
 8. /var/www/nextcloud/apps/polls/lib/Service/PollService.php line 80
    OCA\Polls\Db\PollMapper->findForMe()
 9. /var/www/nextcloud/apps/polls/lib/Controller/PollController.php line 61
    OCA\Polls\Service\PollService->list()
10. /var/www/nextcloud/apps/polls/lib/Controller/BaseController.php line 55
    OCA\Polls\Controller\PollController->OCA\Polls\Controller\{closure}("*** sensitive parameters replaced ***")
11. /var/www/nextcloud/apps/polls/lib/Controller/PollController.php line 65
    OCA\Polls\Controller\BaseController->response()
12. /var/www/nextcloud/lib/private/AppFramework/Http/Dispatcher.php line 230
    OCA\Polls\Controller\PollController->list()
13. /var/www/nextcloud/lib/private/AppFramework/Http/Dispatcher.php line 137
    OC\AppFramework\Http\Dispatcher->executeController()
14. /var/www/nextcloud/lib/private/AppFramework/App.php line 183
    OC\AppFramework\Http\Dispatcher->dispatch()
15. /var/www/nextcloud/lib/private/Route/Router.php line 315
    OC\AppFramework\App::main()
16. /var/www/nextcloud/lib/base.php line 1068
    OC\Route\Router->match()
17. /var/www/nextcloud/index.php line 38
    OC::handleRequest()

Caused by:

PDOException: SQLSTATE[42601]: Syntax error: 7 ERROR:  zero-length delimited identifier at or near """"
LINE 1: ...), 1716989883) AS min_date, coalesce(shares.type, "") AS use...
                                                             ^ at <<closure>>

 0. /var/www/nextcloud/3rdparty/doctrine/dbal/src/Driver/PDO/Statement.php line 101
    PDOStatement->execute()
 1. /var/www/nextcloud/3rdparty/doctrine/dbal/src/Connection.php line 1045
    Doctrine\DBAL\Driver\PDO\Statement->execute()
 2. /var/www/nextcloud/lib/private/DB/Connection.php line 262
    Doctrine\DBAL\Connection->executeQuery()
 3. /var/www/nextcloud/3rdparty/doctrine/dbal/src/Query/QueryBuilder.php line 345
    OC\DB\Connection->executeQuery()
 4. /var/www/nextcloud/lib/private/DB/QueryBuilder/QueryBuilder.php line 280
    Doctrine\DBAL\Query\QueryBuilder->execute()
 5. /var/www/nextcloud/lib/private/DB/QueryBuilder/QueryBuilder.php line 293
    OC\DB\QueryBuilder\QueryBuilder->execute()
 6. /var/www/nextcloud/lib/public/AppFramework/Db/QBMapper.php line 335
    OC\DB\QueryBuilder\QueryBuilder->executeQuery()
 7. /var/www/nextcloud/apps/polls/lib/Db/PollMapper.php line 84
    OCP\AppFramework\Db\QBMapper->findEntities()
 8. /var/www/nextcloud/apps/polls/lib/Service/PollService.php line 80
    OCA\Polls\Db\PollMapper->findForMe()
 9. /var/www/nextcloud/apps/polls/lib/Controller/PollController.php line 61
    OCA\Polls\Service\PollService->list()
10. /var/www/nextcloud/apps/polls/lib/Controller/BaseController.php line 55
    OCA\Polls\Controller\PollController->OCA\Polls\Controller\{closure}("*** sensitive parameters replaced ***")
11. /var/www/nextcloud/apps/polls/lib/Controller/PollController.php line 65
    OCA\Polls\Controller\BaseController->response()
12. /var/www/nextcloud/lib/private/AppFramework/Http/Dispatcher.php line 230
    OCA\Polls\Controller\PollController->list()
13. /var/www/nextcloud/lib/private/AppFramework/Http/Dispatcher.php line 137
    OC\AppFramework\Http\Dispatcher->executeController()
14. /var/www/nextcloud/lib/private/AppFramework/App.php line 183
    OC\AppFramework\Http\Dispatcher->dispatch()
15. /var/www/nextcloud/lib/private/Route/Router.php line 315
    OC\AppFramework\App::main()
16. /var/www/nextcloud/lib/base.php line 1068
    OC\Route\Router->match()
17. /var/www/nextcloud/index.php line 38
    OC::handleRequest()

GET /apps/polls/polls?time=1716989883228
from 10.0.0.1 by A7B36162-XXX at 2024-05-29T15:38:03+02:00

dartcafe added a commit that referenced this pull request May 30, 2024
@dartcafe
Copy link
Collaborator Author

Thanks, that helped to find the bug.

See quick update --> here

@hartsberger
Copy link

hartsberger commented Jun 5, 2024

Hi @dartcafe,

On our 27.1.9 instance everything is working again. Thanks for the 6.4.1 update!

On our 26.0.13 instance I got the following error during the polls update to 6.4.1. But everything seems to work.
This error seems to be generated every 5 minutes with the cron schedule.

[core] Fehler: OC\DB\Exceptions\DbalException: An exception occurred while executing a query: SQLSTATE[42P01]: Undefined table: 7 ERROR:  missing FROM-clause entry for table "polls_share"
LINE 1: ...eminder_sent" = $2) AND ("deleted" = $3) GROUP BY "polls_sha...
                                                             ^ at <<closure>>

0. /var/www/nextcloud/lib/private/DB/QueryBuilder/QueryBuilder.php line 295
   OC\DB\Exceptions\DbalException::wrap()
1. /var/www/nextcloud/lib/public/AppFramework/Db/QBMapper.php line 336
   OC\DB\QueryBuilder\QueryBuilder->executeQuery()
2. /var/www/nextcloud/apps/polls/lib/Db/ShareMapper.php line 115
   OCP\AppFramework\Db\QBMapper->findEntities()
3. /var/www/nextcloud/apps/polls/lib/Service/MailService.php line 267
   OCA\Polls\Db\ShareMapper->findByPollUnreminded()
4. /var/www/nextcloud/apps/polls/lib/Service/MailService.php line 236
   OCA\Polls\Service\MailService->processSharesForAutoReminder()
5. /var/www/nextcloud/apps/polls/lib/Cron/AutoReminderCron.php line 49
   OCA\Polls\Service\MailService->sendAutoReminder()
6. /var/www/nextcloud/lib/public/BackgroundJob/Job.php line 78
   OCA\Polls\Cron\AutoReminderCron->run()
7. /var/www/nextcloud/lib/public/BackgroundJob/TimedJob.php line 103
   OCP\BackgroundJob\Job->start()
8. /var/www/nextcloud/lib/public/BackgroundJob/TimedJob.php line 93
   OCP\BackgroundJob\TimedJob->start()
9. /var/www/nextcloud/cron.php line 152
   OCP\BackgroundJob\TimedJob->execute()

Caused by:

Doctrine\DBAL\Exception\TableNotFoundException: An exception occurred while executing a query: SQLSTATE[42P01]: Undefined table: 7 ERROR:  missing FROM-clause entry for table "polls_share"
LINE 1: ...eminder_sent" = $2) AND ("deleted" = $3) GROUP BY "polls_sha...
                                                             ^ at <<closure>>

 0. /var/www/nextcloud/3rdparty/doctrine/dbal/src/Connection.php line 1814
    Doctrine\DBAL\Driver\API\PostgreSQL\ExceptionConverter->convert()
 1. /var/www/nextcloud/3rdparty/doctrine/dbal/src/Connection.php line 1749
    Doctrine\DBAL\Connection->handleDriverException()
 2. /var/www/nextcloud/3rdparty/doctrine/dbal/src/Connection.php line 1055
    Doctrine\DBAL\Connection->convertExceptionDuringQuery()
 3. /var/www/nextcloud/lib/private/DB/Connection.php line 262
    Doctrine\DBAL\Connection->executeQuery()
 4. /var/www/nextcloud/3rdparty/doctrine/dbal/src/Query/QueryBuilder.php line 345
    OC\DB\Connection->executeQuery()
 5. /var/www/nextcloud/lib/private/DB/QueryBuilder/QueryBuilder.php line 280
    Doctrine\DBAL\Query\QueryBuilder->execute()
 6. /var/www/nextcloud/lib/private/DB/QueryBuilder/QueryBuilder.php line 293
    OC\DB\QueryBuilder\QueryBuilder->execute()
 7. /var/www/nextcloud/lib/public/AppFramework/Db/QBMapper.php line 336
    OC\DB\QueryBuilder\QueryBuilder->executeQuery()
 8. /var/www/nextcloud/apps/polls/lib/Db/ShareMapper.php line 115
    OCP\AppFramework\Db\QBMapper->findEntities()
 9. /var/www/nextcloud/apps/polls/lib/Service/MailService.php line 267
    OCA\Polls\Db\ShareMapper->findByPollUnreminded()
10. /var/www/nextcloud/apps/polls/lib/Service/MailService.php line 236
    OCA\Polls\Service\MailService->processSharesForAutoReminder()
11. /var/www/nextcloud/apps/polls/lib/Cron/AutoReminderCron.php line 49
    OCA\Polls\Service\MailService->sendAutoReminder()
12. /var/www/nextcloud/lib/public/BackgroundJob/Job.php line 78
    OCA\Polls\Cron\AutoReminderCron->run()
13. /var/www/nextcloud/lib/public/BackgroundJob/TimedJob.php line 103
    OCP\BackgroundJob\Job->start()
14. /var/www/nextcloud/lib/public/BackgroundJob/TimedJob.php line 93
    OCP\BackgroundJob\TimedJob->start()
15. /var/www/nextcloud/cron.php line 152
    OCP\BackgroundJob\TimedJob->execute()

Caused by:

Doctrine\DBAL\Driver\PDO\Exception: SQLSTATE[42P01]: Undefined table: 7 ERROR:  missing FROM-clause entry for table "polls_share"
LINE 1: ...eminder_sent" = $2) AND ("deleted" = $3) GROUP BY "polls_sha...
                                                             ^ at <<closure>>

 0. /var/www/nextcloud/3rdparty/doctrine/dbal/src/Driver/PDO/Statement.php line 103
    Doctrine\DBAL\Driver\PDO\Exception::new()
 1. /var/www/nextcloud/3rdparty/doctrine/dbal/src/Connection.php line 1045
    Doctrine\DBAL\Driver\PDO\Statement->execute()
 2. /var/www/nextcloud/lib/private/DB/Connection.php line 262
    Doctrine\DBAL\Connection->executeQuery()
 3. /var/www/nextcloud/3rdparty/doctrine/dbal/src/Query/QueryBuilder.php line 345
    OC\DB\Connection->executeQuery()
 4. /var/www/nextcloud/lib/private/DB/QueryBuilder/QueryBuilder.php line 280
    Doctrine\DBAL\Query\QueryBuilder->execute()
 5. /var/www/nextcloud/lib/private/DB/QueryBuilder/QueryBuilder.php line 293
    OC\DB\QueryBuilder\QueryBuilder->execute()
 6. /var/www/nextcloud/lib/public/AppFramework/Db/QBMapper.php line 336
    OC\DB\QueryBuilder\QueryBuilder->executeQuery()
 7. /var/www/nextcloud/apps/polls/lib/Db/ShareMapper.php line 115
    OCP\AppFramework\Db\QBMapper->findEntities()
 8. /var/www/nextcloud/apps/polls/lib/Service/MailService.php line 267
    OCA\Polls\Db\ShareMapper->findByPollUnreminded()
 9. /var/www/nextcloud/apps/polls/lib/Service/MailService.php line 236
    OCA\Polls\Service\MailService->processSharesForAutoReminder()
10. /var/www/nextcloud/apps/polls/lib/Cron/AutoReminderCron.php line 49
    OCA\Polls\Service\MailService->sendAutoReminder()
11. /var/www/nextcloud/lib/public/BackgroundJob/Job.php line 78
    OCA\Polls\Cron\AutoReminderCron->run()
12. /var/www/nextcloud/lib/public/BackgroundJob/TimedJob.php line 103
    OCP\BackgroundJob\Job->start()
13. /var/www/nextcloud/lib/public/BackgroundJob/TimedJob.php line 93
    OCP\BackgroundJob\TimedJob->start()
14. /var/www/nextcloud/cron.php line 152
    OCP\BackgroundJob\TimedJob->execute()

Caused by:

PDOException: SQLSTATE[42P01]: Undefined table: 7 ERROR:  missing FROM-clause entry for table "polls_share"
LINE 1: ...eminder_sent" = $2) AND ("deleted" = $3) GROUP BY "polls_sha...
                                                             ^ at <<closure>>

 0. /var/www/nextcloud/3rdparty/doctrine/dbal/src/Driver/PDO/Statement.php line 101
    PDOStatement->execute()
 1. /var/www/nextcloud/3rdparty/doctrine/dbal/src/Connection.php line 1045
    Doctrine\DBAL\Driver\PDO\Statement->execute()
 2. /var/www/nextcloud/lib/private/DB/Connection.php line 262
    Doctrine\DBAL\Connection->executeQuery()
 3. /var/www/nextcloud/3rdparty/doctrine/dbal/src/Query/QueryBuilder.php line 345
    OC\DB\Connection->executeQuery()
 4. /var/www/nextcloud/lib/private/DB/QueryBuilder/QueryBuilder.php line 280
    Doctrine\DBAL\Query\QueryBuilder->execute()
 5. /var/www/nextcloud/lib/private/DB/QueryBuilder/QueryBuilder.php line 293
    OC\DB\QueryBuilder\QueryBuilder->execute()
 6. /var/www/nextcloud/lib/public/AppFramework/Db/QBMapper.php line 336
    OC\DB\QueryBuilder\QueryBuilder->executeQuery()
 7. /var/www/nextcloud/apps/polls/lib/Db/ShareMapper.php line 115
    OCP\AppFramework\Db\QBMapper->findEntities()
 8. /var/www/nextcloud/apps/polls/lib/Service/MailService.php line 267
    OCA\Polls\Db\ShareMapper->findByPollUnreminded()
 9. /var/www/nextcloud/apps/polls/lib/Service/MailService.php line 236
    OCA\Polls\Service\MailService->processSharesForAutoReminder()
10. /var/www/nextcloud/apps/polls/lib/Cron/AutoReminderCron.php line 49
    OCA\Polls\Service\MailService->sendAutoReminder()
11. /var/www/nextcloud/lib/public/BackgroundJob/Job.php line 78
    OCA\Polls\Cron\AutoReminderCron->run()
12. /var/www/nextcloud/lib/public/BackgroundJob/TimedJob.php line 103
    OCP\BackgroundJob\Job->start()
13. /var/www/nextcloud/lib/public/BackgroundJob/TimedJob.php line 93
    OCP\BackgroundJob\TimedJob->start()
14. /var/www/nextcloud/cron.php line 152
    OCP\BackgroundJob\TimedJob->execute()

at 2024-06-05T07:05:06+02:00

@dartcafe
Copy link
Collaborator Author

dartcafe commented Jun 7, 2024

This was the Autoreminder. See #3545 and https://github.com/nextcloud/polls/releases/tag/v6.4.2

@nextcloud nextcloud locked as resolved and limited conversation to collaborators Jun 7, 2024
@dartcafe
Copy link
Collaborator Author

dartcafe commented Jun 7, 2024

Locked this, since it may get out of my attention (it's a closed PR).
Feel free to open new issues in case of errors and link to this PR, if any relationship is assumed.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

log error after AiO update v8 Dbal Exception Polls do not load after upgrade to 7.0.0
6 participants