1 | /*------------------------------------------------------------------------- |
2 | * |
3 | * pg_amop.h |
4 | * definition of the "access method operator" system catalog (pg_amop) |
5 | * |
6 | * The amop table identifies the operators associated with each index operator |
7 | * family and operator class (classes are subsets of families). An associated |
8 | * operator can be either a search operator or an ordering operator, as |
9 | * identified by amoppurpose. |
10 | * |
11 | * The primary key for this table is <amopfamily, amoplefttype, amoprighttype, |
12 | * amopstrategy>. amoplefttype and amoprighttype are just copies of the |
13 | * operator's oprleft/oprright, ie its declared input data types. The |
14 | * "default" operators for a particular opclass within the family are those |
15 | * with amoplefttype = amoprighttype = opclass's opcintype. An opfamily may |
16 | * also contain other operators, typically cross-data-type operators. All the |
17 | * operators within a family are supposed to be compatible, in a way that is |
18 | * defined by each individual index AM. |
19 | * |
20 | * We also keep a unique index on <amopopr, amoppurpose, amopfamily>, so that |
21 | * we can use a syscache to quickly answer questions of the form "is this |
22 | * operator in this opfamily, and if so what are its semantics with respect to |
23 | * the family?" This implies that the same operator cannot be listed for |
24 | * multiple strategy numbers within a single opfamily, with the exception that |
25 | * it's possible to list it for both search and ordering purposes (with |
26 | * different strategy numbers for the two purposes). |
27 | * |
28 | * amopmethod is a copy of the owning opfamily's opfmethod field. This is an |
29 | * intentional denormalization of the catalogs to buy lookup speed. |
30 | * |
31 | * |
32 | * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group |
33 | * Portions Copyright (c) 1994, Regents of the University of California |
34 | * |
35 | * src/include/catalog/pg_amop.h |
36 | * |
37 | * NOTES |
38 | * The Catalog.pm module reads this file and derives schema |
39 | * information. |
40 | * |
41 | *------------------------------------------------------------------------- |
42 | */ |
43 | #ifndef PG_AMOP_H |
44 | #define PG_AMOP_H |
45 | |
46 | #include "catalog/genbki.h" |
47 | #include "catalog/pg_amop_d.h" |
48 | |
49 | /* ---------------- |
50 | * pg_amop definition. cpp turns this into |
51 | * typedef struct FormData_pg_amop |
52 | * ---------------- |
53 | */ |
54 | CATALOG(pg_amop,2602,AccessMethodOperatorRelationId) |
55 | { |
56 | Oid oid; /* oid */ |
57 | |
58 | /* the index opfamily this entry is for */ |
59 | Oid amopfamily BKI_LOOKUP(pg_opfamily); |
60 | |
61 | /* operator's left input data type */ |
62 | Oid amoplefttype BKI_LOOKUP(pg_type); |
63 | |
64 | /* operator's right input data type */ |
65 | Oid amoprighttype BKI_LOOKUP(pg_type); |
66 | |
67 | /* operator strategy number */ |
68 | int16 amopstrategy; |
69 | |
70 | /* is operator for 's'earch or 'o'rdering? */ |
71 | char amoppurpose BKI_DEFAULT(s); |
72 | |
73 | /* the operator's pg_operator OID */ |
74 | Oid amopopr BKI_LOOKUP(pg_operator); |
75 | |
76 | /* the index access method this entry is for */ |
77 | Oid amopmethod BKI_LOOKUP(pg_am); |
78 | |
79 | /* ordering opfamily OID, or 0 if search op */ |
80 | Oid amopsortfamily BKI_DEFAULT(0) BKI_LOOKUP(pg_opfamily); |
81 | } FormData_pg_amop; |
82 | |
83 | /* ---------------- |
84 | * Form_pg_amop corresponds to a pointer to a tuple with |
85 | * the format of pg_amop relation. |
86 | * ---------------- |
87 | */ |
88 | typedef FormData_pg_amop *Form_pg_amop; |
89 | |
90 | #ifdef EXPOSE_TO_CLIENT_CODE |
91 | |
92 | /* allowed values of amoppurpose: */ |
93 | #define AMOP_SEARCH 's' /* operator is for search */ |
94 | #define AMOP_ORDER 'o' /* operator is for ordering */ |
95 | |
96 | #endif /* EXPOSE_TO_CLIENT_CODE */ |
97 | |
98 | #endif /* PG_AMOP_H */ |
99 | |