docker-library / docker-library/postgres

Postgres in alpine has collation warning if database was created in another OS.

Open
#1,288 2 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Shell
Stars
2.5k
Forks
1.2k
PR merge metrics
No merged PRs in 30d

Description

Postgres shows warning WARNING: database "postgres" has no actual collation version, but a version was recorded if database was created in another OS.

Steps for reproduce:

  1. Execute postgres in debian image: docker run --rm -e POSTGRES_PASSWORD=password -e POSTGRES_DB=app -v $(pwd)/data:/var/lib/postgresql/data postgres:15.8-bookworm
  2. Stop this
  3. Execute postgres in alpine image: docker run --rm --name postgres -v $(pwd)/data:/var/lib/postgresql/data postgres:15.8-alpine3.20
  4. Run psql:
$ docker exec -ti --user postgres postgres psql
WARNING:  database "postgres" has no actual collation version, but a version was recorded
psql (15.8)
Type "help" for help.

postgres=# \c app
WARNING:  database "app" has no actual collation version, but a version was recorded
You are now connected to database "app" as user "postgres".
app=# 

Research:

I found that a warning occurs in the CheckMyDatabase function when comparing the collate version in the database and the current one in this row.

...
	if (!isnull)
	{
		char	   *actual_versionstr;
		char	   *collversionstr;

		collversionstr = TextDatumGetCString(datum);

		actual_versionstr = get_collation_actual_version(dbform->datlocprovider, dbform->datlocprovider == COLLPROVIDER_ICU ? iculocale : collate);
		if (!actual_versionstr)
			/* should not happen */
			elog(WARNING,
				 "database \"%s\" has no actual collation version, but a version was recorded",
				 name);
		else if (strcmp(actual_versionstr, collversionstr) != 0)
...

After calling get_collation_actual_version, the actual_version_str variable is NULL, because the get_collation_actual_version function after the preprocessor looks like:

char *
get_collation_actual_version(char collprovider, const char *collcollate)
{
	char	   *collversion = NULL;

		if (collprovider == COLLPROVIDER_LIBC &&
			pg_strcasecmp("C", collcollate) != 0 &&
			pg_strncasecmp("C.", collcollate, 2) != 0 &&
			pg_strcasecmp("POSIX", collcollate) != 0)
	{
	}

	return collversion;
}

And it always returns NULL

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Reproduce the warning with the supplied postgres:15.8-bookworm and postgres:15.8-alpine3.20 Docker commands. Read CheckMyDatabase in src/backend/utils/init/postinit.c and trace get_collation_actual_version, then establish why actual_versionstr is NULL and whether the cross-OS behavior is expected.

Written by the indexing model from the issue text.

Assessment

Tech stack
docker, postgres
Domain
databases, devops
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.