mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-18 03:23:37 +08:00
Adjust code to PG15 pg_database changes
PG15 changes the type of collate and ctype from name to text. https://github.com/postgres/postgres/commit/54637508
This commit is contained in:
parent
1ef515eb7a
commit
96202a99bd
@ -7,7 +7,6 @@
|
|||||||
|
|
||||||
#include <access/htup_details.h>
|
#include <access/htup_details.h>
|
||||||
#include <access/xact.h>
|
#include <access/xact.h>
|
||||||
//#include <catalog.h>
|
|
||||||
#include <catalog/namespace.h>
|
#include <catalog/namespace.h>
|
||||||
#include <catalog/pg_database.h>
|
#include <catalog/pg_database.h>
|
||||||
#include <catalog/pg_foreign_server.h>
|
#include <catalog/pg_foreign_server.h>
|
||||||
@ -30,6 +29,7 @@
|
|||||||
#include <utils/inval.h>
|
#include <utils/inval.h>
|
||||||
#include <utils/syscache.h>
|
#include <utils/syscache.h>
|
||||||
|
|
||||||
|
#include "compat/compat.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "extension.h"
|
#include "extension.h"
|
||||||
#include "fdw/fdw.h"
|
#include "fdw/fdw.h"
|
||||||
@ -57,8 +57,8 @@ typedef struct DbInfo
|
|||||||
{
|
{
|
||||||
NameData name;
|
NameData name;
|
||||||
int32 encoding;
|
int32 encoding;
|
||||||
NameData chartype;
|
const char *chartype;
|
||||||
NameData collation;
|
const char *collation;
|
||||||
} DbInfo;
|
} DbInfo;
|
||||||
|
|
||||||
/* A list of databases we try to connect to when bootstrapping a data node */
|
/* A list of databases we try to connect to when bootstrapping a data node */
|
||||||
@ -86,8 +86,27 @@ get_database_info(Oid dbid, DbInfo *database)
|
|||||||
dbrecord = (Form_pg_database) GETSTRUCT(dbtuple);
|
dbrecord = (Form_pg_database) GETSTRUCT(dbtuple);
|
||||||
|
|
||||||
database->encoding = dbrecord->encoding;
|
database->encoding = dbrecord->encoding;
|
||||||
database->collation = dbrecord->datcollate;
|
|
||||||
database->chartype = dbrecord->datctype;
|
#if PG15_LT
|
||||||
|
database->collation = NameStr(dbrecord->datcollate);
|
||||||
|
database->chartype = NameStr(dbrecord->datctype);
|
||||||
|
#else
|
||||||
|
/*
|
||||||
|
* Since datcollate and datctype are varlen fields in PG15+ we cannot rely
|
||||||
|
* on GETSTRUCT filling them in as GETSTRUCT only works for fixed-length
|
||||||
|
* non-NULLABLE columns.
|
||||||
|
*/
|
||||||
|
Datum datum;
|
||||||
|
bool isnull;
|
||||||
|
|
||||||
|
datum = SysCacheGetAttr(DATABASEOID, dbtuple, Anum_pg_database_datcollate, &isnull);
|
||||||
|
Assert(!isnull);
|
||||||
|
database->collation = TextDatumGetCString(datum);
|
||||||
|
|
||||||
|
datum = SysCacheGetAttr(DATABASEOID, dbtuple, Anum_pg_database_datctype, &isnull);
|
||||||
|
Assert(!isnull);
|
||||||
|
database->chartype = TextDatumGetCString(datum);
|
||||||
|
#endif
|
||||||
|
|
||||||
ReleaseSysCache(dbtuple);
|
ReleaseSysCache(dbtuple);
|
||||||
return true;
|
return true;
|
||||||
@ -354,8 +373,8 @@ data_node_bootstrap_database(TSConnection *conn, const DbInfo *database)
|
|||||||
"TEMPLATE template0 OWNER %s",
|
"TEMPLATE template0 OWNER %s",
|
||||||
quote_identifier(NameStr(database->name)),
|
quote_identifier(NameStr(database->name)),
|
||||||
quote_identifier(pg_encoding_to_char(database->encoding)),
|
quote_identifier(pg_encoding_to_char(database->encoding)),
|
||||||
quote_literal_cstr(NameStr(database->collation)),
|
quote_literal_cstr(database->collation),
|
||||||
quote_literal_cstr(NameStr(database->chartype)),
|
quote_literal_cstr(database->chartype),
|
||||||
quote_identifier(username));
|
quote_identifier(username));
|
||||||
if (PQresultStatus(res) != PGRES_COMMAND_OK)
|
if (PQresultStatus(res) != PGRES_COMMAND_OK)
|
||||||
remote_result_elog(res, ERROR);
|
remote_result_elog(res, ERROR);
|
||||||
@ -406,22 +425,22 @@ data_node_validate_database(TSConnection *conn, const DbInfo *database)
|
|||||||
|
|
||||||
actual_collation = PQgetvalue(res, 0, 1);
|
actual_collation = PQgetvalue(res, 0, 1);
|
||||||
Assert(actual_collation != NULL);
|
Assert(actual_collation != NULL);
|
||||||
if (strcmp(actual_collation, NameStr(database->collation)) != 0)
|
if (strcmp(actual_collation, database->collation) != 0)
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errcode(ERRCODE_TS_DATA_NODE_INVALID_CONFIG),
|
(errcode(ERRCODE_TS_DATA_NODE_INVALID_CONFIG),
|
||||||
errmsg("database exists but has wrong collation"),
|
errmsg("database exists but has wrong collation"),
|
||||||
errdetail("Expected collation \"%s\" but it was \"%s\".",
|
errdetail("Expected collation \"%s\" but it was \"%s\".",
|
||||||
NameStr(database->collation),
|
database->collation,
|
||||||
actual_collation)));
|
actual_collation)));
|
||||||
|
|
||||||
actual_chartype = PQgetvalue(res, 0, 2);
|
actual_chartype = PQgetvalue(res, 0, 2);
|
||||||
Assert(actual_chartype != NULL);
|
Assert(actual_chartype != NULL);
|
||||||
if (strcmp(actual_chartype, NameStr(database->chartype)) != 0)
|
if (strcmp(actual_chartype, database->chartype) != 0)
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errcode(ERRCODE_TS_DATA_NODE_INVALID_CONFIG),
|
(errcode(ERRCODE_TS_DATA_NODE_INVALID_CONFIG),
|
||||||
errmsg("database exists but has wrong LC_CTYPE"),
|
errmsg("database exists but has wrong LC_CTYPE"),
|
||||||
errdetail("Expected LC_CTYPE \"%s\" but it was \"%s\".",
|
errdetail("Expected LC_CTYPE \"%s\" but it was \"%s\".",
|
||||||
NameStr(database->chartype),
|
database->chartype,
|
||||||
actual_chartype)));
|
actual_chartype)));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user