Phiên bản được hỗ trợ:hiện tại(17)16/15/14/13
Phiên bản phát triển:Devel
Phiên bản không được hỗ trợ:12/11/10/9.6/9.5/9.4/9.3/9.2/9.1/9.0/8.4/8.3/8.2/8.1/8.0/7.4/7.3/7.2/7.1
Tài liệu này dành cho phiên bản không được hỗ trợ của PostgreSQL.
Bạn có thể muốn xem cùng kèo bóng đá pháp trang chohiện tạiPhiên bản hoặc một trong kèo bóng đá pháp phiên bản được hỗ trợ khác được liệt kê ở trên thay thế.

33.7. kèo bóng đá pháp ngữ c

Các chức năng do người dùng xác định có thể được viết bằng C (hoặc một kèo bóng đá pháp ngữ mà"cchức năng từ"Nội bộ"chức năng --- mã hóa thực tế

Hai quy ước gọi khác nhau hiện đang được sử dụng cho c"Phiên bản 1"quy ước gọi được biểu thị bằng cách viết Apg_function_info_v1 ()Cuộc gọi macro cho chức năng,"Phiên bản 0") Hàm. kèo bóng đá pháp ngữTạo chức năngCTrong cả hai trường hợp. kèo bóng đá pháp chức năng kiểu cũ

33.7.1. Tải động

Lần đầu tiên chức năng do người dùng định nghĩa trong kèo bóng đá pháp cụ thểTạo chức năngcho a

Thuật toán sau được sử dụng để định vị đối tượng chia sẻTạolệnh:

  1. Nếu tên là đường dẫn tuyệt đối, tệp đã cho là

  2. Nếu tên bắt đầu bằng chuỗi$ libdir, phần đó được thay thế bằngPostgreSQLThư viện gói

  3. Nếu tên không chứa phần thư mục, tệpDynamic_l Library_path.

  4. Nếu không (tệp không được tìm thấy trong đường dẫn hoặc nó

Nếu chuỗi này không hoạt động, phần dành riêng cho nền tảng được chia sẻ.so) được gắn vào tên đã cho và cái này

ID người dùngPostgreSQLMáy chủ chạy vì phải có thể đi qua đường dẫn đến tệpPostgresNgười dùng là kèo bóng đá pháp sai lầm phổ biến.

Trong mọi trường hợp, tên tệp được đưa ra trongTạo chức năngLệnh được ghi lại theo nghĩa đen trong

Lưu ý: PostgreSQLSẽ không tự động biên dịch chức năng C. Đối tượngTạo chức năngLệnh. Nhìn thấyPhần 33.7.6cho

Sau khi nó được sử dụng lần đầu tiên,loadlệnh hoặc bắt đầu kèo bóng đá pháp mới

Nên định vị kèo bóng đá pháp thư viện được chia sẻ$ libdirhoặc thông qua động lực$ libdircó thể tìm thấypg_config.

trướcPostgreSQLPhát hànhTạo chức năng. Cái này

33.7.2. kèo bóng đá pháp loại cơ sở bằng tiếng c

Để biết cách viết các chức năng kèo bóng đá pháp ngữ C, bạn cần biếtPostgreSQLnội bộPostgreSQLcoi kèo bóng đá pháp cơ sở là"Blob of Memory". Người dùng định nghĩaPostgreSQLcó thể hoạt động trênPostgreSQLWill

kèo bóng đá pháp loại cơ sở có thể có một trong ba định dạng nội bộ:

  • Truyền theo giá trị, độ dài cố định

  • Vượt qua tham chiếu, độ dài cố định

  • Pass by tham chiếu, độ dài biến

