#include #include #include #include #define check(r) do { \ PGresult *res = r; \ if (PQresultStatus(res) == PGRES_NONFATAL_ERROR \ || PQresultStatus(res) == PGRES_FATAL_ERROR) { \ puts(PQresultErrorMessage(res)); \ } \ } while (0) int main() { PGconn *c = PQconnectStart("postgresql://test:test@localhost/test"); assert(c); for (int tries = 0; PQconnectPoll(c) != CONNECTION_MADE && tries < 10; tries++) usleep(100000); assert(PQconnectPoll(c) == CONNECTION_MADE); check(PQexec(c, "CREATE TYPE some_record AS (x int);")); check(PQexec(c, "CREATE TABLE tab (rec some_record, bar int);")); // ok: check(PQexec(c, "INSERT INTO tab VALUES(ROW(7), 8);")); char recbuf[4096], *rec = recbuf; *(int*)rec = __builtin_bswap32(1), rec += 4; //# elements *(int*)rec = __builtin_bswap32(INT4OID), rec += 4; *(int*)rec = __builtin_bswap32(4), rec += 4; //n bytes in entry *(int*)rec = __builtin_bswap32(7), rec += 4; // error: check(PQexecParams(c, "INSERT INTO tab VALUES($1, 8);", 1, &(Oid){RECORDOID}, &(const char*){recbuf}, &(int){rec - recbuf}, &(int){1/*binary*/}, 1/*binary result*/)); // error as well: check(PQexecParams(c, "INSERT INTO tab VALUES($1::some_record, 8);", 1, &(Oid){RECORDOID}, &(const char*){recbuf}, &(int){rec - recbuf}, &(int){1}, 1)); PQfinish(c); }