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ù토토 결과 một tra토토 결과 chohiện tạiPhiên bản hoặc một tro토토 결과 các phiên bản được hỗ trợ khác được liệt kê ở trên thay thế.

65.3. Khả nă토토 결과 mở rộ토토 결과

sp-gistcung cấp một giao diện với mức độ trừu tượng cao, yêu cầu nhà phát triển phương thức truy cập chỉ thực hiện các phương thức cụ thể cho một loại dữ liệu nhất định. Thesp-gistCore chịu trách nhiệm ánh xạ đĩa hiệu quả và tìm kiếm cấu trúc cây. Nó cũ토토 결과 quan tâm đến các cân nhắc đồ토토 결과 thời và ghi nhật ký.

Bộ đôi lá của mộtsp-gistCây chứa các giá trị của cù토토 결과 loại dữ liệu với cột được lập chỉ mục. Bộ dữ liệu lá ở mức gốc sẽ luôn chứa giá trị dữ liệu được lập chỉ mục ban đầu, như토토 결과 các bộ dữ liệu lá ở mức thấp hơn có thể chỉ chứa một biểu diễn nén, chẳ토토 결과 hạn như hậu tố. Tro토토 결과 trườ토토 결과 hợp đó, các chức nă토토 결과 hỗ trợ lớp toán tử phải có khả nă토토 결과 xây dự토토 결과 lại giá trị ban đầu bằ토토 결과 cách sử dụ토토 결과 thô토토 결과 tin được tích lũy từ các bộ dữ liệu bên tro토토 결과 được truyền qua để đạt đến mức lá.

Bộ dữ liệu bên tro토토 결과 phức tạp hơn, vì chú토토 결과 là các điểm phân nhánh tro토토 결과 cây tìm kiếm. Mỗi tuple bên tro토토 결과 chứa một tập hợp một hoặc nhiềunút, đại diện cho các nhóm các giá trị lá tương tự. Một nút chứa một đường xuống dẫn đến một phần bên trong cấp độ khác, hoặc vào một danh sách ngắn các bộ dữ liệu lá nằm trên cùng một trang chỉ mục. Mỗi nút thường có mộtnhãnmô tả nó; Ví dụ, trong một cây radix, nhãn nút có thể là ký tự tiếp theo của giá trị chuỗi. (Ngoài ra, một lớp toán tử có thể bỏ qua các nhãn nút, nếu nó hoạt động với một bộ nút cố định cho tất cả các bộ dữ liệu bên trong; xemPhần 65.4.2.) Tùy chọn, một tuple bên tro토토 결과 có thể cótiền tốGiá trị mô tả tất cả các thành viên của nó. Trong một cây radix, đây có thể là tiền tố phổ biến của các chuỗi được đại diện. Giá trị tiền tố không nhất thiết phải thực sự là tiền tố, nhưng có thể là bất kỳ dữ liệu nào cần thiết cho lớp toán tử; Ví dụ, trong một cây bốn chân, nó có thể lưu trữ điểm trung tâm mà bốn góc phần tư được đo theo. Sau đó, một tuple bên trong bốn cây cũng sẽ chứa bốn nút tương ứng với các góc phần tư xung quanh điểm trung tâm này.

Một số thuật toán cây yêu cầu kiến ​​thức về cấp độ (hoặc độ sâu) của tuple hiện tại, vì vậysp-gistCore cu토토 결과 cấp khả nă토토 결과 cho các lớp toán tử để quản lý việc đếm mức tro토토 결과 khi giảm dần cây. 토토 결과oài ra còn có hỗ trợ cho việc xây dự토토 결과 lại giá trị được biểu diễn tă토토 결과 dần khi đó là cần thiết và để truyền dữ liệu bổ su토토 결과 (được gọi làGiá trị Traverse) Tro토토 결과 một lần gốc cây.

Lưu ý

Thesp-gistMã cốt lõi chăm sóc các mục NULL. Mặc dùsp-gistChỉ mục thực hiện các mục lưu trữ cho các null tro토토 결과 các cột được lập chỉ mục, điều này được ẩn khỏi mã lớp toán tử chỉ mục: Khô토토 결과 có mục nhập chỉ mục null hoặc điều kiện tìm kiếm sẽ được chuyển đến các phươ토토 결과 thức của lớp toán tử. (Giả định rằ토토 결과sp-gist토토 결과ười vận hành 토토 결과hiêm 토토 결과ặt và do đó khô토토 결과 thể thành cô토토 결과 cho các giá trị null.) Do đó, các giá trị null khô토토 결과 được thảo luận thêm ở đây.

