summaryrefslogtreecommitdiff
path: root/connectivity
diff options
context:
space:
mode:
authorLionel Elie Mamane <lionel@mamane.lu>2016-03-04 12:38:47 +0100
committerMichael Stahl <mstahl@redhat.com>2016-03-07 12:44:26 +0000
commit43bca025961c4d78082e18efb95f9212b27f964b (patch)
treeb924c516deb5925eb6cb11c79832fca45eac03c0 /connectivity
parentf80bc900eecf2268587e7b7ced5f392a6b1c1c62 (diff)
tdf#92538 pgsql-sdbc make a reasonable sorting of types
Change-Id: I74283234834b5057857620ed2466068e88628585 Reviewed-on: https://gerrit.libreoffice.org/22896 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Michael Stahl <mstahl@redhat.com>
Diffstat (limited to 'connectivity')
-rw-r--r--connectivity/source/drivers/postgresql/pq_databasemetadata.cxx79
1 files changed, 76 insertions, 3 deletions
diff --git a/connectivity/source/drivers/postgresql/pq_databasemetadata.cxx b/connectivity/source/drivers/postgresql/pq_databasemetadata.cxx
index 2b349db6c100..fcd4847f75ac 100644
--- a/connectivity/source/drivers/postgresql/pq_databasemetadata.cxx
+++ b/connectivity/source/drivers/postgresql/pq_databasemetadata.cxx
@@ -2143,11 +2143,84 @@ struct TypeInfoByDataTypeSorter
OUString nameB;
a[0 /*TYPE_NAME*/] >>= nameA;
b[0 /*TYPE_NAME*/] >>= nameB;
- if( nameA.startsWith( "int4" ) )
+ OUString nsA, tnA, nsB, tnB;
+
+ // parse typename into schema and typename
+ sal_Int32 nIndex=0;
+ nsA = nameA.getToken(0, '.', nIndex);
+ if (nIndex<0)
+ {
+ tnA = nsA;
+ nsA.clear();
+ }
+ else
+ {
+ tnA = nameA.getToken(0, '.', nIndex);
+ assert(nIndex < 0);
+ }
+
+ nIndex=0;
+ nsB = nameB.getToken(0, '.', nIndex);
+ if (nIndex<0)
+ {
+ tnB = nsB;
+ nsB.clear();
+ }
+ else
+ {
+ tnB = nameB.getToken(0, '.', nIndex);
+ assert(nIndex < 0);
+ }
+
+ // sort no schema first, then "public", then normal schemas, then internal schemas
+ if(nsA == nsB)
+ {
+ if(nsA.isEmpty())
+ {
+ assert(nsB.isEmpty());
+ // within each type category, sort privileged choice first
+ if( tnA == "int4" || tnA == "varchar" || tnA == "char" || tnA == "text")
+ return true;
+ if( tnB == "int4" || tnB == "varchar" || tnB == "char" || tnB == "text")
+ return false;
+ }
+ return nameA.compareTo( nameB ) < 0;
+ }
+ else if (nsA.isEmpty())
+ {
+ assert(!nsB.isEmpty());
return true;
- if( nameB.startsWith( "int4" ) )
+ }
+ else if (nsB.isEmpty())
+ {
+ assert(!nsA.isEmpty());
+ return false;
+ }
+ else if(nsA == "public")
+ {
+ assert(nsB != "public");
+ return true;
+ }
+ else if(nsB == "public")
+ {
+ assert(nsA != "public");
return false;
- return nameA.compareTo( nameB ) < 0;
+ }
+ else if(nsA.startsWith("pg_"))
+ {
+ if(nsB.startsWith("pg_"))
+ return nsA.compareTo(nsB) < 0;
+ else
+ return false;
+ }
+ else if(nsB.startsWith("pg_"))
+ {
+ return true;
+ }
+ else
+ {
+ return nsA.compareTo(nsB) < 0;
+ }
}
return valueA.toInt32() < valueB.toInt32();