I have written an extension to manage openstreetmap data. There is a C
function to perform spatial top k query on several  tables and return an
array of int8 type as result. The code skeleton of this function is as
follows:

Datum vquery(PG_FUNCTION_ARGS) {

int array_len = PG_GETARG_INT32(0);
long * node_ids;

SPI_connect();

//some code to retrieve data from various tables
// node_ids are allocated and filled up

ArrayType * retarr;
Datum * vals ;

vals = palloc0(array_len * sizeof(long));

// fill the vals up
for (i = 0 ; i < array_len ; i++)
      vals[i] = Int64GetDatum((node_ids[i]));

retarr = construct_array(vals, retcnt, INT8OID, sizeof(long), true, 'i');

SPI_finish();

PG_RETURN_ARRAYTYPE_P(retarr);
}

the function runs smoothly when called using relatively small parameter,
such as select(unnest(vquery(1000))) ;  but when called with large
parameter, such as select(unnest(vquery(50000))), sometimes it runs
normally, sometimes it runs into "Segmentation Fault" error. the larger the
parameter is, the more likely to run into segmentation fault.

back trace of the process as followings:

Program received signal SIGSEGV, Segmentation fault.
pg_detoast_datum (datum=0x55d4e7e43bc0) at
/build/postgresql-9.3-xceQkK/postgresql-9.3-9.3.16/build/../src/backend/utils/fmgr/fmgr.c:2241
2241 
/build/postgresql-9.3-xceQkK/postgresql-9.3-9.3.16/build/../src/backend/utils/fmgr/fmgr.c:
No such file or directory.
(gdb) backtrace full
#0  pg_detoast_datum (datum=0x55d4e7e43bc0) at
/build/postgresql-9.3-xceQkK/postgresql-9.3-9.3.16/build/../src/backend/utils/fmgr/fmgr.c:2241
No locals.
#1  0x000055d4e485a29f in array_out (fcinfo=0x7ffd0fdb9f30) at
/build/postgresql-9.3-xceQkK/postgresql-9.3-9.3.16/build/../src/backend/utils/adt/arrayfuncs.c:958
        v = <optimized out>
        element_type = <optimized out>
        typlen = <optimized out>
        typbyval = <optimized out>
        typalign = <optimized out>
        typdelim = <optimized out>
        p = <optimized out>
        tmp = <optimized out>
        retval = <optimized out>
        values = <optimized out>
        dims_str =
"\346\263\346U\000\000\000\000f\021\352\312\342\177\000\000
%q\003\000\000\000\000\270\347\026\313\342\177\000\000\000\000\002\000\000\000\000\000\211O\343\312\342\177\000\000(?\a\000\000\000\000\000\371\336\342\312\342\177\000\000\001\000\000\000\000\000\000\000f\021\352\312\342\177\000\000\200\204\004\001\000\000\000\000\270\347\026\313\342\177\000\000\000\000\002\000\000\000\000\000\211O\343\312\342\177\000\000`1\354\352\324U\000\000\371\336\342\312\342\177\000\000\001\000\000\000\000\000\000\000\000\200\355\347\324U\000\000\300;\344\347\324U\000\000\200\373\350\346\324U\000\000\200\204\004\001\000\000\000\000`\347\026\313\342\177\000\000\200;\344\347\324U\000\000\200D\t\000\000\000\000\000\001\000\000\000\000\000\000"
        bitmap = <optimized out>
        bitmask = <optimized out>
        needquotes = <optimized out>
        needdims = <optimized out>
        nitems = <optimized out>
        overall_length = <optimized out>
        i = <optimized out>
        j = <optimized out>
        k = <optimized out>
        indx = {125, 0, 1638826752, 1007657037, 266051136, 32765}
        ndim = <optimized out>
        dims = <optimized out>
        lb = <optimized out>
        my_extra = <optimized out>
#2  0x000055d4e491bf77 in FunctionCall1Coll
(flinfo=flinfo@entry=0x55d4e6281608,
collation=collation@entry=0, arg1=arg1@entry=94372911922112)
    at
/build/postgresql-9.3-xceQkK/postgresql-9.3-9.3.16/build/../src/backend/utils/fmgr/fmgr.c:1301
        fcinfo = {flinfo = 0x55d4e6281608, context = 0x0, resultinfo = 0x0,
fncollation = 0, isnull = 0 '\000', nargs = 1, arg = {94372911922112, 16,
94372911922112,
            94372881863664, 81000, 140612075225152, 140724869504928,
94372856290490, 20, 94372911922112, 140724869504960, 94372855395365, 59362,
59362,
            140724869505552, 140611821448277, 140724869505184,
140724869505104, 140724869505056, 25309696688, 4630392398271114606,
4638776743690240000,
            4628742354541509959, 4638236535588651008, 140612075225152,
140724869505184, 140724869505264, 140724869505344, 8192, 1340029796386,
94372903805648,
            94372905445328, 4412211000755930201, 4295079941117417898,
4212081119735560672, 94372856202527, 2087976960, 94372882833728,
94372882836912, 1,
            140724869505296, 4327854021138088704, 3599182594146, 1,
140724869505248, 94372856077425, 1016, 94372882392848, 94372860652912,
140612076116712,
            140724869505680, 94372856082219, 94372882407728,
140724869505360, 140724869505343, 3886087214688, 140612076116712,
140724869505344, 140728326873992,
            94372882407736, 94372882817344, 94372882817312,
1125891316908032, 0, 94372855675584, 281483566645432, 2, 0, 94372881959504,
0, 1016, 0, 0, 8192,
            18446603348840046049, 513, 128, 176, 140724869505568, 16,
459561500672, 2, 0, 511101108336, 0, 140724869505567, 0, 0, 124, 0, 0, 0,
0, 0, 0,
            140612046612320, 8192, 1024, 1024, 1072},
          argnull = "\000
\000\000\000\000\000\000\300&\343\312\342\177\000\000\220\017(\346\324U\000\000x\201'\346\324U\000\000\320\242\333\017\375\177\000\000\260R\223\344\324U\000\000\060\243\333\017\375\177\000\000\002\000\000\000\000\000\000\000\340\242\333\017\375\177\000\000?:x\344\324U\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\020\354'\346"}
        result = <optimized out>
        __func__ = "FunctionCall1Coll"
#3  0x000055d4e491d557 in OutputFunctionCall (flinfo=0x55d4e6281608,
val=94372911922112)
    at
/build/postgresql-9.3-xceQkK/postgresql-9.3-9.3.16/build/../src/backend/utils/fmgr/fmgr.c:1954
        result = <optimized out>
        pushed = 0 '\000'
#4  0x000055d4e4635179 in printtup (slot=0x55d4e6280410,
self=0x55d4e627ec10)
    at
/build/postgresql-9.3-xceQkK/postgresql-9.3-9.3.16/build/../src/backend/access/common/printtup.c:347
        outputstr = <optimized out>
        thisState = <optimized out>
        attr = <optimized out>
        typeinfo = <optimized out>
        myState = 0x55d4e627ec10
        buf = {data = 0x55d4e6288150 "", len = 2, maxlen = 1024, cursor =
68}
        natts = 1
---Type <return> to continue, or q <return> to quit---
        i = 0
#5  0x000055d4e475c8f7 in ExecutePlan (dest=0x55d4e627ec10,
direction=<optimized out>, numberTuples=0, sendTuples=1 '\001',
operation=CMD_SELECT,
    planstate=0x55d4e6280220, estate=0x55d4e6280110) at