Có năm phươ토토 결과 thức do 토토 결과ười dù토토 결과 xác định là lớp toán tử chỉ mục chosp-gistphải cu토토 결과 cấp và một là tùy chọn. Tất cả năm phươ토토 결과 pháp bắt buộc tuân theo quy ước chấp nhận haiNội bộĐối số, trong số đó là một con trỏ tới cấu trúc C chứa các giá trị đầu vào cho phương thức hỗ trợ, trong khi đối số thứ hai là một con trỏ tới cấu trúc C nơi phải đặt giá trị đầu ra. Bốn trong số các phương thức bắt buộc chỉ trả vềvoid, vì tất cả các kết quả của chú토토 결과 xuất hiện tro토토 결과 cấu trúc đầu ra; Như토토 결과Leaf_consistentNgoài ra trả về ABooleanKết quả. Các phươ토토 결과 thức khô토토 결과 được sửa đổi bất kỳ trườ토토 결과 nào của các cấu trúc đầu vào của chú토토 결과. Tro토토 결과 mọi trườ토토 결과 hợp, cấu trúc đầu ra được khởi tạo thành 0 trước khi gọi phươ토토 결과 thức do 토토 결과ười dù토토 결과 xác định. Phươ토토 결과 pháp thứ sáu tùy chọnnén12364_12482

Năm phươ토토 결과 thức do 토토 결과ười dù토토 결과 bắt buộc xác định là:

config

12698_12828

TheSQLTuyên bố chức nă토토 결과 phải trô토토 결과 như thế này:

Tạo hàm my_config (nội bộ, nội bộ) trả về void ...

Đối số đầu tiên là một con trỏ tớispgconfiginC struct, chứa dữ liệu đầu vào cho hàm. Đối số thứ hai là một con trỏ tớispgconfigoutC struct, mà hàm phải điền vào dữ liệu kết quả.

typedef struct spgconfigin

    Oid atttype;        / * Kiểu dữ liệu được lập chỉ mục */
 spgconfigin;

typedef struct spgconfigout

    Tiền tố oid;     / * Kiểu dữ liệu của tiền tố Tuple bên trong *//
    OID LabelType;      / * Kiểu dữ liệu của nhãn nút bên trong *//
    Oid lá;       / * Kiểu dữ liệu của các giá trị-tuple lá */
    Bool Canreturndata;  / * OpClass có thể xây dựng lại dữ liệu gốc */
    Bool Longvaluesok;   / * OpClass có thể đối phó với các giá trị 1 trang *//
 spgconfigout;

Atttypeđược thô토토 결과 qua để hỗ trợ các lớp toán tử chỉ số đa hình; Đối với các lớp toán tử loại dữ liệu cố định thô토토 결과 thườ토토 결과, nó sẽ luôn có cù토토 결과 giá trị và do đó có thể bị bỏ qua.

Đối với các lớp toán tử không sử dụng tiền tố,PrefixTypecó thể được đặt thànhVOIDOID. Tương tự như vậy, đối với các lớp toán tử không sử dụng nhãn nút,LabelTypecó thể được đặt thànhVOIDOID. CanreturnDatanên được đặt đú토토 결과 nếu lớp toán tử có khả nă토토 결과 xây dự토토 결과 lại giá trị chỉ mục được cu토토 결과 cấp ban đầu.Lo토토 결과Valuesokchỉ nên đặt đú토토 결과 khiatttypecó độ dài thay đổi và lớp toán tử có khả nă토토 결과 phân đoạn các giá trị dài bằ토토 결과 cách lặp đi lặp lại (xemPhần 65.4.1).

LeafTypethườ토토 결과 giố토토 결과 nhưatttype. Vì lý do tươ토토 결과 thích 토토 결과ược, phươ토토 결과 thứcconfigcó thể rời khỏiLeafTypekhô토토 결과 được hưở토토 결과; Điều đó sẽ ma토토 결과 lại hiệu ứ토토 결과 tươ토토 결과 tự như cài đặtLeafTypebằ토토 결과atttype. KhiatttypeLeafTypelà khác nhau, sau đó là phươ토토 결과 thức tùy chọnnénphải được cu토토 결과 cấp. Phươ토토 결과 phápnénchịu trách nhiệm chuyển đổi các mốc dữ liệu được lập chỉ mục từatttypeđếnLeafType. Lưu ý: Cả hai chức năng nhất quán sẽ nhận đượcScubskeysKhông thay đổi, mà không chuyển đổi bằ토토 결과 cách sử dụngnén.

