On Fri, Jul 29, 2016 at 12:53 AM, Vitaly Burovoy <vitaly.buro...@gmail.com> wrote:
> On 7/28/16, Keith Fiske <ke...@omniti.com> wrote: > > Working on trying to get a C version of the maintenance function for my > > pg_partman extension working so I can hopefully make it more flexible and > > efficient. > > > > > https://github.com/keithf4/pg_partman/blob/master/sql/functions/run_maintenance.sql > > > > Up until this point I've just been using SPI and the Datum conversion > > functions (DatumGetCString, DatumGetInt32) to get string and numeric data > > out of tables and things have been working fine. I'm at the first point > in > > that function where I'll need to start dealing with timestamp data. > > > > > https://gist.github.com/keithf4/81c32bf8b689c74b20c10ad8c91d45a3#file-pg_partman_bgw-c-L532 > > > > There's what I've got working so far and links directly to the area where > > I'm having a problem. I found the DatumGetTimeTzADTP() function and the > > TimeTzADT data type looking through the source and that seems to be > exactly > > what I'm looking for. However, when I get to the point of trying to > simply > > use the time value in that variable (line 544), Postgres segfaults. So > far > > I've just been trying to print the value out to the log to ensure I'm > > pulling it out correctly. The "time" value of the struct appears to be an > > int64, so I thought %ld would be the correct, but even using %d or %s > > fails. > > > > You can see in my original plpgsql function how I eventually intend to > use > > the timestamp values. Here's a link directly to the equivalent section > > > > > https://github.com/keithf4/pg_partman/blob/master/sql/functions/run_maintenance.sql#L139 > > > > So, not sure if I'm even going about this the right manner for the way I > > intend to use the timestamp values. Still fairly new to C and getting use > > to postgres internals. Any help, or even an example of using timstamp > data > > pulled from a table in C with SPI, would be great. > > > > Thanks! > > > > -- > > Keith Fiske > > Database Administrator > > OmniTI Computer Consulting, Inc. > > http://www.keithf4.com > > > > I think it is not about timestamp(tz), but about usage of SPI. > Since DatumGetTimeTzADTP is just a macros implements type conversion > (declared at src/include/utils/date.h:60 (or 75)) you get segfault not > in it but when the code tries to get value by dereference pointer > (last_partition_timestamp->time). > > Please, answer questions: > 1. How many rows SPI_execute returns (value of "ret" variable)? > 2. Is last_partition_timestamp != NULL? Where it points to? > 3. Try to check SPI_result just after SPI_getbinval. Has it error code? > > -- > Best regards, > Vitaly Burovoy > It returns a single row. Here's an example of the results of the two queries that are run that lead to providing the timestamp value keith=# select partition_tablename from partman.show_partitions('partman_test.time_taptest_table', 'DESC') limit 1; partition_tablename -------------------------------- time_taptest_table_p2016_08_02 (1 row) keith=# select child_start_time from partman.show_partition_info('partman_test.time_taptest_table_p2016_08_02', '1 day', 'partman_test.time_taptest_table'); child_start_time ------------------------ 2016-08-02 00:00:00-04 (1 row) So there is valid data. As you're pointing out, this may just be a misunderstanding of how to actually use the Datum retrieval function and C in general. Appreciate the assistance. Keith