Re: [BUGS] Error in SPI_execute_plan (when inserting JSON from Ccode first { simboll is lost)

Поиск
Список
Период
Сортировка
От Andres Freund
Тема Re: [BUGS] Error in SPI_execute_plan (when inserting JSON from Ccode first { simboll is lost)
Дата
Msg-id 20170626223536.r3nkil6cfzqwlw2r@alap3.anarazel.de
обсуждение исходный текст
Ответ на [BUGS] Error in SPI_execute_plan (when inserting JSON from C code first { simboll is lost)  (Арсен Арутюнян <arutar@bk.ru>)
Список pgsql-bugs
Hi,

On 2017-06-27 01:21:04 +0300, Арсен Арутюнян wrote:
> Oid * Types = (Oid *)palloc(2 * sizeof(Oid));
> Types[0] = 23; //Int32
> Types[1] = 114; //JSON
> m_JsonInsertPlan = SPI_saveplan(SPI_prepare("insert into json_test(Num,Obj) values ($1,$2)\0", 2, Types));

So the type of what you're inserting is int and json. The latter is a
variable length type.  But then you do:

> Values[0] = Int32GetDatum(227);
> Values[1] = CStringGetDatum(JsonObject->data);
> int ret = SPI_execute_plan(m_JsonInsertPlan, Values, NULL, false, 0);

inserting a cstring, rather than a json value.  I.e. the issue is that
you're "lying" about the types, and their validity. You should either
use text as the plan input, and cast the result of the statement, or you
need to actually construct a proper datum, using OidInputFunctionCall or
json_in directly.

> m_JsonInsertPlan = SPI_saveplan(SPI_prepare("insert into json_test(Num,Obj) values ($1,$2)\0", 2, Types));

Not sure what that \0 is supposed to do here?

> Types[1] = 114; //JSON

You should probably include catalog/pg_type.h and use JSONOID etc.

Andres


-- 
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs

В списке pgsql-bugs по дате отправления:

Предыдущее
От: Арсен Арутюнян
Дата:
Сообщение: [BUGS] Error in SPI_execute_plan (when inserting JSON from C code first { simboll is lost)
Следующее
От: Tom Lane
Дата:
Сообщение: Re: [BUGS] Error in SPI_execute_plan (when inserting JSON from C code first { simboll is lost)