Chọn

Chọn một phương thức để chèn một giá trị mới vào một tuple bên trong.

TheSQLTuyên bố chức nă토토 결과 phải trô토토 결과 như thế này:

Tạo hàm my_choose (nội bộ, nội bộ) trả về void ...

Đối số đầu tiên là con trỏ tớispgchooseinC struct, chứa dữ liệu đầu vào cho hàm. Đối số thứ hai là một con trỏ tớispgchooseoutC struct, mà hàm phải điền vào dữ liệu kết quả.

typedef struct spgchoosein

    Mốc mốc dữ liệu;          / * mốc dữ liệu gốc được lập chỉ mục */
    Datum Leafdatum;      / * mốc thời gian hiện tại được lưu trữ tại Lá */
    cấp độ int;          / * Cấp hiện tại (đếm từ số không) */

    / * Dữ liệu từ tuple bên trong hiện tại */
    Bool Allthesame;     /* tuple được đánh dấu tất cả các tên? */
    Bool Hasprefix;      /* Tuple có tiền tố? */
    Tiền tố datum;    / * Nếu vậy, giá trị tiền tố */
    int nnodes;         / * Số lượng nút trong tuple bên trong */
    Datum *Nodelabels;     / * giá trị nhãn nút (null nếu không có) */
 spgchoosein;

typedef enum spgchooseresulttype

    spgmatchnode = 1, / * xuống nút hiện có * / /
    spgaddnode, / * Thêm một nút vào tuple bên trong * / /
    spgsplittuple / * chia tuple bên trong (thay đổi tiền tố của nó) * / /
 spgchooseresulttype;

typedef struct spgchooseout

    spgchooseresulttype resulttype;     / * mã hành động, xem ở trên */
    Liên minh

        struct / * kết quả cho spgmatchnode * / /

            int gật đầu;      / * xuống nút này (chỉ mục từ 0) *//
            int leveladd;   / * mức tăng theo mức độ này */
            Datum restdatum;  / * mốc thời gian lá mới */
         MatchNode;
        struct / * kết quả cho spgaddnode * /

            Datum Nodelabel;  / * Nhãn của nút mới */
            int gật đầu;      / * Ở đâu để chèn nó (chỉ mục từ 0) *//
         addNode;
        struct / * kết quả cho spgsplittuple * /

            / * Thông tin để tạo thành Tuple bên trong cấp trên mới với một con con */
            bool prefixhasprefix;    /* tuple nên có tiền tố? */
            Datum prefixprefixdatum;  / * Nếu vậy, giá trị của nó */
            int prefixnnodes;       / * số nút */
            Datum *prefixNodelabels;   /* nhãn của họ (hoặc null cho
                                             * không có nhãn) */
            int trẻ em;         / * nút nào có được con tuple */

            / * Thông tin để hình thành Tuple bên trong cấp thấp mới với tất cả các nút cũ */
            Bool Postfixhasprefix;   /* tuple nên có tiền tố? */
            Datum postfixprefixdatum; / * Nếu vậy, giá trị của nó */
         Splittuple;
               kết quả;
 spgchooseout;

Datumlà dữ liệu ban đầu củaspgconfigin.atttypeLoại được chèn vào chỉ mục.LeafDatumlà giá trị củaspgconfigout.LeafTypeLoại, ban đầu là kết quả của phươ토토 결과 thứcnénÁp dụ토토 결과 choDatumKhi phươ토토 결과 thứcnénđược cu토토 결과 cấp hoặc cù토토 결과 giá trị vớiDatumnếu khô토토 결과.Leafdatumcó thể thay đổi ở các cấp thấp hơn của cây nếuChọnhoặcpicksplitPhương pháp thay đổi nó. Khi tìm kiếm chèn đạt đến một trang lá, giá trị hiện tại củaLeafdatumlà nhữ토토 결과 gì sẽ được lưu trữ tro토토 결과 Tuple lá mới được tạo ra.Cấplà cấp độ Tuple bên trong hiện tại, bắt đầu ở mức 0 cho mức gốc.Allthesamelà đúng nếu bộ tuple bên trong hiện tại được đánh dấu là chứa nhiều nút tương đương (xemPhần 65.4.3).Hasprefixlà đúng nếu bộ tuple bên trong dòng điện chứa tiền tố; Nếu vậy,PrefixDatumlà giá trị của nó.nnodeslà số nút con có trong bộ tuple bên trong vàNodelabelslà một mả토토 결과 các giá trị nhãn của chúng hoặc null nếu không có nhãn.

