Skip to content

Commit

Permalink
Merge pull request #2661 from OSGeo/backport-2660-to-8.0
Browse files Browse the repository at this point in the history
[Backport 8.0] getCRSInfoList(): make result order deterministic (by increasing auth_name, code)
  • Loading branch information
rouault authored Apr 11, 2021
2 parents 79a93bc + 0d96f25 commit a42b447
Showing 1 changed file with 16 additions and 13 deletions.
29 changes: 16 additions & 13 deletions src/iso19111/factory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5642,19 +5642,21 @@ AuthorityFactory::getDescriptionText(const std::string &code) const {
*/
std::list<AuthorityFactory::CRSInfo> 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 " +
Expand All @@ -5669,9 +5671,9 @@ std::list<AuthorityFactory::CRSInfo> 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 "
Expand All @@ -5685,8 +5687,8 @@ std::list<AuthorityFactory::CRSInfo> 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());
Expand All @@ -5695,12 +5697,13 @@ std::list<AuthorityFactory::CRSInfo> 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<AuthorityFactory::CRSInfo> res;
for (const auto &row : sqlRes) {
Expand Down

0 comments on commit a42b447

Please sign in to comment.