kèo bóng đá pháp loại giá trị chỉ có thể có chiều dài 1, 2 hoặc 4 byte (cũngsizeof (mốc dữ liệu)là 8 trênLongkèo bóng đá pháp nguy hiểmintLoại là 4 byte trên hầu hết kèo bóng đá pháp UnixINT4kèo bóng đá pháp trên máy Unix có thể là:

/ * 4 byte số nguyên, được truyền theo giá trị */

Mặt khác, kèo bóng đá pháp loại có độ dài cố định có thểPostgreSQLkèo bóng đá pháp:

/ * cấu trúc 16 byte, được truyền qua tham chiếu */

Chỉ có thể sử dụng kèo bóng đá pháp gợi ý cho kèo bóng đá pháp loại như vậy khi chuyển chúng vàoPostgreSQLchức năng. Để trả về giá trị của kèo bóng đá pháp loại như vậy, hãy phân bổ quyềnPalloC, điền vàokhông bao giờSửa đổi

Cuối cùng, tất cả kèo bóng đá pháp loại có độ dài thay đổi cũng phải được truyền qua

Ví dụ, chúng ta có thể xác định kèo bóng đá phápTextnhư sau:

Typedef Struct

Rõ ràng, trường dữ liệu được khai báo ở đây không đủ dàiC, Chúng tôi dựa vào kiến ​​thức rằngCTrình biên dịch sẽ không kiểm tra phạm vi

Khi thao tác kèo bóng đá pháp loại độ dài thay đổi, chúng ta phải cẩn thậnTextcấu trúc, chúng ta có thể sử dụng kèo bóng đá pháp

#include "Postgres.h"

Varhdrszgiống nhưsizeof (int4), nhưng nó được coi là phong cách tốt đểVarhdrszđể tham khảo

Bảng 33-1Chỉ định kèo bóng đá pháp c tương ứng với kèo bóng đá pháp SQL khiPostgreSQL. The"Được xác định trong"Cột đưa ra tệp tiêu đề màPostgres.hĐầu tiên trong bất kỳ tệp nguồn nào, vì nó

Bảng 33-1. kèo bóng đá pháp loại C tương đương cho SQL tích hợp

SQL kèo bóng đá pháp C kèo bóng đá pháp được xác định trong
Abstime Tuyệt đối Utils/nabstime.h
Boolean bool Postgres.h(có thể
Box Box* UTILS/GEO_DECLS.H
bytea bytea* Postgres.h
"Char" Char (trình biên dịch tích hợp)
ký tự bpchar* Postgres.h
CID CommandID ​​Postgres.h
ngày dateadt Utils/date.h
smallint(INT2) INT2hoặcINT16 Postgres.h
int2Vector int2Vector* Postgres.h
Số nguyên(INT4) INT4hoặcINT32 Postgres.h
Real(float4) float4* Postgres.h
Double Precision(float8) float8* Postgres.h
Khoảng Khoảng* Utils/Timestamp.h
LSEG LSEG* UTILS/GEO_DECLS.H
tên tên Postgres.h
oid OID Postgres.h
oidvector oidvector* Postgres.h
đường dẫn đường dẫn* UTILS/GEO_DECLS.H
điểm điểm* UTILS/GEO_DECLS.H
RegProc RegProc Postgres.h
Relime Relativetime Utils/nabstime.h
Text Text* Postgres.h
TID itemPulum Storage/itemptr.h
thời gian Timeadt Utils/date.h
Thời gian với múi giờ Timetzadt Utils/date.h
Timestamp dấu thời gian* Utils/Timestamp.h
Tinterval Timeinterval Utils/nabstime.h
Varchar Varchar* Postgres.h
XID TranstercentID Postgres.h

Bây giờ chúng tôi đã vượt qua tất cả kèo bóng đá pháp cấu trúc có thể

33.7.3.

Chúng tôi trình bày"Kiểu cũ"Gọi quy ước đầu tiên --- mặc dù cách tiếp cận này hiện là

Đây là kèo bóng đá pháp số ví dụ:

#include "Postgres.h"

Giả sử rằng mã trên đã được chuẩn bị trong Tệpfuncs.cvà được biên dịch thành kèo bóng đá pháp chia sẻPostgreSQLvới kèo bóng đá pháp lệnh như thế này:

Tạo kèo bóng đá pháp add_one (số nguyên) Trả về số nguyênThư mục/funcs ',' add_one 'Thư mục/funcs ',' add_one_float8 'Thư mục/funcs ',' makepoint 'Thư mục/funcs ',' copytext 'Thư mục/funcs ',' concat_text ',

ở đây,Thư mụclà viết tắt củaPostgreSQLThư mục hướng dẫn,'funcs'trongASmệnh đề, sau khi đã thêmThư mụcđến đường dẫn tìm kiếm. Trong bất kỳ.sohoặc.SL.)

Lưu ý rằng chúng tôi đã chỉ định kèo bóng đá pháp chức năng là"nghiêm ngặt", nghĩa là hệ thống nên

Mặc dù quy ước gọi này đơn giản để sử dụng, nhưng nó không phải làintCách này. Ngoài ra, không có cách nào đơn giản để

33.7.4.

Quy ước gọi phiên bản-1 dựa trên kèo bóng đá pháp macro để

Datum funcname (pg_function_args)

Ngoài ra, cuộc gọi macro

pg_function_info_v1 (funcname);

phải xuất hiện trong cùng kèo bóng đá pháp tệp nguồn. (Thông thường, nóNội bộ-LanguagePostgreSQLGiả sử rằng tất cả kèo bóng đá pháp chức năng nội bộ đều sử dụng phiên bản-1

Trong kèo bóng đá pháp phiên bản-1, mỗi đối số thực tế được tìm nạppg_getarg_xxx()Macro tương ứng vớipg_return_xxx()Macro cho kèo bóng đá pháp trả về.pg_getarg_xxx()lấy đối số của nópg_return_xxx()lấy đối số của nó

Ở đây chúng tôi hiển thị kèo bóng đá pháp chức năng giống như trên, được mã hóa trong phiên bản-1

#include "Postgres.h"

Thetạo chức năngkèo bóng đá pháp lệnh là

Thoạt nhìn, kèo bóng đá pháp quy ước mã hóa phiên bản-1 có thể xuất hiệnadd_one_float8, chúng ta không còn cần phải biếtfloat8là kèo bóng đá pháp tham chiếu qua.GetArgMacro cho kèo bóng đá pháp loại có độ dài thay đổi cho phép hiệu quả hơn"Nướng"(nén hoặc

Một cải tiến lớn về kèo bóng đá pháp chức năng phiên bản-1 tốt hơnpg_argisnull (n)Cho phép kèo bóng đá pháp chức năng kiểm tra"nghiêm ngặt".) Như vớipg_getarg_xxx()macro, kèo bóng đá pháp đối số đầu vàopg_getarg_xxx()Cho đến khi người ta xác minh rằngpg_return_null (); Điều này hoạt động trong

kèo bóng đá pháp tùy chọn khác được cung cấp trong giao diện kiểu mới là haipg_getarg_xxx()Macros. Cái đầu tiên trong số này,pg_getarg_xxx_copy (), đảm bảo trả lại apg_getarg_xxx_copy ()macro đảm bảo apg_getarg_xxx_slice ()macro lấy"Bên ngoài". (kèo bóng đá pháp lưu trữThay đổiTableNameCột thay đổicolnameĐặt lưu trữStoragetype.Storagetypelà kèo bóng đá pháp trongtrơn,bên ngoài,mở rộnghoặcchính.)

Cuối cùng, kèo bóng đá pháp quy ước gọi chức năng phiên bản-1 làm cho nóPhần 33.7.9) vàChương) và Trình xử lý cuộc gọi bằng kèo bóng đá pháp ngữ thủ tục (Chương 47). Mã phiên bản-1 cũng nhiều hơnsrc/backend/utils/fmgr/readmein

33.7.5.

Trước khi chúng ta chuyển sang kèo bóng đá pháp chủ đề nâng cao hơn, chúng ta nênPOSTGRESQLC Hàm kèo bóng đá pháp ngữ C. Trong khi nóPOSTGRESQL, this

kèo bóng đá pháp quy tắc cơ bản để viết và xây dựng kèo bóng đá pháp chức năng C là

  • sử dụngpg_configĐể tìm ra nơiPostgreSQLkèo bóng đá pháp tệp tiêu đề máy chủ làPostgreSQL7.2. VìPostgreSQL7.1 Bạn nên sử dụng--includedir. (pg_configsẽ thoát với trạng thái không khác

  • Khi phân bổ bộ nhớ, hãy sử dụngPOSTGRESQLchức năngPalloCPFREEThay vì thư viện C tương ứngmallocmiễn phí. Bộ nhớ được phân bổ bởiPalloCsẽ được giải phóng

  • Luôn luôn không kèo bóng đá pháp byte của cấu trúc của bạn bằng cách sử dụngmemset. Không có điều này, nó là

  • Hầu hết kèo bóng đá pháp bên trongPOSTGRESQLkèo bóng đá pháp loại được khai báo trongPostgres.h, trong khi chức năngpg_function_args, v.v.)fmgr.h, vì vậy bạn sẽ cần phải bao gồm tạiPostgres.h Đầu tiên, trước bất kỳPostgres.hcũng sẽ bao gồmELOG.Hpalloc.hcho bạn.

  • Tên biểu tượng được xác định trong kèo bóng đá pháp tệp đối tượng không đượcPostgreSQLMáy chủ

  • biên dịch và liên kết mã của bạn để có thểPostgreSQLLuôn yêu cầu đặc biệtPhần 33.7.6Để có lời giải thích chi tiết về cách thực hiện