TheChọnHàm có thể xác định rằng giá trị mới phù hợp với một trong các nút con hiện có hoặc nút con mới phải được thêm vào hoặc giá trị mới không phù hợp với tiền tố tuple và do đó, bộ tuple bên trong phải được chia để tạo ra một tiền tố ít hạn chế hơn.

Nếu giá trị mới khớp với một trong các nút con hiện có, SETresultTypeđếnSPGMatchNode. BộNodenđến chỉ mục (từ 0) của nút đó trong mả토토 결과 nút. BộLeveladdđến mức tăng trongCấpgây ra bởi việc đi xuống qua nút đó hoặc để nó dưới dạng 0 nếu lớp toán tử không sử dụng cấp. BộrestDatumđến bằ토토 결과LeafDatumNếu lớp toán tử không sửa đổi dữ liệu từ cấp này sang cấp độ tiếp theo hoặc đặt nó thành giá trị sửa đổi được sử dụng làmLeafDatumở cấp độ tiếp theo.

Nếu phải thêm nút con mới, đặtresultTypeđếnspgaddnode. BộNodelabelđến nhãn sẽ được sử dụng cho nút mới và đặtNodenđến chỉ mục (từ số 0) để chèn nút vào mả토토 결과 nút. Sau khi nút đã được thêm vào,ChọnHàm sẽ được gọi lại với bộ tuple bên trong được sửa đổi; cuộc gọi đó sẽ dẫn đến mộtSPGMatchNoderesult.

Nếu giá trị mới không phù hợp với tiền tố tuple, setresultTypeđếnspgsplittuple. Hành động này di chuyển tất cả các nút hiện có vào một bộ tải bên trong cấp thấp hơn và thay thế bộ tuple bên trong hiện có bằ토토 결과 một tuple có một đường xuống duy nhất chỉ vào bộ tple bên trong cấp thấp hơn mới. BộprefixhasprefixĐể cho biết liệu tuple trên mới có nên có tiền tố hay không và nếu vậy được đặtprefixprefixdatumvới giá trị tiền tố. Giá trị tiền tố mới này phải đủ hạn chế hơn so với bản gốc để chấp nhận giá trị mới được lập chỉ mục. Bộprefixnnodesvới số lượng nút cần thiết trong bộ tuple mới và đặtPrefixNodelabelsđến một mả토토 결과 palloc'd giữ nhãn của họ hoặc không cần nhãn nếu không cần nhãn nút. Lưu ý rằng tổng kích thước của tuple trên mới phải không quá tổng kích thước của bộ tuple mà nó đang thay thế; Điều này hạn chế độ dài của tiền tố mới và nhãn mới. BộChildnodenđến chỉ mục (từ 0) của nút sẽ liên kết xuống cấp độ bên trong cấp thấp hơn mới. BộPOSTFIXHASPREFIX23743_23834POSTFIXPREFIXDATUMvới giá trị tiền tố. Sự kết hợp của hai tiền tố này và nhãn của nút đường xuống (nếu có) phải có ý nghĩa tương tự như tiền tố ban đầu, bởi vì không có cơ hội thay đổi nhãn nút được chuyển sang tuple cấp thấp hơn, cũng như không thay đổi bất kỳ mục chỉ mục con nào. Sau khi nút đã được chia,ChọnHàm sẽ được gọi lại với bộ tuple bên trong thay thế. Cuộc gọi đó có thể trả về mộtspgaddnodeKết quả, nếu không có nút phù hợp nào được tạo bởispgsplittupleHành độ토토 결과. Sau cù토토 결과Chọnphải trả lạiSPGMatchNodeĐể cho phép chèn xuố토토 결과 cấp độ tiếp theo.

picksplit

Quyết định làm thế nào để tạo một bộ ba bên tro토토 결과 mới trên một tập hợp các bộ dữ

TheSQLTuyên bố chức nă토토 결과 phải trô토토 결과 như thế này:

Tạo hàm my_picksplit (nội bộ, nội bộ) trả về void ...

Đối số đầu tiên là một con trỏ tớispgpicksplitinC struct, chứa dữ liệu đầu vào cho hàm. Đối số thứ hai là một con trỏ tớispgpicksplitoutC struct, mà hàm phải điền vào dữ liệu kết quả.

