như được mô tả trongPhần 36.2, PostgreSQLcó thể được mở rộng để hỗ trợ các tỷ lệ kèo bóng đá tối nay dữ liệu mới. Phần này mô tả cách xác định các tỷ lệ kèo bóng đá tối nay cơ sở mới, là các tỷ lệ kèo bóng đá tối nay dữ liệu được xác định dưới mức củaSQLNgôn ngữ. Tạo một tỷ lệ kèo bóng đá tối nay cơ sở mới yêu cầu thực hiện các chức năng để hoạt động trên tỷ lệ kèo bóng đá tối nay bằng ngôn ngữ cấp thấp, thường là C.
tỷ lệ kèo bóng đá tối nay ví dụ trong phần này có thể được tìm thấy trongphức tạp.sql
vàphức tạp.c
TrongSRC/Hướng dẫn
Thư mục phân phối nguồn. Xemreadme
Tệp trong thư mục đó cho tỷ lệ kèo bóng đá tối nay hướng dẫn về chạy tỷ lệ kèo bóng đá tối nay ví dụ.
Một tỷ lệ kèo bóng đá tối nay do người dùng xác định phải luôn có các chức năng đầu vào và đầu ra. Các chức năng này xác định cách tỷ lệ kèo bóng đá tối nay xuất hiện trong chuỗi (cho đầu vào của người dùng và đầu ra cho người dùng) và cách sắp xếp tỷ lệ kèo bóng đá tối nay trong bộ nhớ. Hàm đầu vào có chuỗi ký tự kết thúc null làm đối số của nó và trả về biểu diễn bên trong (trong bộ nhớ) của tỷ lệ kèo bóng đá tối nay. Hàm đầu ra lấy biểu diễn nội bộ của tỷ lệ kèo bóng đá tối nay làm đối số và trả về chuỗi ký tự kết thúc null. Nếu chúng tôi muốn làm bất cứ điều gì với tỷ lệ kèo bóng đá tối nay hơn là chỉ lưu trữ nó, chúng tôi phải cung cấp các chức năng bổ sung để thực hiện bất kỳ hoạt động nào chúng tôi muốn có cho tỷ lệ kèo bóng đá tối nay.
Giả sử chúng ta muốn xác định một tỷ lệ kèo bóng đá tối nayphức tạp
đại diện cho tỷ lệ kèo bóng đá tối nay số phức. Một cách tự nhiên để biểu diễn một số phức trong bộ nhớ sẽ là cấu trúc C sau:
Typedef Struct Complex gấp đôi x; gấp đôi y; Tổ hợp;
Chúng ta sẽ cần biến tỷ lệ kèo bóng đá tối nay này thành một tỷ lệ kèo bóng đá tối nay tham chiếu quaDatum
Giá trị.
Là biểu diễn chuỗi bên ngoài của tỷ lệ kèo bóng đá tối nay, chúng tôi chọn một chuỗi của biểu mẫu(x, y)
.
Các hàm đầu vào và đầu ra thường không khó để viết, đặc biệt là chức năng đầu ra. Nhưng khi xác định biểu diễn chuỗi bên ngoài của tỷ lệ kèo bóng đá tối nay, hãy nhớ rằng cuối cùng bạn phải viết trình phân tích cú pháp hoàn chỉnh và mạnh mẽ cho biểu diễn đó làm chức năng đầu vào của bạn. Ví dụ:
pg_function_info_v1 (Complex_in); Mốc thời gian Complex_in (pg_function_args) char *str = pg_getarg_cstring (0); gấp đôi x, y; Phức tạp *kết quả; if (sscanf (str, "( %lf, %lf)", & x, & y)! = 2) ereport (lỗi, (errcode (errcode_invalid_text_representation), errmsg ("cú pháp đầu vào không hợp lệ cho tỷ lệ kèo bóng đá tối nay %s: \" %s \ "", "phức tạp", str))); result = (phức hợp *) palloc (sizeof (phức tạp)); Kết quả- x = x; kết quả- y = y; Pg_return_pulum (result);
Hàm đầu ra có thể chỉ là:
pg_function_info_v1 (Complex_out); Mốc thời gian Complex_out (pg_function_args) Phức hợp *phức tạp = (phức tạp *) pg_getarg_pulum (0); char *kết quả; result = psprintf ("(%g,%g)", phức tạp- x, phức tạp- y); Pg_return_cstring (kết quả);
Bạn nên cẩn thận để thực hiện tỷ lệ kèo bóng đá tối nay hàm đầu vào và đầu ra nghịch đảo của nhau. Nếu bạn không, bạn sẽ gặp vấn đề nghiêm trọng khi bạn cần gửi dữ liệu của mình vào một tệp và sau đó đọc lại. Đây là một vấn đề đặc biệt phổ biến khi có liên quan đến số điểm nổi.
Tùy chọn, tỷ lệ kèo bóng đá tối nay do người dùng xác định có thể cung cấp các thói quen đầu vào và đầu ra nhị phân. I/O nhị phân thường nhanh hơn nhưng ít di động hơn I/O văn bản. Như với I/O văn bản, tùy thuộc vào bạn để xác định chính xác biểu diễn nhị phân bên ngoài là gì. Hầu hết các tỷ lệ kèo bóng đá tối nay dữ liệu tích hợp cố gắng cung cấp biểu diễn nhị phân độc lập với máy. Vìphức tạp
, chúng tôi sẽ cõng trên các bộ chuyển đổi I/O nhị phân cho tỷ lệ kèo bóng đá tối nayfloat8
:
pg_function_info_v1 (Complex_Recv); Mốc thời gian Complex_Recv (pg_function_args) StringInfo buf = (StringInfo) pg_getArg_pulum (0); Phức tạp *kết quả; result = (phức hợp *) palloc (sizeof (phức tạp)); Kết quả- x = pq_getMSGFLOAT8 (BUF); kết quả- y = pq_getMSGFLOAT8 (BUF); Pg_return_pulum (result); Pg_function_info_v1 (Complex_send); Mốc thời gian Complex_Send (pg_function_args) Phức hợp *phức tạp = (phức tạp *) pg_getarg_pulum (0); StringInfodata buf; PQ_BegInTypsend (& buf); pq_sendfloat8 (& buf, phức tạp- x); pq_sendfloat8 (& buf, phức tạp- y); Pg_return_bytea_p (pq_endtypsend (& buf));
Một khi chúng tôi đã viết tỷ lệ kèo bóng đá tối nay hàm I/O và biên dịch chúng thành một thư viện dùng chung, chúng tôi có thể xác địnhphức tạp
tỷ lệ kèo bóng đá tối nay trong SQL. Đầu tiên chúng tôi khai báo nó là tỷ lệ kèo bóng đá tối nay shell:
Tạo tỷ lệ kèo bóng đá tối nay phức tạp;
Điều này đóng vai trò là người giữ chỗ cho phép chúng tôi tham chiếu tỷ lệ kèo bóng đá tối nay trong khi xác định các chức năng I/O của nó. Bây giờ chúng ta có thể xác định các chức năng I/O:
Tạo chức năng Complex_in (cString) Trả lại phức tạp BẰNG 'FileName
' Ngôn ngữ C bất biến nghiêm ngặt; Tạo chức năng Complex_out (phức tạp) Trả lại cstring BẰNG 'FileName
' Ngôn ngữ C bất biến nghiêm ngặt; Tạo chức năng Complex_Recv (nội bộ) Trả lại phức tạp BẰNG 'FileName
' Ngôn ngữ C bất biến nghiêm ngặt; Tạo chức năng Complex_Send (phức tạp) Trả lại bytea BẰNG 'FileName
' Ngôn ngữ C bất biến nghiêm ngặt;
Cuối cùng, chúng ta có thể cung cấp định nghĩa đầy đủ về kiểu dữ liệu:
Tạo tỷ lệ kèo bóng đá tối nay phức tạp ( InterlitalLight = 16, input = Complex_in, output = Complex_out, nhận = Complex_Recv, send = Complex_Send, Căn chỉnh = gấp đôi );
Khi bạn xác định tỷ lệ kèo bóng đá tối nay cơ sở mới,PostgreSQLTự động cung cấp hỗ trợ cho các mảng thuộc tỷ lệ kèo bóng đá tối nay đó. tỷ lệ kèo bóng đá tối nay mảng thường có cùng tên với tỷ lệ kèo bóng đá tối nay cơ sở với ký tự dấu gạch dưới (_
) Chuẩn bị.
Một khi tỷ lệ kèo bóng đá tối nay dữ liệu tồn tại, chúng ta có thể khai báo các chức năng bổ sung để cung cấp các hoạt động hữu ích trên kiểu dữ liệu. Các toán tử sau đó có thể được xác định trên đỉnh các chức năng và nếu cần, các lớp toán tử có thể được tạo để hỗ trợ lập chỉ mục của kiểu dữ liệu. Các lớp bổ sung này được thảo luận trong các phần sau.
Nếu biểu diễn bên trong của kiểu dữ liệu có độ dài thay đổi, biểu diễn bên trong phải tuân theo bố cục tiêu chuẩn cho dữ liệu có độ dài thay đổi: bốn byte đầu tiên phải làChar [4]
trường không bao giờ được truy cập trực tiếp (được đặt tên thông thườngVL_LEN_
). Bạn phải sử dụngset_varsize ()
Macro để lưu trữ tổng kích thước của mốc dữ liệu (bao gồm cả trường chiều dài) trong trường này vàvarsize ()
Để lấy nó. (tỷ lệ kèo bóng đá tối nay macro này tồn tại vì trường Độ dài có thể được mã hóa tùy thuộc vào nền tảng.)
Để biết thêm chi tiết, hãy xem mô tả củaPostgreSQL: Tài liệu: 17:lệnh.
Nếu tỷ lệ kèo bóng đá tối nay giá trị của kiểu dữ liệu của bạn khác nhau về kích thước (ở dạng nội bộ), thì thường mong muốn tạo kiểu dữ liệuPostgresql: Tài-Able (xemPhần 65.2). Bạn nên làm điều này ngay cả khi tỷ lệ kèo bóng đá tối nay giá trị luôn quá nhỏ để được nén hoặc lưu trữ bên ngoài, vìbánh mì nướngcũng có thể tiết kiệm không gian trên dữ liệu nhỏ, bằng cách giảm chi phí tiêu đề.
Để hỗ trợbánh mì nướngLưu trữ, tỷ lệ kèo bóng đá tối nay hàm C hoạt động trên kiểu dữ liệu phải luôn cẩn thận để giải nén bất kỳ giá trị nào được nướng mà chúng được trao bằng cách sử dụngpg_detoast_datum
. (Chi tiết này được ẩn theo thông thường bằng cách xác định tỷ lệ kèo bóng đá tối nay cụ thểgetarg_datatype_p
Macros.) Sau đó, khi chạyTạo tỷ lệ kèo bóng đá tối nay
Lệnh, chỉ định độ dài bên trong làbiến
và chọn một số tùy chọn lưu trữ phù hợp kháctrơn
.
Nếu căn chỉnh dữ liệu là không quan trọng (chỉ cho một hàm cụ thể hoặc vì kiểu dữ liệu chỉ định căn chỉnh byte bằng mọi cách) thì có thể tránh được một số chi phí củapg_detoast_datum
. Bạn có thể sử dụngpg_detoast_datum_packed
Thay vào đó (theo thông thường được ẩn bằng cách tỷ lệ kèo bóng đá tối nayGetArg_Datatype_pp
Macro) và sử dụng macroVarsize_any_exhdr
vàVardata_any
Để truy cập một mốc dữ liệu có khả năng đóng gói. Một lần nữa, dữ liệu được trả về bởi tỷ lệ kèo bóng đá tối nay macro này không được căn chỉnh ngay cả khi định nghĩa kiểu dữ liệu chỉ định căn chỉnh. Nếu căn chỉnh là quan trọng, bạn phải trải qua thông thườngpg_detoast_datum
Giao diện.
Mã cũ thường xuyên khai báoVL_LEN_
như mộtINT32
trường thay vìChar [4]
. Điều này ổn miễn là định nghĩa cấu trúc có tỷ lệ kèo bóng đá tối nay trường khác có ít nhấtINT32
Căn chỉnh. Nhưng thật nguy hiểm khi sử dụng một định nghĩa cấu trúc như vậy khi làm việc với một mốc dữ liệu có khả năng không được sắp xếp; Trình biên dịch có thể lấy nó làm giấy phép để giả sử Datum thực sự được căn chỉnh, dẫn đến tỷ lệ kèo bóng đá tối nay kết xuất cốt lõi trên tỷ lệ kèo bóng đá tối nay kiến trúc nghiêm ngặt về căn chỉnh.
Một tính năng khác được kích hoạt bởibánh mì nướngHỗ trợ là khả năng cóMở rộngBiểu diễn dữ liệu trong bộ nhớ thuận tiện hơn để làm việc với định dạng được lưu trữ trên đĩa. Thông thường hoặcHồiFlatKhănĐịnh dạng lưu trữ Varlena cuối cùng chỉ là một đốm byte; Ví dụ, nó không thể chứa con trỏ, vì nó có thể được sao chép vào các vị trí khác trong bộ nhớ. Đối với các tỷ lệ kèo bóng đá tối nay dữ liệu phức tạp, định dạng phẳng có thể khá tốn kém để làm việc, vì vậyPOSTGRESQLCung cấp một cách đểHồiMở rộngĐịnh dạng phẳng thành một biểu diễn phù hợp hơn với tính toán và sau đó chuyển định dạng đó trong bộ nhớ giữa tỷ lệ kèo bóng đá tối nay hàm của kiểu dữ liệu.
Để sử dụng lưu trữ mở rộng, kiểu dữ liệu phải xác định định dạng mở rộng tuân theo tỷ lệ kèo bóng đá tối nay quy tắc được đưa ra trongsrc/bao gồm/elils/expandeddatum.h
, và cung cấp tỷ lệ kèo bóng đá tối nay chức năng choMở rộngHồiGiá trị varlena phẳng thành định dạng mở rộng vàFlattenHồiĐịnh dạng mở rộng trở lại biểu diễn Varlena thông thường. Sau đó đảm bảo rằng tất cả tỷ lệ kèo bóng đá tối nay chức năng C cho kiểu dữ liệu có thể chấp nhận biểu diễn, có thể bằng cách chuyển đổi một chức năng khác ngay khi nhận được. Điều này không yêu cầu sửa tất cả tỷ lệ kèo bóng đá tối nay chức năng hiện có cho kiểu dữ liệu cùng một lúc, vì tiêu chuẩnpg_detoast_datum
Macro được xác định để chuyển đổi đầu vào mở rộng thành định dạng phẳng thông thường. Do đó, tỷ lệ kèo bóng đá tối nay chức năng hiện có hoạt động với định dạng Varlena phẳng sẽ tiếp tục hoạt động, mặc dù hơi kém hiệu quả, với tỷ lệ kèo bóng đá tối nay đầu vào mở rộng; Chúng không cần phải được chuyển đổi cho đến khi và trừ khi hiệu suất tốt hơn là quan trọng.
C Các chức năng biết cách làm việc với biểu diễn mở rộng thường rơi vào hai tỷ lệ kèo bóng đá tối nay: các chức năng chỉ có thể xử lý định dạng mở rộng và các tỷ lệ kèo bóng đá tối nay có thể xử lý các đầu vào varlena mở rộng hoặc phẳng. Cái trước dễ viết hơn nhưng có thể kém hiệu quả hơn, bởi vì việc chuyển đổi đầu vào phẳng sang hình thức mở rộng để sử dụng bởi một hàm duy nhất có thể có giá cao hơn được lưu bằng cách vận hành trên định dạng mở rộng. Khi chỉ cần xử lý định dạng mở rộng, việc chuyển đổi các đầu vào phẳng sang dạng mở rộng có thể được ẩn bên trong một macro tìm kiếm đối số, do đó chức năng dường như không phức tạp hơn một hoạt động với đầu vào Varlena truyền thống. Để xử lý cả hai tỷ lệ kèo bóng đá tối nay đầu vào, hãy viết một chức năng tìm kiếm đối số sẽ kích hoạt các đầu vào bên ngoài, đầu ngắn và đầu vào varlena được nén, nhưng không mở rộng đầu vào. Một chức năng như vậy có thể được định nghĩa là trả lại một con trỏ về một liên kết của định dạng varlena phẳng và định dạng mở rộng. Người gọi có thể sử dụngVARATT_IS_EXPANDS_HEADER ()
Macro để tỷ lệ kèo bóng đá tối nay định dạng nào họ nhận được.
Thebánh mì nướngCơ sở hạ tầng không chỉ cho phép tỷ lệ kèo bóng đá tối nay giá trị varlena thông thường được phân biệt với tỷ lệ kèo bóng đá tối nay giá trị mở rộng, mà còn phân biệtRead-WriteHồivàHồiChỉ đọcHồiCon trỏ đến các giá trị mở rộng. C Các chức năng chỉ cần kiểm tra giá trị mở rộng hoặc sẽ chỉ thay đổi nó theo những cách an toàn và không có thể xem xét, không cần quan tâm đến tỷ lệ kèo bóng đá tối nay con trỏ nào họ nhận được. Các chức năng tạo ra phiên bản sửa đổi của giá trị đầu vào được phép sửa đổi giá trị đầu vào mở rộng tại chỗ nếu chúng nhận được một con trỏ đọc-viết, nhưng không được sửa đổi đầu vào nếu chúng nhận được một con trỏ chỉ đọc; Trong trường hợp đó, họ phải sao chép giá trị trước, tạo ra một giá trị mới để sửa đổi. Một hàm C đã xây dựng một giá trị mở rộng mới phải luôn luôn trả về một con trỏ đọc-viết cho nó. Ngoài ra, một hàm C đang sửa đổi giá trị mở rộng đọc-write tại chỗ sẽ cẩn thận để lại giá trị ở trạng thái lành mạnh nếu nó thất bại trong suốt.
Để biết tỷ lệ kèo bóng đá tối nay ví dụ về làm việc với tỷ lệ kèo bóng đá tối nay giá trị mở rộng, hãy xem cơ sở hạ tầng mảng tiêu chuẩn, đặc biệtsrc/backend/utils/adt/mảng_expanding.c
.
Nếu bạn thấy bất cứ điều gì trong tài liệu không chính tỷ lệ kèo bóng đá tối nay, không khớp Kinh nghiệm của bạn với tính năng cụ thể hoặc yêu cầu làm rõ thêm, Vui lòng sử dụngMẫu nàyĐể báo cáo vấn đề tài liệu.