/build/postgresql-9.3-xceQkK/postgresql-9.3-9.3.16/build/../src/backend/executor/execMain.c:1513
        slot = <optimized out>
        current_tuple_count = 0
#6  standard_ExecutorRun (queryDesc=0x55d4e61989b0, direction=<optimized
out>, count=0)
    at
/build/postgresql-9.3-xceQkK/postgresql-9.3-9.3.16/build/../src/backend/executor/execMain.c:318
        estate = 0x55d4e6280110
        operation = CMD_SELECT
        dest = 0x55d4e627ec10
        sendTuples = <optimized out>
#7  0x000055d4e484255f in PortalRunSelect (portal=portal@entry=0x55d4e61969a0,
forward=forward@entry=1 '\001', count=0, count@entry=9223372036854775807,
    dest=dest@entry=0x55d4e627ec10) at
/build/postgresql-9.3-xceQkK/postgresql-9.3-9.3.16/build/../src/backend/tcop/pquery.c:942
        queryDesc = 0x55d4e61989b0
        direction = <optimized out>
        nprocessed = <optimized out>
        __func__ = "PortalRunSelect"
#8  0x000055d4e4843b2a in PortalRun (portal=portal@entry=0x55d4e61969a0,
count=count@entry=9223372036854775807, isTopLevel=isTopLevel@entry=1
'\001',
    dest=dest@entry=0x55d4e627ec10, altdest=altdest@entry=0x55d4e627ec10,
completionTag=completionTag@entry=0x7ffd0fdba830 "")
    at
/build/postgresql-9.3-xceQkK/postgresql-9.3-9.3.16/build/../src/backend/tcop/pquery.c:786
        save_exception_stack = 0x7ffd0fdba740
        save_context_stack = 0x0
        local_sigjmp_buf = {{__jmpbuf = {94372882585600,
6959097398727827151, 94372881852832, 94372882803728, 94372882585872, 2,
6959097398784450255,
              3801170618011246287}, __mask_was_saved = 0, __saved_mask =
{__val = {140724869506399, 4561020176, 94372856202256, 94372857528766, 64,
140724869506368,
                88, 94372881852832, 94372857166446, 94372882585872, 2,
140724869506400, 94372856290490, 2, 94372881852832, 140724869506432}}}}
        result = <optimized out>
        nprocessed = <optimized out>
        saveTopTransactionResourceOwner = 0x55d4e61560c8
        saveTopTransactionContext = 0x55d4e61b0fa0
        saveActivePortal = 0x0
        saveResourceOwner = 0x55d4e61560c8
        savePortalContext = 0x0
        saveMemoryContext = 0x55d4e61b0fa0
        __func__ = "PortalRun"
