[prev in list] [next in list] [prev in thread] [next in thread]
List: postgresql-general
Subject: compiling PL/pgSQL plugin with C++
From: <Tarasov-G () gaz-is ! ru>
Date: 2019-05-30 15:14:01
Message-ID: b517ec3918d645eb950505eac8dd434e () gaz-is ! ru
[Download RAW message or body]
Dear all,
I'm working on development of some PL/pgSQL plugin.
The smaller part of my code is written on C.
It's a standard extension code for integration with fmgr (_PG_init ...)
But bigger part of the code is written on C++.
And here I need declarations of internal PL/pgSQL structs from plpgsql.h
Direct include of this file to my C++ code results in the following errors:
/opt/pgsql-11/include/server/plpgsql.h:1201:45: оши ка: expected <,> or <...> before <new>
extern void plpgsql_adddatum(PLpgSQL_datum *new);
^
/opt/pgsql-11/include/server/plpgsql.h:1228:15: оши ка: expected <,> or <...> before <typeid>
Oid *typeid, int32 *typmod, Oid *collation);
^
It's obviously that this code can't be compiled with C++ because the
C++ keywords are used as an identifiers. I modified plpgsql.h.
So, please advise does the renaming is the right step in this situation??
All my modifications are in the attached patch.
Corrections are made also in C-files (pl_comp.c and pl_exec.c), where the function definitions are
located, but this is not necessarily.
George
["rename-args-looks-like-cpp-keywords.patch" (application/octet-stream)]
diff --git a/src/pl/plpgsql/src/pl_comp.c b/src/pl/plpgsql/src/pl_comp.c
index 59460d2643..85721bf735 100644
--- a/src/pl/plpgsql/src/pl_comp.c
+++ b/src/pl/plpgsql/src/pl_comp.c
@@ -2203,7 +2203,7 @@ plpgsql_start_datums(void)
* ----------
*/
void
-plpgsql_adddatum(PLpgSQL_datum *new)
+plpgsql_adddatum(PLpgSQL_datum *dobj)
{
if (plpgsql_nDatums == datums_alloc)
{
@@ -2211,8 +2211,8 @@ plpgsql_adddatum(PLpgSQL_datum *new)
plpgsql_Datums = repalloc(plpgsql_Datums, sizeof(PLpgSQL_datum *) * datums_alloc);
}
- new->dno = plpgsql_nDatums;
- plpgsql_Datums[plpgsql_nDatums++] = new;
+ dobj->dno = plpgsql_nDatums;
+ plpgsql_Datums[plpgsql_nDatums++] = dobj;
}
/* ----------
diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c
index 8f8f7efe44..eff434658d 100644
--- a/src/pl/plpgsql/src/pl_exec.c
+++ b/src/pl/plpgsql/src/pl_exec.c
@@ -5556,7 +5556,7 @@ plpgsql_exec_get_datum_type(PLpgSQL_execstate *estate,
void
plpgsql_exec_get_datum_type_info(PLpgSQL_execstate *estate,
PLpgSQL_datum *datum,
- Oid *typeid, int32 *typmod, Oid *collation)
+ Oid *typoid, int32 *typmod, Oid *collation)
{
switch (datum->dtype)
{
@@ -5565,7 +5565,7 @@ plpgsql_exec_get_datum_type_info(PLpgSQL_execstate *estate,
{
PLpgSQL_var *var = (PLpgSQL_var *) datum;
- *typeid = var->datatype->typoid;
+ *typoid = var->datatype->typoid;
*typmod = var->datatype->atttypmod;
*collation = var->datatype->collation;
break;
@@ -5578,13 +5578,13 @@ plpgsql_exec_get_datum_type_info(PLpgSQL_execstate *estate,
if (rec->erh == NULL || rec->rectypeid != RECORDOID)
{
/* Report variable's declared type */
- *typeid = rec->rectypeid;
+ *typoid = rec->rectypeid;
*typmod = -1;
}
else
{
/* Report record's actual type if declared RECORD */
- *typeid = rec->erh->er_typeid;
+ *typoid = rec->erh->er_typeid;
/* do NOT return the mutable typmod of a RECORD variable */
*typmod = -1;
}
@@ -5624,7 +5624,7 @@ plpgsql_exec_get_datum_type_info(PLpgSQL_execstate *estate,
recfield->rectupledescid = rec->erh->er_tupdesc_id;
}
- *typeid = recfield->finfo.ftypeid;
+ *typoid = recfield->finfo.ftypeid;
*typmod = recfield->finfo.ftypmod;
*collation = recfield->finfo.fcollation;
break;
@@ -5632,7 +5632,7 @@ plpgsql_exec_get_datum_type_info(PLpgSQL_execstate *estate,
default:
elog(ERROR, "unrecognized dtype: %d", datum->dtype);
- *typeid = InvalidOid; /* keep compiler quiet */
+ *typoid = InvalidOid; /* keep compiler quiet */
*typmod = -1;
*collation = InvalidOid;
break;
diff --git a/src/pl/plpgsql/src/plpgsql.h b/src/pl/plpgsql/src/plpgsql.h
index fb9fcb55f5..82b2950294 100644
--- a/src/pl/plpgsql/src/plpgsql.h
+++ b/src/pl/plpgsql/src/plpgsql.h
@@ -1198,7 +1198,7 @@ extern PLpgSQL_recfield *plpgsql_build_recfield(PLpgSQL_rec *rec,
extern int plpgsql_recognize_err_condition(const char *condname,
bool allow_sqlstate);
extern PLpgSQL_condition *plpgsql_parse_err_condition(char *condname);
-extern void plpgsql_adddatum(PLpgSQL_datum *new);
+extern void plpgsql_adddatum(PLpgSQL_datum *dobj);
extern int plpgsql_add_initdatums(int **varnos);
extern void plpgsql_HashTableInit(void);
@@ -1225,7 +1225,7 @@ extern Oid plpgsql_exec_get_datum_type(PLpgSQL_execstate *estate,
PLpgSQL_datum *datum);
extern void plpgsql_exec_get_datum_type_info(PLpgSQL_execstate *estate,
PLpgSQL_datum *datum,
- Oid *typeid, int32 *typmod, Oid *collation);
+ Oid *typoid, int32 *typmod, Oid *collation);
/*
* Functions for namespace handling in pl_funcs.c
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic