Commit e992d62b authored by Ben Boeckel's avatar Ben Boeckel
Browse files

FindPostgreSQL: support version encoding used in pre-10 releases

With the 10.x release, PostgreSQL upstream started encoding the version
as `MMmmmm` where `M` is major and `m` is minor. Prior to that, `MMmmPP`
was used where `P` was the patch number. Detect this difference and
decode it based on the used encoding.

Fixes: #19912
parent c1d5d5eb
......@@ -208,11 +208,22 @@ if (PostgreSQL_INCLUDE_DIR)
endif()
endforeach()
if (_PostgreSQL_VERSION_NUM)
math(EXPR _PostgreSQL_major_version "${_PostgreSQL_VERSION_NUM} / 10000")
math(EXPR _PostgreSQL_minor_version "${_PostgreSQL_VERSION_NUM} % 10000")
set(PostgreSQL_VERSION_STRING "${_PostgreSQL_major_version}.${_PostgreSQL_minor_version}")
unset(_PostgreSQL_major_version)
unset(_PostgreSQL_minor_version)
# 9.x and older encoding
if (_PostgreSQL_VERSION_NUM LESS 100000)
math(EXPR _PostgreSQL_major_version "${_PostgreSQL_VERSION_NUM} / 10000")
math(EXPR _PostgreSQL_minor_version "${_PostgreSQL_VERSION_NUM} % 10000 / 100")
math(EXPR _PostgreSQL_patch_version "${_PostgreSQL_VERSION_NUM} % 100")
set(PostgreSQL_VERSION_STRING "${_PostgreSQL_major_version}.${_PostgreSQL_minor_version}.${_PostgreSQL_patch_version}")
unset(_PostgreSQL_major_version)
unset(_PostgreSQL_minor_version)
unset(_PostgreSQL_patch_version)
else ()
math(EXPR _PostgreSQL_major_version "${_PostgreSQL_VERSION_NUM} / 10000")
math(EXPR _PostgreSQL_minor_version "${_PostgreSQL_VERSION_NUM} % 10000")
set(PostgreSQL_VERSION_STRING "${_PostgreSQL_major_version}.${_PostgreSQL_minor_version}")
unset(_PostgreSQL_major_version)
unset(_PostgreSQL_minor_version)
endif ()
else ()
foreach(_PG_CONFIG_HEADER ${_PG_CONFIG_HEADERS})
if(EXISTS "${_PG_CONFIG_HEADER}")
......
......@@ -5,10 +5,19 @@
int main()
{
int version = PQlibVersion();
int major = version / 10000;
int minor = version % 10000;
char version_string[100];
snprintf(version_string, sizeof(version_string), "%d.%d", major, minor);
// 9.x and older encoding.
if (version < 100000) {
int major = version / 10000;
int minor = version % 10000 / 100;
int patch = version % 100;
snprintf(version_string, sizeof(version_string), "%d.%d.%d", major, minor,
patch);
} else {
int major = version / 10000;
int minor = version % 10000;
snprintf(version_string, sizeof(version_string), "%d.%d", major, minor);
}
printf("Found PostgreSQL version %s, expected version %s\n", version_string,
CMAKE_EXPECTED_POSTGRESQL_VERSION);
return strcmp(version_string, CMAKE_EXPECTED_POSTGRESQL_VERSION);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment