2

I cannot get environment variable in my PostgreSQL C extension code.

For example, this function always returns 111:

#include "postgres.h"
#include "fmgr.h"
#include <stdlib.h>

PG_MODULE_MAGIC;

PG_FUNCTION_INFO_V1(myinc);
Datum
myinc(PG_FUNCTION_ARGS)
{
  int32 arg = PG_GETARG_INT32(0);
  char* envar = getenv("MYINC");
  if (envar) {
    PG_RETURN_INT32(arg + atoi(envar));
  } else {
    PG_RETURN_INT32(111);
  }
}

While this C program works as expected, it prints whatever MYINC is:

#include <stdio.h>
#include <stdlib.h>

int main()
{
  printf("MYINC: %s", getenv("MYINC"));
  return 0;
}
Nikola
  • 35
  • 3

1 Answers1

5

That should work just fine. Note, however, that it will take the variable from the environment of the PostgreSQL server process, not your current client process.

Laurenz Albe
  • 30,193
  • 3
  • 26
  • 50
  • 1
    How do I save variable to the environment of the PostgreSQL server process? I've tried adding it to `/etc/environment` and also to `~/.profile` (with restart of PostgreSQL service and even with PC restart) but it didn't work. I'm using Ubuntu via WSL2. – Nikola Jan 18 '22 at 17:48
  • 1
    As far as I remember, the Ubuntu PostgreSQL binaries have a special environment file under `/etc/postgresql`. – Laurenz Albe Jan 19 '22 at 06:47
  • It works. Thank you Albe! – Nikola Jan 19 '22 at 10:06