33.7.6. Biên soạn

Trước khi bạn có thể sử dụngPostgreSQLkèo bóng đá pháp chức năng mở rộng được viết trongThư viện chia sẻCần phải có

Để biết thông tin vượt ra ngoài những gì có trong phần này, bạnCCvà Trình chỉnh sửa liên kết,LD. Ngoài ra,PostgreSQLMã nguồn chứa kèo bóng đá pháp sốđóng gópThư mục. Nếu bạn dựa vào những ví dụ này, bạn sẽ làmPostgreSQLTuy nhiên, mã nguồn.

Tạo chia sẻMã độc lập vị trí(pic),về mặt khái niệm có thể là

Trong kèo bóng đá pháp ví dụ sau, chúng tôi cho rằng mã nguồn của bạn làfoo.cvà chúng tôi sẽ tạo kèo bóng đá phápfoo.so. kèo bóng đá phápfoo.otrừ khi có ghi chú khác. kèo bóng đá pháp thư viện được chia sẻ

BSD/OS

Cờ trình biên dịch để tạopic-FPIC.-shared.

GCC -FPIC -C FOO.C

Điều này được áp dụng kể từ phiên bản 4.0 củaBSD/OS.

FreeBSD

Cờ trình biên dịch để tạopic-FPIC.-shared.

GCC -FPIC -C FOO.C

Điều này được áp dụng theo phiên bản 3.0 củaFreeBSD.

HP-UX

Cờ trình biên dịch của trình biên dịch hệ thống để tạopic+Z. Khi sử dụngGCCĐó là-FPIC. Cờ liên kết cho kèo bóng đá pháp thư viện được chia sẻ-B. Vì thế

cc +z -c foo.c

hoặc

gcc -fpic -c foo.c

và sau đó

ld -b -o foo.sl foo.o

HP-UXSử dụng.SLđể chia sẻ

IRIX

piclà mặc định,-shared.

CC -C FOO.C
Linux

Cờ trình biên dịch để tạopic-FPIC.-FPICphải được sử dụng nếu-FPICKhông hoạt động. Tham khảo GCC50444_50453. MỘT

cc -fpic -c foo.c
MacOS X

Đây là một ví dụ. Nó giả định kèo bóng đá pháp công cụ nhà phát triển là

CC -C FOO.C
NetBSD

Cờ trình biên dịch để tạopic-FPIC.elfHệ thống, The-sharedISld -bsharableIS

GCC -FPIC -C FOO.C
OpenBSD

Cờ trình biên dịch để tạopic-FPIC.ld -bsharableđược sử dụng để liên kết

GCC -FPIC -C FOO.C
Solaris

Cờ trình biên dịch để tạopic-KPICVới trình biên dịch mặt trời và-FPICvớiGCC. Để liên kết chia sẻ-gvới trình biên dịch hoặc thay thế-sharedvớiGCC.

cc -kpic -c foo.c

hoặc

GCC -FPIC -C FOO.C
TRU64 UNIX

piclà mặc định,LDvới kèo bóng đá pháp tùy chọn đặc biệt được sử dụng để thực hiện

CC -C FOO.C

Quy trình tương tự được sử dụng với GCC thay vì

Unixware

Cờ trình biên dịch để tạopic-K picVới trình biên dịch SCO và-FPICvớiGCC. Để liên kết chia sẻ-gVới trình biên dịch SCO và-sharedvớiGCC.

CC -K pic -c foo.c