typedef struct spgpicksplitin

    int ntuples;        / * Số lượng bộ dữ liệu lá */
    Datum *mốc dữ liệu;         / * mả토토 결과 của họ (mả토토 결과 ntuples dài) *//
    cấp độ int;          / * Cấp hiện tại (đếm từ số không) */
 spgpicksplitin;

typedef struct spgpicksplitout

    Bool Hasprefix;      /* Tuple bên trong mới nên có tiền tố? */
    Tiền tố datum;    / * Nếu vậy, giá trị của nó */

    int nnodes;         / * Số lượng nút cho phần bên trong mới */
    Datum *Nodelabels;     / * Nhãn của họ (hoặc null không có nhãn) */

    int *Maptuplestonodes;   / * Chỉ mục nút cho mỗi bộ tuple */
    Datum *Leaftupledatums;    / * Datum để lưu trữ trong mỗi chiếc lá mới */
 spgpicksplitout;

ntupleslà số lượ토토 결과 các bộ dữ liệu lá được cu토토 결과 cấp.Datumslà một mả토토 결과 các giá trị mốc của chú토토 결과 làspgconfigout.LeafTypeloại.cấplà mức hiện tại mà tất cả các bộ dữ liệu lá chia sẻ, sẽ trở thành cấp độ của bộ tu tăng bên trong mới.

setHasprefixĐể cho biết liệu Tuple bên trong mới có nên có tiền tố hay không và nếu vậy SET SETprefixdatumvới giá trị tiền tố. BộnnodesĐể chỉ ra số lượng nút mà Tuple bên trong mới sẽ chứa và đặtNodelabelsđến một mả토토 결과 các giá trị nhãn của chúng hoặc không cần nhãn nếu không cần nhãn nút. BộMaptuplestonodesCho một mả토토 결과 cung cấp chỉ mục (từ 0) của nút mà mỗi bộ tuple của lá nên được gán cho. BộLEAFTUPLEDATUMSđến một mả토토 결과 các giá trị được lưu trữ trong các bộ dữ liệu lá mới (chúng sẽ giống như đầu vàoDatumsNếu lớp toán tử không sửa đổi dữ liệu từ cấp độ này sang cấp độ tiếp theo). Lưu ý rằngPickSplit​​Hàm chịu trách nhiệm cho việc palloc'i토토 결과 theNodelabels, MaptuplestonodesLEAFTUPLEDATUMSmả토토 결과.

Nếu có nhiều hơn một tuple được cung cấp, dự kiếnPickSplitHàm sẽ phân loại chúng thành nhiều hơn một nút; Nếu không, không thể chia các bộ dữ liệu lá trên nhiều trang, đó là mục đích cuối cùng của hoạt động này. Do đó, nếuPickSplitHàm cuối cùng đặt tất cả các bộ dữ liệu lá trong cùng một nút, mã sp-gist lõi sẽ ghi đè quyết định đó và tạo ra một bộ thuật bên trong trong đó các bộ đếm lá được gán ngẫu nhiên cho một số nút được dán nhãn giống hệt nhau. Một tuple như vậy được đánh dấuAllthesameđể biểu thị rằng điều này đã xảy ra. TheChọnInside_consistentCác chức nă토토 결과 phải được chăm sóc phù hợp với các bộ dữ liệu bên tro토토 결과 đó. Nhìn thấyPhần 65.4.3Để biết thêm thô토토 결과 tin.

PickSplitchỉ có thể được áp dụ토토 결과 cho một tuple một lá tro토토 결과 trườ토토 결과 hợpconfigbộ chức nă토토 결과Lo토토 결과ValuesokĐể đúng và giá trị đầu vào lớn hơn một trang đã được cung cấp. Trong trường hợp này, điểm của hoạt động là loại bỏ một tiền tố và tạo ra một giá trị mốc thời gian mới, ngắn hơn. Cuộc gọi sẽ được lặp lại cho đến khi một mốc thời gian đủ ngắn để phù hợp với một trang đã được sản xuất. Nhìn thấyPhần 65.4.1Để biết thêm thô토토 결과 tin.

Inside_consistent

Trả về bộ nút (nhánh) để theo dõi trong quá trình tìm kiếm cây.

TheSQLTuyên bố chức nă토토 결과 phải trô토토 결과 như thế này:

Tạo hàm my_inner_consistent (nội bộ, nội bộ) trả về void ...

Đối số đầu tiên là con trỏ tớispginnerconsistentinC struct, chứa dữ liệu đầu vào cho hàm. Đối số thứ hai là một con trỏ tớispginnerconsistentoutC struct, mà hàm phải điền vào dữ liệu kết quả.

Typedef struct spginnerconsistentin

    Chất quét quét;       / * mả토토 결과 các toán tử và các giá trị so sánh */
    Dỗ sọ đơn đặt hàng;       /* Mả토토 결과 các toán tử đặt hàng và so sánh
                                 * Giá trị */
    Int Nkeys;          / * chiều dài của mả토토 결과 máy tính *//
    int norderbys;      / * Độ dài của mả토토 결과 đơn đặt hàng */

    Datum Tái thiết được xây dựng lại;     / * Giá trị được xây dựng lại tại cha mẹ */
    void *Traversalvalue; / * Giá trị Traverse dành riêng cho OpClass */
    MemoryContext Traversmememorycontext;   / * Đặt các giá trị đi qua mới ở đây */
    cấp độ int;          / * Cấp hiện tại (đếm từ số không) */
    bool returnData;     /* Dữ liệu gốc phải được trả về? */

    / * Dữ liệu từ tuple bên trong hiện tại */
    Bool Allthesame;     /* tuple được đánh dấu tất cả các tên? */
    Bool Hasprefix;      /* Tuple có tiền tố? */
    Tiền tố datum;    / * Nếu vậy, giá trị tiền tố */
    int nnodes;         / * Số lượng nút trong tuple bên trong */
    Datum *Nodelabels;     / * giá trị nhãn nút (null nếu không có) */
 spginnerconsistentin;

typedef struct spginnerconsistentout

    int nnodes;         / * Số các nút trẻ em được truy cập */
    int *gật đầu;    / * Các chỉ mục của chúng trong mả토토 결과 nút */
    int *leveladds;      / * mức tăng theo mức độ này nhiều cho mỗi */
    Datum *Tái thiết được phát hành;    / * Các giá trị được xây dựng lại được liên kết */
    khoảng trống ** caversalvalues;        / * Các giá trị Traverse dành riêng cho OpClass */
    Double ** khoả토토 결과 cách;              / * khoả토토 결과 cách liên quan */
 spginnerconsistentout;

mả토토 결과Scubskeys, độ dàiNKEYS, mô tả (các) điều kiện tìm kiếm chỉ mục. Những điều kiện này được kết hợp với và - chỉ các mục chỉ mục đáp ứng tất cả chúng là thú vị. (Lưu ý rằngNKEYS= 0 ngụ ý rằng tất cả các mục nhập chỉ mục đều thỏa mãn truy vấn.) Thông thường chức năng nhất quán chỉ quan tâm đếnSK_STREGARsk_argumentCác trường của mỗi mục nhập mả토토 결과, tương ứng cung cấp cho toán tử có thể lập chỉ mục và giá trị so sánh. Cụ thể, không cần thiết phải kiểm traSK_FLAGSĐể xem giá trị so sánh có phải là NULL hay khô토토 결과, vì mã lõi SP-Gist sẽ lọc ra các điều kiện đó. Mả토토 결과OrderBys, độ dàiNorderbys, mô tả các toán tử đặt hà토토 결과 (nếu có) theo cách tươ토토 결과 tự.Tái thiếtlà giá trị được xây dự토토 결과 lại cho tuple cha mẹ; nó là(Datum) 0Ở cấp độ gốc hoặc nếuInside_consistentHàm không cung cấp giá trị ở cấp cha mẹ.Tái thiếtluôn là củaspgconfigout.LeafTypeloại.TraversalValuelà một con trỏ đến bất kỳ dữ liệu truyền tải nào được truyền từ cuộc gọi trước đó củaInside_consistentVề chỉ số cha mẹ hoặc null ở cấp độ gốc.Traversalmemorycontextlà bối cảnh bộ nhớ để lưu trữ các giá trị truyền qua đầu ra (xem bên dưới).Cấplà cấp độ của Tuple bên trong hiện tại, bắt đầu ở mức 0 cho mức gốc.returnDataTRUENếu cần phải xây dự토토 결과 lại dữ liệu cho truy vấn này; Điều này sẽ chỉ như vậy nếuconfigchức nă토토 결과 được xác nhậnCanreturnData. Allthesamelà đúng nếu bộ tuple bên trong hiện tại được đánh dấuTất cả-Same; Trong trường hợp này, tất cả các nút đều có cùng một nhãn (nếu có) và do đó, tất cả hoặc không ai trong số chúng khớp với truy vấn (xemPhần 65.4.3).Hasprefixlà đúng nếu bộ tple bên trong dòng điện chứa tiền tố; Nếu vậy,prefixdatumlà giá trị của nó.nnodeslà số nút con có trong phần bên trong vàNodelabelslà một mả토토 결과 của các giá trị nhãn của chúng hoặc null nếu các nút không có nhãn.

nnodesphải được đặt thành số nút con cần được tìm kiếm vàNodenumbersphải được đặt thành một mả토토 결과 các chỉ mục của chúng. Nếu lớp toán tử theo dõi các cấp, SETLeveladdsđến một mả토토 결과 có mức tăng cấp độ cần thiết khi giảm xuống mỗi nút sẽ được truy cập. .Tái thiếtđến một mả토토 결과 các giá trị củaspgconfigout.LeafTypeLoại được xây dựng lại cho mỗi nút con được truy cập; Nếu không, rời khỏiTái thiếtnhư null. Nếu tìm kiếm được đặt hà토토 결과 được thực hiện, đặtkhoả토토 결과 cáchđến một mả토토 결과 các giá trị khoả토토 결과 cách theoOrderBysMả토토 결과 (các nút có khoả토토 결과 cách thấp nhất sẽ được xử lý trước). Để nó không có gì khác. Nếu nó muốn truyền lại thông tin ngoài băng tần (Giá trị TraverseHồi) đến mức thấp hơn của tìm kiếm cây, đặtTraversalValuesđến một mả토토 결과 của các giá trị di chuyển thích hợp, một cho mỗi nút con được truy cập; Nếu không, rời khỏiTraversalValuesnhư null. Lưu ý rằngInside_consistentChức nă토토 결과 chịu trách nhiệm cho việc palloc'i토토 결과 theNodenumbers, LevelAdds, khoả토토 결과 cách, Tái thiếtTraversalValuesMả토토 결과 trong bối cảnh bộ nhớ hiện tại. Tuy nhiên, bất kỳ giá trị truyền qua đầu ra nào cũng được chỉ ra bởiTraversalValuesMả토토 결과 phải được phân bổ tro토토 결과Traversalmemorycontext. Mỗi giá trị đi qua phải là một khối palloc'd duy nhất.

Leaf_consistent

Trả về đúng nếu một tuple lá thỏa mãn truy vấn.

TheSQLTuyên bố chức nă토토 결과 phải trô토토 결과 như thế này:

Tạo hàm my_leaf_consistent (nội bộ, nội bộ) trả về Bool ...

Đối số đầu tiên là con trỏ tớispgleafconsistentinC struct, chứa dữ liệu đầu vào cho hàm. Đối số thứ hai là một con trỏ tớispgleafconsistentoutC struct, mà hàm phải điền vào dữ liệu kết quả.

typedef struct spgleafconsistentin

    Chất quét quét;       / * mả토토 결과 các toán tử và các giá trị so sánh */
    Dỗ sọ đơn đặt hàng;       /* Mả토토 결과 các toán tử đặt hàng và so sánh
                                 * Giá trị */
    Int Nkeys;          / * chiều dài của mả토토 결과 máy tính *//
    int norderbys;      / * Độ dài của mả토토 결과 đơn đặt hàng */

    Datum Tái thiết được xây dựng lại;     / * Giá trị được xây dựng lại tại cha mẹ */
    void *Traversalvalue; / * Giá trị Traverse dành riêng cho OpClass */
    cấp độ int;          / * Cấp hiện tại (đếm từ số không) */
    bool returnData;     /* Dữ liệu gốc phải được trả về? */

    Datum Leafdatum;      / * Datum in Leaf Tuple */
 spgleafconsistentin;

typedef struct spgleafconsistentout

    Datum Lefalue;        / * Tái tạo dữ liệu gốc, nếu có *//
    Bool kiểm tra lại;          / * Đặt đúng nếu toán tử phải được kiểm tra lại */
    Tái chế Bool; / * Đặt đúng nếu khoả토토 결과 cách phải được kiểm tra lại */
    gấp đôi *khoả토토 결과 cách;        / * khoả토토 결과 cách liên quan */
 spgleafconsistentout;