#9  0x000055d4e48414e5 in exec_simple_query (
    query_string=0x55d4e6248930 "select
vquery_c(121.3055419921875,28.596278622860407,129.9647216796875,36.91682310329166,81000,0.01);")
    at
/build/postgresql-9.3-xceQkK/postgresql-9.3-9.3.16/build/../src/backend/tcop/postgres.c:1075
        parsetree = 0x55d4e6249800
        portal = 0x55d4e61969a0
        snapshot_set = <optimized out>
        commandTag = <optimized out>
        completionTag = "\000ELECT
1\000\000\000\000\000\000\000\000\260\250\333\017\375\177\000\000\357r\177\344\324U\000\000`\352\000\000\000\000\000\000@
\355\325\344\324U\000\000\320D\025\346\324U\000\000\364y\031\346\324U\000"
        querytree_list = <optimized out>
        plantree_list = 0x55d4e627ebe0
        receiver = 0x55d4e627ec10
        format = 0
        dest = DestRemote
        parsetree_list = 0x55d4e6249930
        save_log_statement_stats = 0 '\000'
        was_logged = 0 '\000'
        msec_str = "\000ELECT
1\000\000\000\000\000\000\000\000\260\250\333\017\375\177\000\000\357r\177\344\324U\000"
        parsetree_item = 0x55d4e6249910
        isTopLevel = 1 '\001'
#10 PostgresMain (argc=<optimized out>, argv=argv@entry=0x55d4e6155878,
dbname=0x55d4e6155720 "openstreetmap", username=<optimized out>)
    at
/build/postgresql-9.3-xceQkK/postgresql-9.3-9.3.16/build/../src/backend/tcop/postgres.c:4087
        query_string = 0x55d4e6248930 "select
vquery_c(121.3055419921875,28.596278622860407,129.9647216796875,36.91682310329166,81000,0.01);"
        firstchar = -434542176
        input_message = {data = 0x55d4e6248930 "select
vquery_c(121.3055419921875,28.596278622860407,129.9647216796875,36.91682310329166,81000,0.01);",
len = 102,
          maxlen = 1024, cursor = 102}
        local_sigjmp_buf = {{__jmpbuf = {140724869506880,
6959097398365019855, 94372881585920, 1, 0, 94372881836048,
6959097398729924303, 3801170603473657551},
            __mask_was_saved = 1, __saved_mask = {__val = {0,
140724869507616, 0, 94372881836048, 140612043772104, 8192, 206158430256,
140724869507232,
---Type <return> to continue, or q <return> to quit---
                140724869507024, 140724869507072, 94372881586032, 656,
94372881857028, 10, 94372881585920, 94372881586232}}}}
        send_ready_for_query = 0 '\000'
        __func__ = "PostgresMain"
#11 0x000055d4e46315e9 in BackendRun (port=0x55d4e6192810) at
/build/postgresql-9.3-xceQkK/postgresql-9.3-9.3.16/build/../src/backend/postmaster/postmaster.c:4185
        ac = 1
        secs = 541521482
        usecs = 969410
        i = 1
        av = 0x55d4e6155878
        maxac = <optimized out>
#12 BackendStartup (port=0x55d4e6192810) at
/build/postgresql-9.3-xceQkK/postgresql-9.3-9.3.16/build/../src/backend/postmaster/postmaster.c:3848
        bn = <optimized out>
        pid = <optimized out>
#13 ServerLoop () at
/build/postgresql-9.3-xceQkK/postgresql-9.3-9.3.16/build/../src/backend/postmaster/postmaster.c:1698
        rmask = {fds_bits = {128, 0 <repeats 15 times>}}
        selres = <optimized out>
        readmask = {fds_bits = {200, 0 <repeats 15 times>}}
        now = <optimized out>
        last_lockfile_recheck_time = 1488206220
        last_touch_time = 1488205152
        __func__ = "ServerLoop"
#14 0x000055d4e47fa571 in PostmasterMain (argc=5, argv=<optimized out>)
    at
/build/postgresql-9.3-xceQkK/postgresql-9.3-9.3.16/build/../src/backend/postmaster/postmaster.c:1322
        opt = <optimized out>
        status = <optimized out>
        userDoption = <optimized out>
        listen_addr_saved = 1 '\001'
        i = <optimized out>
        __func__ = "PostmasterMain"
#15 0x000055d4e463227d in main (argc=5, argv=0x55d4e6154190) at
/build/postgresql-9.3-xceQkK/postgresql-9.3-9.3.16/build/../src/backend/main/main.c:234

Some background information to mention:

I have used some 3rd C libraries in the extension, those libraries use c
standard memory allocation functions such as malloc and calloc other than
the postgres memory management fucntions( palloc and pfree). Those library
implement the data structure of vector, hashtable and priority queue.

Reply via email to