hoặc

GCC -FPIC -C FOO.C

Tip:Nếu điều này quá phức tạp đối với bạn, bạngnu libtool,,

Tệp thư viện chia sẻ kết quả sau đó có thể được tải vàoPOSTGRESQL. Khi chỉ địnhTạo chức năngLệnh, người ta phải đặt tên cho tệp thư viện được chia sẻ,.sohoặc.SL) có thểTạo chức nănglệnh và thông thường nên được bỏ qua

Tham khảo lạiPhầnVề nơi máy chủ mong đợi tìm được chia sẻ

33.7.7.

kèo bóng đá pháp loại tổng hợp không có bố cục cố định như CPostgreSQLcung cấp kèo bóng đá pháp chức năng

Giả sử chúng ta muốn viết kèo bóng đá pháp chức năng để trả lời truy vấn

Chọn Tên, C_OverPaid (EMP, 1500) làm trả quá nhiều tiền

Sử dụng quy ước gọi phiên bản 0, chúng ta có thể xác địnhc_overpaidAs:

#include "Postgres.h"

Trong mã hóa phiên bản-1, ở trên sẽ trông như thế này:

#include "Postgres.h"

getAttributionByNamePOSTGRESQLkèo bóng đá pháp hệ thốngtupletableslot*được chuyển vào chức năng, têngetAttributionByNameTrả về ADatumGiá trị mà bạn có thể chuyển đổi sang dữ liệu phù hợpDatumgetxxx()Macro.

Lệnh sau tuyên bố chức năngc_overpaidTrong SQL:

Tạo chức năng c_overpaid (EMP, Integer) Trả về BooleanThư mục/funcs ',' c_overpaid '

33.7.8.

Để trả lại giá trị loại hoặc loại tổng hợp từ kèo bóng đá pháp ngữ c

#include "funcapi.h"

Hỗ trợ trả về kèo bóng đá pháp loại dữ liệu tổng hợp (hoặc hàng)AttinMetadataCấu trúc. Cấu trúc này chứa kèo bóng đá pháp mảng thuộc tính riêng lẻtupledesccấu trúc, nhưng nó làAttinMetadataCấu trúc nên được tính toánAttinMetadatacũng lưu kèo bóng đá pháp con trỏtupledesc.

Typedef struct attinMetadata

Để hỗ trợ bạn điền vào cấu trúc này, kèo bóng đá pháp số

TUPLEDESC quan hệ

để nhậntupledesccho kèo bóng đá pháp cái tên

60074_60135

để nhậntupledescDựa trên atupledescĐối với kèo bóng đá pháp cơ sở hoặc kèo bóng đá pháp tổng hợp.

AttinMetadata *tupledescgetatto

Sẽ trả kèo bóng đá pháp con trỏ choAttinMetadata, Khởi tạo dựa trên đã chotupledesc.AttinMetadatacó thể được sử dụng cùng với

Để trả về kèo bóng đá pháp tuple, bạn phải tạo kèo bóng đá pháp khe cắm Tuple dựa trêntupledesc. Bạn có thể sử dụng

60916_60971

Để khởi tạo khe cắm này hoặc lấy cái này quaDatumĐể trở lại theo hàm. kèo bóng đá pháp

Sau khi xây dựngAttinMetadataCấu trúc,

61354_61431

có thể được sử dụng để xây dựng Ađã cho dữ liệu người dùng ở dạng chuỗi C.giá trịlà kèo bóng đá pháp mảng chuỗi C, kèo bóng đá pháp cho mỗi chuỗiGiá trịMảng phải được đặt thànhnull. Cái này

Xây dựng kèo bóng đá pháp tuple quatupledescgetattinmetadatabuildTupleFromCStringschỉ thuận tiện nếuDatumGiá trị, thay vào đó bạn nên​​Để chuyển đổiDatumGiá trị trực tiếp thành kèo bóng đá pháp tuple. Bạn sẽ vẫn còntupledescvà Atupletableslot, nhưng khôngAttinMetadata.

kèo bóng đá pháp khi bạn đã xây dựng kèo bóng đá pháp tuple để trở về từ chức năng của mình, nóDatum. Sử dụng

62902_62958

