aboutsummaryrefslogtreecommitdiff
blob: f41755adff9514085f0f533324fec0270eca5548 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
From 14b61d48e8bad6223a08843cf363ef48f09c479b Mon Sep 17 00:00:00 2001
From: Christian Ehrlicher <ch.ehrlicher@gmx.de>
Date: Fri, 11 Oct 2019 20:53:49 +0200
Subject: [PATCH] QPSQL: Add support for PostgreSQL 12

Add proper version check and replace long deprecated and now removed
access to pg_attrdef.adsrc.

[ChangeLog][QtSql][QPSQL] added support for PostgreSQL 12

Fixes: QTBUG-79033
Fixes: QTBUG-79064
Change-Id: Iec1b13945c34ea017139ad1c5539ab5b7f1e03aa
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
---
 src/plugins/sqldrivers/psql/qsql_psql.cpp | 43 +++++++++++++++++--------------
 src/plugins/sqldrivers/psql/qsql_psql_p.h |  1 +
 2 files changed, 25 insertions(+), 19 deletions(-)

diff --git a/src/plugins/sqldrivers/psql/qsql_psql.cpp b/src/plugins/sqldrivers/psql/qsql_psql.cpp
index 3803f05b9f9..760685f64b4 100644
--- a/src/plugins/sqldrivers/psql/qsql_psql.cpp
+++ b/src/plugins/sqldrivers/psql/qsql_psql.cpp
@@ -1078,8 +1078,10 @@ static QPSQLDriver::Protocol qMakePSQLVersion(int vMaj, int vMin)
         return QPSQLDriver::Version10;
     case 11:
         return QPSQLDriver::Version11;
+    case 12:
+        return QPSQLDriver::Version12;
     default:
-        if (vMaj > 11)
+        if (vMaj > 12)
             return QPSQLDriver::UnknownLaterVersion;
         break;
     }
@@ -1439,26 +1441,29 @@ QSqlRecord QPSQLDriver::record(const QString &tablename) const
     schema = stripDelimiters(schema, QSqlDriver::TableName);
     tbl = stripDelimiters(tbl, QSqlDriver::TableName);
 
-    QString stmt = QStringLiteral("SELECT pg_attribute.attname, pg_attribute.atttypid::int, "
-                                  "pg_attribute.attnotnull, pg_attribute.attlen, pg_attribute.atttypmod, "
-                                  "pg_attrdef.adsrc "
-                                  "FROM pg_class, pg_attribute "
-                                  "LEFT JOIN pg_attrdef ON (pg_attrdef.adrelid = "
-                                  "pg_attribute.attrelid AND pg_attrdef.adnum = pg_attribute.attnum) "
-                                  "WHERE %1 "
-                                  "AND pg_class.relname = '%2' "
-                                  "AND pg_attribute.attnum > 0 "
-                                  "AND pg_attribute.attrelid = pg_class.oid "
-                                  "AND pg_attribute.attisdropped = false "
-                                  "ORDER BY pg_attribute.attnum");
-    if (schema.isEmpty())
-        stmt = stmt.arg(QStringLiteral("pg_table_is_visible(pg_class.oid)"));
-    else
-        stmt = stmt.arg(QStringLiteral("pg_class.relnamespace = (SELECT oid FROM "
-                                            "pg_namespace WHERE pg_namespace.nspname = '%1')").arg(schema));
+    const QString adsrc = protocol() < Version8
+        ? QStringLiteral("pg_attrdef.adsrc")
+        : QStringLiteral("pg_get_expr(pg_attrdef.adbin, pg_attrdef.adrelid)");
+    const QString nspname = schema.isEmpty()
+        ? QStringLiteral("pg_table_is_visible(pg_class.oid)")
+        : QStringLiteral("pg_class.relnamespace = (SELECT oid FROM "
+                         "pg_namespace WHERE pg_namespace.nspname = '%1')").arg(schema);
+    const QString stmt =
+        QStringLiteral("SELECT pg_attribute.attname, pg_attribute.atttypid::int, "
+                       "pg_attribute.attnotnull, pg_attribute.attlen, pg_attribute.atttypmod, "
+                       "%1 "
+                       "FROM pg_class, pg_attribute "
+                       "LEFT JOIN pg_attrdef ON (pg_attrdef.adrelid = "
+                       "pg_attribute.attrelid AND pg_attrdef.adnum = pg_attribute.attnum) "
+                       "WHERE %2 "
+                       "AND pg_class.relname = '%3' "
+                       "AND pg_attribute.attnum > 0 "
+                       "AND pg_attribute.attrelid = pg_class.oid "
+                       "AND pg_attribute.attisdropped = false "
+                       "ORDER BY pg_attribute.attnum").arg(adsrc, nspname, tbl);
 
     QSqlQuery query(createResult());
-    query.exec(stmt.arg(tbl));
+    query.exec(stmt);
     while (query.next()) {
         int len = query.value(3).toInt();
         int precision = query.value(4).toInt();
diff --git a/src/plugins/sqldrivers/psql/qsql_psql_p.h b/src/plugins/sqldrivers/psql/qsql_psql_p.h
index 99e0b5f60f5..9ac1fb50d79 100644
--- a/src/plugins/sqldrivers/psql/qsql_psql_p.h
+++ b/src/plugins/sqldrivers/psql/qsql_psql_p.h
@@ -93,6 +93,7 @@ public:
         Version9_6 = 22,
         Version10 = 23,
         Version11 = 24,
+        Version12 = 25,
         UnknownLaterVersion = 100000
     };
 
-- 
2.16.3