From 0d96f25f2e3bce6613048be621d9a8c8e6c6ae01 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Sun, 11 Apr 2021 01:03:55 +0200 Subject: [PATCH] Merge pull request #2660 from rouault/getCRSInfoList_deterministic_result_order getCRSInfoList(): make result order deterministic (by increasing auth_name, code) --- src/iso19111/factory.cpp | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/iso19111/factory.cpp b/src/iso19111/factory.cpp index f533000a42..3c93803ea0 100644 --- a/src/iso19111/factory.cpp +++ b/src/iso19111/factory.cpp @@ -5642,19 +5642,21 @@ AuthorityFactory::getDescriptionText(const std::string &code) const { */ std::list AuthorityFactory::getCRSInfoList() const { - const auto getSqlArea = [](const std::string &table_name) { - return "JOIN usage u ON " - "u.object_table_name = '" + - table_name + - "' AND " + const auto getSqlArea = [](const char* table_name) { + std::string sql( + "JOIN usage u ON u.object_table_name = '"); + sql += table_name; + sql += "' AND " "u.object_auth_name = c.auth_name AND " "u.object_code = c.code " "JOIN extent a " "ON a.auth_name = u.extent_auth_name AND " "a.code = u.extent_code "; + return sql; }; - std::string sql = "SELECT c.auth_name, c.code, c.name, c.type, " + std::string sql = "SELECT * FROM (" + "SELECT c.auth_name, c.code, c.name, c.type, " "c.deprecated, " "a.west_lon, a.south_lat, a.east_lon, a.north_lat, " "a.description, NULL FROM geodetic_crs c " + @@ -5669,9 +5671,9 @@ std::list AuthorityFactory::getCRSInfoList() const { "c.deprecated, " "a.west_lon, a.south_lat, a.east_lon, a.north_lat, " "a.description, cm.name AS conversion_method_name FROM " - "projected_crs c " + - getSqlArea("projected_crs") + - "LEFT JOIN conversion_table conv ON " + "projected_crs c "; + sql += getSqlArea("projected_crs"); + sql += "LEFT JOIN conversion_table conv ON " "c.conversion_auth_name = conv.auth_name AND " "c.conversion_code = conv.code " "LEFT JOIN conversion_method cm ON " @@ -5685,8 +5687,8 @@ std::list AuthorityFactory::getCRSInfoList() const { sql += "SELECT c.auth_name, c.code, c.name, 'vertical', " "c.deprecated, " "a.west_lon, a.south_lat, a.east_lon, a.north_lat, " - "a.description, NULL FROM vertical_crs c " + - getSqlArea("vertical_crs"); + "a.description, NULL FROM vertical_crs c "; + sql += getSqlArea("vertical_crs"); if (d->hasAuthorityRestriction()) { sql += " WHERE c.auth_name = ?"; params.emplace_back(d->authority()); @@ -5695,12 +5697,13 @@ std::list AuthorityFactory::getCRSInfoList() const { sql += "SELECT c.auth_name, c.code, c.name, 'compound', " "c.deprecated, " "a.west_lon, a.south_lat, a.east_lon, a.north_lat, " - "a.description, NULL FROM compound_crs c " + - getSqlArea("compound_crs"); + "a.description, NULL FROM compound_crs c "; + sql += getSqlArea("compound_crs"); if (d->hasAuthorityRestriction()) { sql += " WHERE c.auth_name = ?"; params.emplace_back(d->authority()); } + sql += ") r ORDER BY auth_name, code"; auto sqlRes = d->run(sql, params); std::list res; for (const auto &row : sqlRes) {