Để nhậnDatumCho kèo bóng đá pháp tuple và kèo bóng đá phápDatumCó thể được trả về trực tiếp

kèo bóng đá pháp ví dụ xuất hiện trong phần tiếp theo.

33.7.9. Các bộ trở về từ kèo bóng đá pháp ngữ C

Ngoài ra còn có kèo bóng đá pháp API đặc biệt cung cấp hỗ trợ chofuncapi.h, như trên.

kèo bóng đá pháp hoàn trả SET (SRF) được gọi kèo bóng đá pháp lần cho mỗi mục nóSRFPhảifunccallcontextđược cung cấp để giúp kiểm soátfcinfo- flinfo- fn_extrađược sử dụng để giữ kèo bóng đá phápfunccallcontextBên kia

Cấu trúc typedef

ANSRFSử dụng kèo bóng đá pháp sốfunccallcontextCấu trúc (vàfn_extra).

srf_is_firstcall ()

Để xác định xem chức năng của bạn có được gọi cho lần đầu tiên

srf_firstcall_init ()

Để khởi tạofunccallcontext. Trên mọi cuộc gọi chức năng,

srf_percall_setup ()

Để thiết lập đúng cách sử dụngfunccallcontextvà xóa bất kỳ trước đó

Nếu chức năng của bạn có dữ liệu để trả về, hãy sử dụng

srf_return_next (funcctx, result)

Để trả lại cho người gọi. (resultPhải kèo bóng đá phápDatum, hoặc là kèo bóng đá pháp

srf_return_done (funcctx)

Để dọn dẹp và kết thúcSRF.

Bối cảnh bộ nhớ hiện tại khiSRFđược gọi là bối cảnh thoáng qua màPFREETrên mọi thứ bạnPalloC; nó sẽmulti_call_memory_ctxlà kèo bóng đá pháp vị trí phù hợpSRFĐược hoàn thành chạy. Trong hầu hết kèo bóng đá pháp trường hợp,Multi_call_memory_ctxTrong khi làm

kèo bóng đá pháp ví dụ giả giả hoàn chỉnh trông giống như sau:

Datumkhai báo thêm khi cầnif (srf_is_firstcall ())Mã người dùng
        Nếu trả về composite
            Build tupledesc và có lẽ là attinmetadata
            lấy khefuncctx- slot = slot;endif trả về composite
        Mã người dùngMemoryContextSwitchto (OldContext);Mã người dùngfuncctx = srf_percall_setup ();Mã người dùng/ * Đây chỉ là kèo bóng đá pháp cách chúng ta có thể kiểm tra xem chúng ta đã hoàn thành: */Mã người dùng
        có được dữ liệu kết quảsrf_return_next (funcctx, result);Mã người dùngsrf_return_done (funcctx);

kèo bóng đá pháp ví dụ hoàn chỉnh về đơn giảnSRFTrả lại kèo bóng đá pháp loại tổng hợp trông

pg_function_info_v1 (testpassbyval);

Mã SQL để khai báo chức năng này là:

Tạo kèo bóng đá pháp __TestPassByVal As (số nguyên F1, số nguyên F2, số nguyên F3);FileName',' testPassbyVal '

Thư mục73481_73500in

33.7.10.

Các hàm kèo bóng đá pháp ngữ C có thể được tuyên bố để chấp nhận và trả lạiAnyEuityAnyArray. Nhìn thấyPhầnĐể giải thích chi tiết hơn về đa hìnhfmgr.hĐể cho phép chức năng phiên bản-1 Cget_fn_expr_rettype (fmgrinfo *flinfo)GET_FN_EXPR_ARGTYPE (fmgrinfo *flinfo, int. Họ trả về kết quả hoặc kèo bóng đá pháp đối số oid hoặckhông hợp lệNếu thông tin khôngflinfoISfcinfo- flinfo. Tham sốargnumbằng không.

Ví dụ: giả sử chúng ta muốn viết kèo bóng đá pháp chức năng để chấp nhận a

pg_function_info_v1 (make_array);

Lệnh sau tuyên bố kèo bóng đá phápmake_arraytrong SQL:

Tạo chức năng Make_array (AnyEuity) trả về AnyArrayThư mục/funcs ',' make_array '

Lưu ý việc sử dụngnghiêm ngặt; Đây là