From 7e61e6887bbd26df6dd7a1f99c60c9e43a61de0e Mon Sep 17 00:00:00 2001 From: Nikolay Shaplov Date: Thu, 7 Aug 2025 17:25:21 +0300 Subject: [PATCH] =?utf8?q?=D0=97=D0=B0=D1=87=D0=B0=D1=82=D0=BA=D0=B8=20?= =?utf8?q?=D0=BB=D0=B5=D0=BA=D1=86=D0=B8=D0=B8=20=D0=BF=D1=80=D0=BE=20?= =?utf8?q?=D1=82=D0=B8=D0=BF=D1=8B=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../src/data_types_examples/Makefile | 13 + .../data_types_examples--0.0.1.sql | 15 ++ .../data_types_examples.bc | Bin 0 -> 2652 bytes .../data_types_examples/data_types_examples.c | 13 + .../data_types_examples.control | 8 + .../data_types_examples/data_types_examples.o | Bin 0 -> 7304 bytes .../data_types_examples.so | Bin 0 -> 23312 bytes .../src/data_types_examples/my_factorial.bc | Bin 0 -> 4020 bytes .../src/data_types_examples/my_factorial.c | 24 ++ .../src/data_types_examples/my_factorial.o | Bin 0 -> 10072 bytes .../src/data_types_examples/warn_me.bc | Bin 0 -> 3504 bytes .../src/data_types_examples/warn_me.c | 13 + .../src/data_types_examples/warn_me.o | Bin 0 -> 8360 bytes .../src/log.md | 245 ++++++++++++++++++ 14 files changed, 331 insertions(+) create mode 100644 slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/Makefile create mode 100644 slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/data_types_examples--0.0.1.sql create mode 100644 slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/data_types_examples.bc create mode 100644 slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/data_types_examples.c create mode 100644 slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/data_types_examples.control create mode 100644 slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/data_types_examples.o create mode 100755 slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/data_types_examples.so create mode 100644 slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/my_factorial.bc create mode 100644 slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/my_factorial.c create mode 100644 slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/my_factorial.o create mode 100644 slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/warn_me.bc create mode 100644 slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/warn_me.c create mode 100644 slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/warn_me.o create mode 100644 slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/log.md diff --git a/slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/Makefile b/slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/Makefile new file mode 100644 index 0000000..f3bc8f7 --- /dev/null +++ b/slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/Makefile @@ -0,0 +1,13 @@ +MODULE_big = data_types_examples +EXTENSION = data_types_examples # Name of the extension +DATA = data_types_examples--0.0.1.sql +# REGRESS = my_first_extension-main-test + +OBJS = data_types_examples.o warn_me.o my_factorial.o + + +PG_CONFIG ?= pg_config # Path to the pg_config executable +PGXS := $(shell $(PG_CONFIG) --pgxs) # Get the PostgreSQL Extension Makefile from pg_config +include $(PGXS) # Include the PostgreSQL Extension Makefile + + diff --git a/slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/data_types_examples--0.0.1.sql b/slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/data_types_examples--0.0.1.sql new file mode 100644 index 0000000..bbd5d55 --- /dev/null +++ b/slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/data_types_examples--0.0.1.sql @@ -0,0 +1,15 @@ + +CREATE FUNCTION my_inc() +RETURNS INT +AS 'MODULE_PATHNAME', 'my_inc' +LANGUAGE C; + +CREATE FUNCTION warn_me(int) RETURNS int +AS 'MODULE_PATHNAME', 'warn_me' +LANGUAGE C; + + +CREATE FUNCTION my_factorial(int) RETURNS int +AS 'MODULE_PATHNAME', 'my_factorial' +LANGUAGE C; + diff --git a/slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/data_types_examples.bc b/slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/data_types_examples.bc new file mode 100644 index 0000000000000000000000000000000000000000..7978b753a9146315b49bc087c0d944418216b6b0 GIT binary patch literal 2652 zcmZV=e^3+Y^~(>k0pliMs{GiEy9AZ9NW+iAq=9K5sDWeV0(u?1+9BbW&_Zqr2q8M1 z4FNYQI?-dMnI1P6PCBQpwK%06{;-`ukRr|9p>x+^DB}=8uu$HnFx5S0-;PXLfgbF0)%z~ z5FYL2!bxd~OqFf8BI;J`iIFF1q!+4r^&xT5m2E|Xs%*7hp7=&wc7@NvjkDU~1ff?| zctu=0DZiy=%!hroLnkgXcP2saIR+s;;OtaOEK_|LvENP$sM$TR zCGAu64Ek*qwI`Ugx~|ZBTI4l|iwnhX-&dE9Eq*ldDUzi=$LBs0-ZxE~-uPK+Y2f*1 z>)Qrj>;GP=bYF4>x)$K4vpfU2M^GHWd>3*L z_38fcQI4ucib~E5zV>1F-4}`4g!jfuN+g-xYY)@T_iae*`)!74NJZ<)%M!kCMHfEU zVDA20zT;soHIz|(RG-4c(>l=?*IK*gGws?NWp2hM1@lmOB0^<=Q!2IVFJOsuF(D;* z{vYH=adJseDR1=)T!Y|jkhokz8%Ma)iB2>ZrRN4H^dWtJl%D13sVFt(p=U#yDLb_s zr56Xbud?){M>8$rB|Il|G)UZ_geP1UqC+p_H3(dgXhX||nkS&7TC>bj6LxwQX%?gO z@&GmA(L5;B%$letqf}&o0&Pny{R|}Yk=!jOI`x7xDC8v)u4@F^y%r*8L*z1IK*?g1 zn(}C7L(~*YEe~iG2dE`crMD$SxeS}q7x1cLVJkFtMqmT1SgOIp);K@zyZWY zBz#bCbKtDEg%{lDlK~3cTx979(TqusI9ZCHMLT&libEw3H(Y}|x=jH_DnUE;o(V~e z>oLZlH;)%u8YJ!D>owv`gSV9v+%vYgN7J&WK?3$QhUh?qTSqv9L@PryBc+ogS~kv@ zxhcR9ZX3}SB-%|xv!8?=lhd*#o`BG`FobJbw#pN3716%=;>Oe8s0b%dlq%)%R|?Pe zs^dkuMTx&l=403Qt+0b1jG(3C^1Hj*EulQcJsr+HLei8W^XyQy|154VgqRtg{hZ1r z5CWRV9BD|VxNeG;ASA~W0E6;umapT^$~FWT;2_bEC?Q1}_e&6|^#BbmjIuS*De-0g z-q^iICZuNZ9xK;#x_nX;bBq`DSjj^=u_<*FJ!!tQT6VK(|M^&~=l>Qj(<}uCr>=Gt zif%!?e+mLQa-JHGQuS(4fzPb(4)+%EM5l{r4YVkhkn*XDe8!VGiXzR}C=J=G*Trmz zc~c^if=P2hucRR2>V+yk4RvG@I4EaM((V#CMo5aplPi8Qs#7|2%7ry@%}VB|#_0zv zHN(XNADLxm+zX1(htA@OOkQOTQKZR=??3A&4x%ge`M4!83rHo zBbMP7IRRF+KmaR+q`yp%D>miRd1xQyBc1XQqx_qdbg0M$9SP)D^Rh4I$we!@eO^PP@-}22oP~+vwg?>@6n!UyP%hM% zQ)6MwK1EWjGuy&wJ-wGN-zyHP(rfdxvWqVH*{coA2r9io-IsxEM@@s>S=HL;uCtby znX5s9?gk^ewDGJkr~Z?|!)iUTQ@)EI z-~9OJPcPoM^sC67-UBO5j=pMp^5c>o%-?hIM&zQS4~efs@33I&wm4@x)Fk1qhVWLQ+1qlFx>C57C*vQQv&kyGxN;oUBD+ zJ{k4!6LOvj%1vxA3n3kUR34WxukPv^?ZVfg7PtqG!fa60E%r$DRtqmZCq);|8$NB> zNgjLt`{Q~3##{gX>p=V8E8p+==ZoV8C4R3C{$CCPPLT8sVMP*vw*YWF@HZIqDgp4q z82dSm30OY>*a6@G_!a>67q6}7_>AT8$^qE^4UE6*C=LEafQJp)!dv_|fro9_!drY` zy}AeAx50nO!*RwujJNo3L_Y){;VSH-7W-p8S=DSm*;rFmf67sl`HHHwx7oRqRrQUI z`gf|DJF6PuA)pQVl@NaAe}pzgH(SM}&#TJIJ;2o*XlitvaveD7IEB?#wRLiJtyOg{ Pdo$Nm*P2;_%|ibLNNQS= literal 0 HcmV?d00001 diff --git a/slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/data_types_examples.c b/slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/data_types_examples.c new file mode 100644 index 0000000..e53bb30 --- /dev/null +++ b/slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/data_types_examples.c @@ -0,0 +1,13 @@ +#include "postgres.h" +#include "fmgr.h" + +PG_MODULE_MAGIC; + +PG_FUNCTION_INFO_V1(my_inc); + +Datum +my_inc(PG_FUNCTION_ARGS) +{ + + PG_RETURN_INT32(2); +} diff --git a/slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/data_types_examples.control b/slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/data_types_examples.control new file mode 100644 index 0000000..99d98e9 --- /dev/null +++ b/slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/data_types_examples.control @@ -0,0 +1,8 @@ +# my_first_extension.control +# Comment line to provide additional information about the extension +comment = 'Data Types Exampls' + +# Specifies the default version of the extension +default_version = '0.0.1' +module_pathname = '$libdir/data_types_examples' + diff --git a/slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/data_types_examples.o b/slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/data_types_examples.o new file mode 100644 index 0000000000000000000000000000000000000000..adbe7440b302d80af3c111115d3e042a9d5a39b5 GIT binary patch literal 7304 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 b()%+f%`|F#{1{U!{TYh?M-5F$==%Q!p@1)< literal 0 HcmV?d00001 diff --git a/slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/data_types_examples.so b/slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/data_types_examples.so new file mode 100755 index 0000000000000000000000000000000000000000..0ff06840b678f401016835b006313dceaf492d35 GIT binary patch literal 23312 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 ky=7ZxhporG?SQT4(Y1i*-N!Dih41)tVdI{*Lx literal 0 HcmV?d00001 diff --git a/slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/my_factorial.c b/slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/my_factorial.c new file mode 100644 index 0000000..2e60743 --- /dev/null +++ b/slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/my_factorial.c @@ -0,0 +1,24 @@ +#include "postgres.h" +#include "fmgr.h" + +PG_FUNCTION_INFO_V1(my_factorial); + +Datum +my_factorial(PG_FUNCTION_ARGS) +{ + int32 res, n = PG_GETARG_INT32(0); + Datum d; + + if (n < 0) + elog(ERROR, "Так нельзя!"); + + if (n == 0) + PG_RETURN_INT32(1); + + d = DirectFunctionCall1(my_factorial, Int32GetDatum(n - 1)); + + res = DatumGetInt32(d) * n; + + PG_RETURN_INT32(res); +} + diff --git a/slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/my_factorial.o b/slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/my_factorial.o new file mode 100644 index 0000000000000000000000000000000000000000..e0852f046b03ea5c6193b515b9fedecd8158faf0 GIT binary patch literal 10072 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 T-SI=Loql3at8_aG4lDi}Aqhn$ literal 0 HcmV?d00001 diff --git a/slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/warn_me.bc b/slides/2025 - Becoming PosgtreSQL Developer. 2. Basic Structures: Register Data Types/src/data_types_examples/warn_me.bc new file mode 100644 index 0000000000000000000000000000000000000000..33a0e4fd25200423567d02112e13ca1fbf67cb9c GIT binary patch literal 3504 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 HC{zF6%H*. */ +typedef int8_t int8; +typedef int16_t int16; +typedef int32_t int32; +typedef int64_t int64; +typedef uint8_t uint8; +typedef uint16_t uint16; +typedef uint32_t uint32; +typedef uint64_t uint64; +``` +`src/include/c.h` + +## Волшебные макросы pg-функций + +Создание расширения начинается с вызова макроса + +``` +PG_MODULE_MAGIC; +``` + +На этом магия не заканчивается, а только начинается. + +// сам макрос создает функцию проверяющую совместимость подгружаемого расширения с ядрос PostgreSQL + +// текст макроса можно прочитать в `src/include/fmgr.h` но это для джедаев + +### Аргументы + +Вспоминаем функцию из предыдущей лекции + +``` +Datum +my_get_two(PG_FUNCTION_ARGS) +{ + PG_RETURN_INT32(2); +} +``` + +Макрос `PG_FUNCTION_ARGS` разворачивается в + +``` +/* Standard parameter list for fmgr-compatible functions */ +#define PG_FUNCTION_ARGS FunctionCallInfo fcinfo +``` +см. `src/include/fmgr.h` + +--- +Структура `FunctionCallInfo` имеет развесистую структуру содержит информацию о параметрах переданных в pg-функцию, пользоваться ей напрямую затруднительно (если ты не джедай темной стороны силы) + +Но есть специальный набор макросов для удобной работы с аргументами pg-функции + +--- + +Пример использования аргумента + +``` +#include "postgres.h" +#include "fmgr.h" + +PG_FUNCTION_INFO_V1(warn_me); + +Datum +warn_me(PG_FUNCTION_ARGS) +{ + int32 n = PG_GETARG_INT32(0); + elog(WARNING, "Предупреждаю: %i", n); + PG_RETURN_INT32(n); +} +``` + +``` +CREATE FUNCTION warn_me(int) RETURNS int +AS 'MODULE_PATHNAME', 'warn_me' +LANGUAGE C; +``` + +Мы видим что макром `PG_GETARG_INT32` используется для получения первого аргумента. +И этот аргумент сразу приводится к типу `int32` + +``` +# select warn_me(12); +WARNING: Предупреждаю: 12 + warn_me +--------- + 12 +(1 row) +``` + +--- + +Посмотрим на реализацию `PG_GETARG_INT32` в `src/include/fmgr.h`: + +``` +/* Macros for fetching arguments of standard types */ + +#define PG_GETARG_DATUM(n) (fcinfo->args[n].value) +#define PG_GETARG_INT32(n) DatumGetInt32(PG_GETARG_DATUM(n)) +#define PG_GETARG_UINT32(n) DatumGetUInt32(PG_GETARG_DATUM(n)) +#define PG_GETARG_INT16(n) DatumGetInt16(PG_GETARG_DATUM(n)) +#define PG_GETARG_UINT16(n) DatumGetUInt16(PG_GETARG_DATUM(n)) +#define PG_GETARG_CHAR(n) DatumGetChar(PG_GETARG_DATUM(n)) +#define PG_GETARG_BOOL(n) DatumGetBool(PG_GETARG_DATUM(n)) +``` + +Тут мы видим что как и все ее близницы братья `PG_GETARG_INT32` суммарно обращается к струкуре `fcinfo` о которой говорилось выше. + +Так же если мы проведем некоторое исследование мы узнаем что выражение `fcinfo->args[n].value` имеет тип `Datum`. + +И по всей видимости функция `DatumGetInt32` преобразует этот мифический пока для нас `Datum` к типу `int32`. + +К ним мы вернемся позже. + +(\*) задача со звездочкой: убедитесь самостоятельно что `fcinfo->args[n].value` имеет тип Datum + +--- + +Если мы обратим свой взор к макросу `PG_RETURN_INT32` в том же `src/include/fmgr.h` то там увидем схожую картину + +``` +/* Macros for returning results of standard types */ + +#define PG_RETURN_DATUM(x) return (x) +#define PG_RETURN_INT32(x) return Int32GetDatum(x) +#define PG_RETURN_UINT32(x) return UInt32GetDatum(x) +#define PG_RETURN_INT16(x) return Int16GetDatum(x) +#define PG_RETURN_UINT16(x) return UInt16GetDatum(x) +#define PG_RETURN_CHAR(x) return CharGetDatum(x) +#define PG_RETURN_BOOL(x) return BoolGetDatum(x) +``` + +Только тут направление преобразование другое `Int32GetDatum` из `int32` в `Datum` + +--- + +Так что же такое Datum? + +`src/include/postgres.h` + + +``` +/* + * A Datum contains either a value of a pass-by-value type or a pointer to a + * value of a pass-by-reference type. Therefore, we require: + * + * sizeof(Datum) == sizeof(void *) == 4 or 8 + * + * The functions below and the analogous functions for other types should be used to + * convert between a Datum and the appropriate C type. + */ + +typedef uintptr_t Datum; +``` + +`man uintptr_t`: + +`uintptr_t` is an unsigned integer type such that any valid (void *) value can be converted to this type and then converted back. + +Т.е. по сути это "машинное слово" определяемое разрядностью архитектуры. +--- + +В случае если размер данных позволяет, значение помещается в само "машинное слово". +В случае если размеры данных выходят за рамки "машииного слова", данные размещаются в опертивной памяти а в переменную типа Datum помещается указатель на них. + +`src/include/postgres.h` + +``` +/* + * DatumGetInt32 + * Returns 32-bit integer value of a datum. + */ +static inline int32 +DatumGetInt32(Datum X) +{ + return (int32) X; +} +``` + +``` +/* + * Int32GetDatum + * Returns datum representation for a 32-bit integer. + */ +static inline Datum +Int32GetDatum(int32 X) +{ + return (Datum) X; +} +``` + +Т.е. тут мы просто явно приводим тип "машинного слова" к требуемому, ничего более + +(***) Задача с тремя звездочками: поразмышляйте, почему `DatumGetInt32` реализована как intine функция, а не как макрос + +--- + +С хранением сложных типов данных в Datum мы будем резбираться на следующей лекции. + +А пока поиграем со стандартными типами + +``` +#include "postgres.h" +#include "fmgr.h" + +PG_FUNCTION_INFO_V1(my_factorial); + +Datum +my_factorial(PG_FUNCTION_ARGS) +{ + int32 res, n = PG_GETARG_INT32(0); + Datum d; + + if (n < 0) + elog(ERROR, "Так нельзя!"); + + if (n == 0) + PG_RETURN_INT32(1); + + d = DirectFunctionCall1(my_factorial, Int32GetDatum(n - 1)); + + res = DatumGetInt32(d) * n; + + PG_RETURN_INT32(res); +} +``` + +(*) Задача со звездочкой: Посмотрите на реализацию вызова `DirectFunctionCall1`, как она устроена внутри + -- 2.47.3