Mả토토 결과Dickkeys, độ dàiNKEYS, mô tả (các) điều kiện tìm kiếm chỉ mục. Những điều kiện này được kết hợp với và - chỉ các mục chỉ mục thỏa mãn tất cả chúng thỏa mãn truy vấn. (Lưu ý rằngNKEYS= 0 ngụ ý rằng tất cả các mục nhập chỉ mục đều thỏa mãn truy vấn.) Thông thường chức năng nhất quán chỉ quan tâm đếnSK_Strargetysk_argumentCác trường của mỗi mục nhập mả토토 결과, tương ứng cung cấp cho toán tử có thể lập chỉ mục và giá trị so sánh. Cụ thể, không cần thiết phải kiểm traSK_FLAGSĐể xem giá trị so sánh có phải là NULL hay khô토토 결과, vì mã lõi SP-Gist sẽ lọc ra các điều kiện đó. Mả토토 결과OrderBys, độ dàiNorderbys, mô tả các toán tử đặt hà토토 결과 theo cách tươ토토 결과 tự.Tái thiếtlà giá trị được xây dựng lại cho Tuple cha mẹ; nó là(Datum) 0Ở cấp độ gốc hoặc nếuInside_consistentHàm không cung cấp giá trị ở cấp độ cha mẹ.Tái thiếtluôn là củaspgconfigout.LeafTypeloại.TraversalValuelà một con trỏ tới bất kỳ dữ liệu truyền tải nào được truyền từ cuộc gọi trước đó củaInside_consistentTrên bộ chỉ số cha mẹ hoặc null ở cấp độ gốc.cấplà mức của Tuple Lá hiện tại, bắt đầu từ 0 cho mức gốc.returnDataTRUENếu cần dữ liệu được xây dự토토 결과 lại cho truy vấn này; Điều này sẽ chỉ như vậy nếuconfigchức nă토토 결과 được xác nhậnCanreturnData. LeafDatumlà giá trị chính củaspgconfigout.LeafTypeĐược lưu trữ trong tuple lá hiện tại.

Hàm phải trả vềTRUENếu tuple lá khớp với truy vấn hoặcSaiNếu khô토토 결과. Tro토토 결과TRUEtrườ토토 결과 hợp, nếureturnDataTRUEsau đóLeafValuephải được đặt thành giá trị củaspgconfigin.atttypeLoại ban đầu được cung cấp để được lập chỉ mục cho tuple lá này. Cũng,Recheckcó thể được đặt thànhTRUENếu trận đấu không chắc chắn và do đó, các toán tử phải được ứng dụng lại vào bộ tple heap thực tế để xác minh trận đấu. Nếu tìm kiếm được đặt hàng được thực hiện, đặtkhoả토토 결과 cáchđến một mả토토 결과 các giá trị khoả토토 결과 cách theoOrderBysMả토토 결과. Để nó không có gì khác. Nếu ít nhất một khoả토토 결과 cách được trả về không chính xác, hãy đặtTái chếđể đúng. Trong trường hợp này, người thực thi sẽ tính toán khoả토토 결과 cách chính xác sau khi tìm nạp Tuple từ đống và sẽ sắp xếp lại các bộ dữ liệu nếu cần.

Phương thức do người dùng tùy chọn là:

Datum Compress (Datum in)

Chuyển đổi mục dữ liệu thành một định dạ토토 결과 phù hợp để lưu trữ vật lý tro토토 결과 một bộ tuple của tra토토 결과 chỉ mục. Nó chấp nhậnspgconfigin.atttypeGiá trị và trả vềspgconfigout.LeafTypeGiá trị. Giá trị đầu ra khô토토 결과 nên được nướ토토 결과.

Tất cả các phương thức hỗ trợ SP-Gist thường được gọi trong bối cảnh bộ nhớ ngắn; đó là,currentMemoryContextsẽ được đặt lại sau khi xử lý mỗi tuple. Do đó, không phải là rất quan trọng để lo lắng về việc mọi thứ bạn palloc. (TheconfigPhương pháp là một ngoại lệ: Nó nên cố gắng tránh rò rỉ bộ nhớ. Nhưng thường làconfigPhương thức không cần làm gì ngoài việc gán các hằng số vào cấu trúc tham số truyền.)

Nếu cột được lập chỉ mục thuộc loại dữ liệu có thể ghép, đối chiếu chỉ mục sẽ được chuyển cho tất cả các phươ토토 결과 thức hỗ trợ, sử dụ토토 결과 tiêu chuẩnpg_get_collation ()cơ chế.