1#----------------------------------------------------------------------
2#
3# pg_operator.dat
4#    Initial contents of the pg_operator system catalog.
5#
6# Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group
7# Portions Copyright (c) 1994, Regents of the University of California
8#
9# src/include/catalog/pg_operator.dat
10#
11#----------------------------------------------------------------------
12
13[
14
15# Note: every entry in pg_operator.dat is expected to have a 'descr' comment.
16# If the operator is a deprecated equivalent of some other entry, be sure
17# to comment it as such so that initdb doesn't think it's a preferred name
18# for the underlying function.
19
20{ oid => '15', descr => 'equal',
21  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'int4',
22  oprright => 'int8', oprresult => 'bool', oprcom => '=(int8,int4)',
23  oprnegate => '<>(int4,int8)', oprcode => 'int48eq', oprrest => 'eqsel',
24  oprjoin => 'eqjoinsel' },
25{ oid => '36', descr => 'not equal',
26  oprname => '<>', oprleft => 'int4', oprright => 'int8', oprresult => 'bool',
27  oprcom => '<>(int8,int4)', oprnegate => '=(int4,int8)', oprcode => 'int48ne',
28  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
29{ oid => '37', descr => 'less than',
30  oprname => '<', oprleft => 'int4', oprright => 'int8', oprresult => 'bool',
31  oprcom => '>(int8,int4)', oprnegate => '>=(int4,int8)', oprcode => 'int48lt',
32  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
33{ oid => '76', descr => 'greater than',
34  oprname => '>', oprleft => 'int4', oprright => 'int8', oprresult => 'bool',
35  oprcom => '<(int8,int4)', oprnegate => '<=(int4,int8)', oprcode => 'int48gt',
36  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
37{ oid => '80', descr => 'less than or equal',
38  oprname => '<=', oprleft => 'int4', oprright => 'int8', oprresult => 'bool',
39  oprcom => '>=(int8,int4)', oprnegate => '>(int4,int8)', oprcode => 'int48le',
40  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
41{ oid => '82', descr => 'greater than or equal',
42  oprname => '>=', oprleft => 'int4', oprright => 'int8', oprresult => 'bool',
43  oprcom => '<=(int8,int4)', oprnegate => '<(int4,int8)', oprcode => 'int48ge',
44  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
45
46{ oid => '58', descr => 'less than',
47  oprname => '<', oprleft => 'bool', oprright => 'bool', oprresult => 'bool',
48  oprcom => '>(bool,bool)', oprnegate => '>=(bool,bool)', oprcode => 'boollt',
49  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
50{ oid => '59', descr => 'greater than',
51  oprname => '>', oprleft => 'bool', oprright => 'bool', oprresult => 'bool',
52  oprcom => '<(bool,bool)', oprnegate => '<=(bool,bool)', oprcode => 'boolgt',
53  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
54{ oid => '85', oid_symbol => 'BooleanNotEqualOperator', descr => 'not equal',
55  oprname => '<>', oprleft => 'bool', oprright => 'bool', oprresult => 'bool',
56  oprcom => '<>(bool,bool)', oprnegate => '=(bool,bool)', oprcode => 'boolne',
57  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
58{ oid => '91', oid_symbol => 'BooleanEqualOperator', descr => 'equal',
59  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'bool',
60  oprright => 'bool', oprresult => 'bool', oprcom => '=(bool,bool)',
61  oprnegate => '<>(bool,bool)', oprcode => 'booleq', oprrest => 'eqsel',
62  oprjoin => 'eqjoinsel' },
63{ oid => '1694', descr => 'less than or equal',
64  oprname => '<=', oprleft => 'bool', oprright => 'bool', oprresult => 'bool',
65  oprcom => '>=(bool,bool)', oprnegate => '>(bool,bool)', oprcode => 'boolle',
66  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
67{ oid => '1695', descr => 'greater than or equal',
68  oprname => '>=', oprleft => 'bool', oprright => 'bool', oprresult => 'bool',
69  oprcom => '<=(bool,bool)', oprnegate => '<(bool,bool)', oprcode => 'boolge',
70  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
71
72{ oid => '92', descr => 'equal',
73  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'char',
74  oprright => 'char', oprresult => 'bool', oprcom => '=(char,char)',
75  oprnegate => '<>(char,char)', oprcode => 'chareq', oprrest => 'eqsel',
76  oprjoin => 'eqjoinsel' },
77{ oid => '93', descr => 'equal',
78  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'name',
79  oprright => 'name', oprresult => 'bool', oprcom => '=(name,name)',
80  oprnegate => '<>(name,name)', oprcode => 'nameeq', oprrest => 'eqsel',
81  oprjoin => 'eqjoinsel' },
82{ oid => '94', descr => 'equal',
83  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'int2',
84  oprright => 'int2', oprresult => 'bool', oprcom => '=(int2,int2)',
85  oprnegate => '<>(int2,int2)', oprcode => 'int2eq', oprrest => 'eqsel',
86  oprjoin => 'eqjoinsel' },
87{ oid => '95', descr => 'less than',
88  oprname => '<', oprleft => 'int2', oprright => 'int2', oprresult => 'bool',
89  oprcom => '>(int2,int2)', oprnegate => '>=(int2,int2)', oprcode => 'int2lt',
90  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
91{ oid => '96', oid_symbol => 'Int4EqualOperator', descr => 'equal',
92  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'int4',
93  oprright => 'int4', oprresult => 'bool', oprcom => '=(int4,int4)',
94  oprnegate => '<>(int4,int4)', oprcode => 'int4eq', oprrest => 'eqsel',
95  oprjoin => 'eqjoinsel' },
96{ oid => '97', oid_symbol => 'Int4LessOperator', descr => 'less than',
97  oprname => '<', oprleft => 'int4', oprright => 'int4', oprresult => 'bool',
98  oprcom => '>(int4,int4)', oprnegate => '>=(int4,int4)', oprcode => 'int4lt',
99  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
100{ oid => '98', oid_symbol => 'TextEqualOperator', descr => 'equal',
101  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'text',
102  oprright => 'text', oprresult => 'bool', oprcom => '=(text,text)',
103  oprnegate => '<>(text,text)', oprcode => 'texteq', oprrest => 'eqsel',
104  oprjoin => 'eqjoinsel' },
105{ oid => '3877', descr => 'starts with',
106  oprname => '^@', oprleft => 'text', oprright => 'text', oprresult => 'bool',
107  oprcode => 'starts_with', oprrest => 'prefixsel',
108  oprjoin => 'prefixjoinsel' },
109
110{ oid => '349', descr => 'append element onto end of array',
111  oprname => '||', oprleft => 'anyarray', oprright => 'anyelement',
112  oprresult => 'anyarray', oprcode => 'array_append' },
113{ oid => '374', descr => 'prepend element onto front of array',
114  oprname => '||', oprleft => 'anyelement', oprright => 'anyarray',
115  oprresult => 'anyarray', oprcode => 'array_prepend' },
116{ oid => '375', descr => 'concatenate',
117  oprname => '||', oprleft => 'anyarray', oprright => 'anyarray',
118  oprresult => 'anyarray', oprcode => 'array_cat' },
119
120{ oid => '352', descr => 'equal',
121  oprname => '=', oprcanhash => 't', oprleft => 'xid', oprright => 'xid',
122  oprresult => 'bool', oprcom => '=(xid,xid)', oprnegate => '<>(xid,xid)',
123  oprcode => 'xideq', oprrest => 'eqsel', oprjoin => 'eqjoinsel' },
124{ oid => '353', descr => 'equal',
125  oprname => '=', oprleft => 'xid', oprright => 'int4', oprresult => 'bool',
126  oprnegate => '<>(xid,int4)', oprcode => 'xideqint4', oprrest => 'eqsel',
127  oprjoin => 'eqjoinsel' },
128{ oid => '3315', descr => 'not equal',
129  oprname => '<>', oprleft => 'xid', oprright => 'xid', oprresult => 'bool',
130  oprcom => '<>(xid,xid)', oprnegate => '=(xid,xid)', oprcode => 'xidneq',
131  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
132{ oid => '3316', descr => 'not equal',
133  oprname => '<>', oprleft => 'xid', oprright => 'int4', oprresult => 'bool',
134  oprnegate => '=(xid,int4)', oprcode => 'xidneqint4', oprrest => 'neqsel',
135  oprjoin => 'neqjoinsel' },
136{ oid => '388', descr => 'factorial',
137  oprname => '!', oprkind => 'r', oprleft => 'int8', oprright => '0',
138  oprresult => 'numeric', oprcode => 'numeric_fac' },
139{ oid => '389', descr => 'deprecated, use ! instead',
140  oprname => '!!', oprkind => 'l', oprleft => '0', oprright => 'int8',
141  oprresult => 'numeric', oprcode => 'numeric_fac' },
142{ oid => '385', descr => 'equal',
143  oprname => '=', oprcanhash => 't', oprleft => 'cid', oprright => 'cid',
144  oprresult => 'bool', oprcom => '=(cid,cid)', oprcode => 'cideq',
145  oprrest => 'eqsel', oprjoin => 'eqjoinsel' },
146
147{ oid => '387', oid_symbol => 'TIDEqualOperator', descr => 'equal',
148  oprname => '=', oprcanmerge => 't', oprleft => 'tid', oprright => 'tid',
149  oprresult => 'bool', oprcom => '=(tid,tid)', oprnegate => '<>(tid,tid)',
150  oprcode => 'tideq', oprrest => 'eqsel', oprjoin => 'eqjoinsel' },
151{ oid => '402', descr => 'not equal',
152  oprname => '<>', oprleft => 'tid', oprright => 'tid', oprresult => 'bool',
153  oprcom => '<>(tid,tid)', oprnegate => '=(tid,tid)', oprcode => 'tidne',
154  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
155{ oid => '2799', oid_symbol => 'TIDLessOperator', descr => 'less than',
156  oprname => '<', oprleft => 'tid', oprright => 'tid', oprresult => 'bool',
157  oprcom => '>(tid,tid)', oprnegate => '>=(tid,tid)', oprcode => 'tidlt',
158  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
159{ oid => '2800', descr => 'greater than',
160  oprname => '>', oprleft => 'tid', oprright => 'tid', oprresult => 'bool',
161  oprcom => '<(tid,tid)', oprnegate => '<=(tid,tid)', oprcode => 'tidgt',
162  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
163{ oid => '2801', descr => 'less than or equal',
164  oprname => '<=', oprleft => 'tid', oprright => 'tid', oprresult => 'bool',
165  oprcom => '>=(tid,tid)', oprnegate => '>(tid,tid)', oprcode => 'tidle',
166  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
167{ oid => '2802', descr => 'greater than or equal',
168  oprname => '>=', oprleft => 'tid', oprright => 'tid', oprresult => 'bool',
169  oprcom => '<=(tid,tid)', oprnegate => '<(tid,tid)', oprcode => 'tidge',
170  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
171
172{ oid => '410', descr => 'equal',
173  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'int8',
174  oprright => 'int8', oprresult => 'bool', oprcom => '=(int8,int8)',
175  oprnegate => '<>(int8,int8)', oprcode => 'int8eq', oprrest => 'eqsel',
176  oprjoin => 'eqjoinsel' },
177{ oid => '411', descr => 'not equal',
178  oprname => '<>', oprleft => 'int8', oprright => 'int8', oprresult => 'bool',
179  oprcom => '<>(int8,int8)', oprnegate => '=(int8,int8)', oprcode => 'int8ne',
180  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
181{ oid => '412', oid_symbol => 'Int8LessOperator', descr => 'less than',
182  oprname => '<', oprleft => 'int8', oprright => 'int8', oprresult => 'bool',
183  oprcom => '>(int8,int8)', oprnegate => '>=(int8,int8)', oprcode => 'int8lt',
184  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
185{ oid => '413', descr => 'greater than',
186  oprname => '>', oprleft => 'int8', oprright => 'int8', oprresult => 'bool',
187  oprcom => '<(int8,int8)', oprnegate => '<=(int8,int8)', oprcode => 'int8gt',
188  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
189{ oid => '414', descr => 'less than or equal',
190  oprname => '<=', oprleft => 'int8', oprright => 'int8', oprresult => 'bool',
191  oprcom => '>=(int8,int8)', oprnegate => '>(int8,int8)', oprcode => 'int8le',
192  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
193{ oid => '415', descr => 'greater than or equal',
194  oprname => '>=', oprleft => 'int8', oprright => 'int8', oprresult => 'bool',
195  oprcom => '<=(int8,int8)', oprnegate => '<(int8,int8)', oprcode => 'int8ge',
196  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
197
198{ oid => '416', descr => 'equal',
199  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'int8',
200  oprright => 'int4', oprresult => 'bool', oprcom => '=(int4,int8)',
201  oprnegate => '<>(int8,int4)', oprcode => 'int84eq', oprrest => 'eqsel',
202  oprjoin => 'eqjoinsel' },
203{ oid => '417', descr => 'not equal',
204  oprname => '<>', oprleft => 'int8', oprright => 'int4', oprresult => 'bool',
205  oprcom => '<>(int4,int8)', oprnegate => '=(int8,int4)', oprcode => 'int84ne',
206  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
207{ oid => '418', descr => 'less than',
208  oprname => '<', oprleft => 'int8', oprright => 'int4', oprresult => 'bool',
209  oprcom => '>(int4,int8)', oprnegate => '>=(int8,int4)', oprcode => 'int84lt',
210  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
211{ oid => '419', descr => 'greater than',
212  oprname => '>', oprleft => 'int8', oprright => 'int4', oprresult => 'bool',
213  oprcom => '<(int4,int8)', oprnegate => '<=(int8,int4)', oprcode => 'int84gt',
214  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
215{ oid => '420', descr => 'less than or equal',
216  oprname => '<=', oprleft => 'int8', oprright => 'int4', oprresult => 'bool',
217  oprcom => '>=(int4,int8)', oprnegate => '>(int8,int4)', oprcode => 'int84le',
218  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
219{ oid => '430', descr => 'greater than or equal',
220  oprname => '>=', oprleft => 'int8', oprright => 'int4', oprresult => 'bool',
221  oprcom => '<=(int4,int8)', oprnegate => '<(int8,int4)', oprcode => 'int84ge',
222  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
223{ oid => '439', descr => 'modulus',
224  oprname => '%', oprleft => 'int8', oprright => 'int8', oprresult => 'int8',
225  oprcode => 'int8mod' },
226{ oid => '473', descr => 'absolute value',
227  oprname => '@', oprkind => 'l', oprleft => '0', oprright => 'int8',
228  oprresult => 'int8', oprcode => 'int8abs' },
229
230{ oid => '484', descr => 'negate',
231  oprname => '-', oprkind => 'l', oprleft => '0', oprright => 'int8',
232  oprresult => 'int8', oprcode => 'int8um' },
233{ oid => '485', descr => 'is left of',
234  oprname => '<<', oprleft => 'polygon', oprright => 'polygon',
235  oprresult => 'bool', oprcode => 'poly_left', oprrest => 'positionsel',
236  oprjoin => 'positionjoinsel' },
237{ oid => '486', descr => 'overlaps or is left of',
238  oprname => '&<', oprleft => 'polygon', oprright => 'polygon',
239  oprresult => 'bool', oprcode => 'poly_overleft', oprrest => 'positionsel',
240  oprjoin => 'positionjoinsel' },
241{ oid => '487', descr => 'overlaps or is right of',
242  oprname => '&>', oprleft => 'polygon', oprright => 'polygon',
243  oprresult => 'bool', oprcode => 'poly_overright', oprrest => 'positionsel',
244  oprjoin => 'positionjoinsel' },
245{ oid => '488', descr => 'is right of',
246  oprname => '>>', oprleft => 'polygon', oprright => 'polygon',
247  oprresult => 'bool', oprcode => 'poly_right', oprrest => 'positionsel',
248  oprjoin => 'positionjoinsel' },
249{ oid => '489', descr => 'is contained by',
250  oprname => '<@', oprleft => 'polygon', oprright => 'polygon',
251  oprresult => 'bool', oprcom => '@>(polygon,polygon)',
252  oprcode => 'poly_contained', oprrest => 'contsel', oprjoin => 'contjoinsel' },
253{ oid => '490', descr => 'contains',
254  oprname => '@>', oprleft => 'polygon', oprright => 'polygon',
255  oprresult => 'bool', oprcom => '<@(polygon,polygon)',
256  oprcode => 'poly_contain', oprrest => 'contsel', oprjoin => 'contjoinsel' },
257{ oid => '491', descr => 'same as',
258  oprname => '~=', oprleft => 'polygon', oprright => 'polygon',
259  oprresult => 'bool', oprcom => '~=(polygon,polygon)', oprcode => 'poly_same',
260  oprrest => 'eqsel', oprjoin => 'eqjoinsel' },
261{ oid => '492', descr => 'overlaps',
262  oprname => '&&', oprleft => 'polygon', oprright => 'polygon',
263  oprresult => 'bool', oprcom => '&&(polygon,polygon)',
264  oprcode => 'poly_overlap', oprrest => 'areasel', oprjoin => 'areajoinsel' },
265{ oid => '493', descr => 'is left of',
266  oprname => '<<', oprleft => 'box', oprright => 'box', oprresult => 'bool',
267  oprcode => 'box_left', oprrest => 'positionsel',
268  oprjoin => 'positionjoinsel' },
269{ oid => '494', descr => 'overlaps or is left of',
270  oprname => '&<', oprleft => 'box', oprright => 'box', oprresult => 'bool',
271  oprcode => 'box_overleft', oprrest => 'positionsel',
272  oprjoin => 'positionjoinsel' },
273{ oid => '495', descr => 'overlaps or is right of',
274  oprname => '&>', oprleft => 'box', oprright => 'box', oprresult => 'bool',
275  oprcode => 'box_overright', oprrest => 'positionsel',
276  oprjoin => 'positionjoinsel' },
277{ oid => '496', descr => 'is right of',
278  oprname => '>>', oprleft => 'box', oprright => 'box', oprresult => 'bool',
279  oprcode => 'box_right', oprrest => 'positionsel',
280  oprjoin => 'positionjoinsel' },
281{ oid => '497', descr => 'is contained by',
282  oprname => '<@', oprleft => 'box', oprright => 'box', oprresult => 'bool',
283  oprcom => '@>(box,box)', oprcode => 'box_contained', oprrest => 'contsel',
284  oprjoin => 'contjoinsel' },
285{ oid => '498', descr => 'contains',
286  oprname => '@>', oprleft => 'box', oprright => 'box', oprresult => 'bool',
287  oprcom => '<@(box,box)', oprcode => 'box_contain', oprrest => 'contsel',
288  oprjoin => 'contjoinsel' },
289{ oid => '499', descr => 'same as',
290  oprname => '~=', oprleft => 'box', oprright => 'box', oprresult => 'bool',
291  oprcom => '~=(box,box)', oprcode => 'box_same', oprrest => 'eqsel',
292  oprjoin => 'eqjoinsel' },
293{ oid => '500', descr => 'overlaps',
294  oprname => '&&', oprleft => 'box', oprright => 'box', oprresult => 'bool',
295  oprcom => '&&(box,box)', oprcode => 'box_overlap', oprrest => 'areasel',
296  oprjoin => 'areajoinsel' },
297{ oid => '501', descr => 'greater than or equal by area',
298  oprname => '>=', oprleft => 'box', oprright => 'box', oprresult => 'bool',
299  oprcom => '<=(box,box)', oprnegate => '<(box,box)', oprcode => 'box_ge',
300  oprrest => 'areasel', oprjoin => 'areajoinsel' },
301{ oid => '502', descr => 'greater than by area',
302  oprname => '>', oprleft => 'box', oprright => 'box', oprresult => 'bool',
303  oprcom => '<(box,box)', oprnegate => '<=(box,box)', oprcode => 'box_gt',
304  oprrest => 'areasel', oprjoin => 'areajoinsel' },
305{ oid => '503', descr => 'equal by area',
306  oprname => '=', oprleft => 'box', oprright => 'box', oprresult => 'bool',
307  oprcom => '=(box,box)', oprcode => 'box_eq', oprrest => 'eqsel',
308  oprjoin => 'eqjoinsel' },
309{ oid => '504', descr => 'less than by area',
310  oprname => '<', oprleft => 'box', oprright => 'box', oprresult => 'bool',
311  oprcom => '>(box,box)', oprnegate => '>=(box,box)', oprcode => 'box_lt',
312  oprrest => 'areasel', oprjoin => 'areajoinsel' },
313{ oid => '505', descr => 'less than or equal by area',
314  oprname => '<=', oprleft => 'box', oprright => 'box', oprresult => 'bool',
315  oprcom => '>=(box,box)', oprnegate => '>(box,box)', oprcode => 'box_le',
316  oprrest => 'areasel', oprjoin => 'areajoinsel' },
317{ oid => '506', descr => 'is above',
318  oprname => '>^', oprleft => 'point', oprright => 'point', oprresult => 'bool',
319  oprcode => 'point_above', oprrest => 'positionsel',
320  oprjoin => 'positionjoinsel' },
321{ oid => '507', descr => 'is left of',
322  oprname => '<<', oprleft => 'point', oprright => 'point', oprresult => 'bool',
323  oprcode => 'point_left', oprrest => 'positionsel',
324  oprjoin => 'positionjoinsel' },
325{ oid => '508', descr => 'is right of',
326  oprname => '>>', oprleft => 'point', oprright => 'point', oprresult => 'bool',
327  oprcode => 'point_right', oprrest => 'positionsel',
328  oprjoin => 'positionjoinsel' },
329{ oid => '509', descr => 'is below',
330  oprname => '<^', oprleft => 'point', oprright => 'point', oprresult => 'bool',
331  oprcode => 'point_below', oprrest => 'positionsel',
332  oprjoin => 'positionjoinsel' },
333{ oid => '510', descr => 'same as',
334  oprname => '~=', oprleft => 'point', oprright => 'point', oprresult => 'bool',
335  oprcom => '~=(point,point)', oprnegate => '<>(point,point)',
336  oprcode => 'point_eq', oprrest => 'eqsel', oprjoin => 'eqjoinsel' },
337{ oid => '511', descr => 'point inside box',
338  oprname => '<@', oprleft => 'point', oprright => 'box', oprresult => 'bool',
339  oprcom => '@>(box,point)', oprcode => 'on_pb', oprrest => 'contsel',
340  oprjoin => 'contjoinsel' },
341{ oid => '433', descr => 'contains',
342  oprname => '@>', oprleft => 'box', oprright => 'point', oprresult => 'bool',
343  oprcom => '<@(point,box)', oprcode => 'box_contain_pt', oprrest => 'contsel',
344  oprjoin => 'contjoinsel' },
345{ oid => '512', descr => 'point within closed path, or point on open path',
346  oprname => '<@', oprleft => 'point', oprright => 'path', oprresult => 'bool',
347  oprcom => '@>(path,point)', oprcode => 'on_ppath' },
348{ oid => '513', descr => 'center of',
349  oprname => '@@', oprkind => 'l', oprleft => '0', oprright => 'box',
350  oprresult => 'point', oprcode => 'box_center' },
351{ oid => '514', descr => 'multiply',
352  oprname => '*', oprleft => 'int4', oprright => 'int4', oprresult => 'int4',
353  oprcom => '*(int4,int4)', oprcode => 'int4mul' },
354{ oid => '517', descr => 'distance between',
355  oprname => '<->', oprleft => 'point', oprright => 'point',
356  oprresult => 'float8', oprcom => '<->(point,point)',
357  oprcode => 'point_distance' },
358{ oid => '518', descr => 'not equal',
359  oprname => '<>', oprleft => 'int4', oprright => 'int4', oprresult => 'bool',
360  oprcom => '<>(int4,int4)', oprnegate => '=(int4,int4)', oprcode => 'int4ne',
361  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
362{ oid => '519', descr => 'not equal',
363  oprname => '<>', oprleft => 'int2', oprright => 'int2', oprresult => 'bool',
364  oprcom => '<>(int2,int2)', oprnegate => '=(int2,int2)', oprcode => 'int2ne',
365  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
366{ oid => '520', descr => 'greater than',
367  oprname => '>', oprleft => 'int2', oprright => 'int2', oprresult => 'bool',
368  oprcom => '<(int2,int2)', oprnegate => '<=(int2,int2)', oprcode => 'int2gt',
369  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
370{ oid => '521', descr => 'greater than',
371  oprname => '>', oprleft => 'int4', oprright => 'int4', oprresult => 'bool',
372  oprcom => '<(int4,int4)', oprnegate => '<=(int4,int4)', oprcode => 'int4gt',
373  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
374{ oid => '522', descr => 'less than or equal',
375  oprname => '<=', oprleft => 'int2', oprright => 'int2', oprresult => 'bool',
376  oprcom => '>=(int2,int2)', oprnegate => '>(int2,int2)', oprcode => 'int2le',
377  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
378{ oid => '523', descr => 'less than or equal',
379  oprname => '<=', oprleft => 'int4', oprright => 'int4', oprresult => 'bool',
380  oprcom => '>=(int4,int4)', oprnegate => '>(int4,int4)', oprcode => 'int4le',
381  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
382{ oid => '524', descr => 'greater than or equal',
383  oprname => '>=', oprleft => 'int2', oprright => 'int2', oprresult => 'bool',
384  oprcom => '<=(int2,int2)', oprnegate => '<(int2,int2)', oprcode => 'int2ge',
385  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
386{ oid => '525', descr => 'greater than or equal',
387  oprname => '>=', oprleft => 'int4', oprright => 'int4', oprresult => 'bool',
388  oprcom => '<=(int4,int4)', oprnegate => '<(int4,int4)', oprcode => 'int4ge',
389  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
390{ oid => '526', descr => 'multiply',
391  oprname => '*', oprleft => 'int2', oprright => 'int2', oprresult => 'int2',
392  oprcom => '*(int2,int2)', oprcode => 'int2mul' },
393{ oid => '527', descr => 'divide',
394  oprname => '/', oprleft => 'int2', oprright => 'int2', oprresult => 'int2',
395  oprcode => 'int2div' },
396{ oid => '528', descr => 'divide',
397  oprname => '/', oprleft => 'int4', oprright => 'int4', oprresult => 'int4',
398  oprcode => 'int4div' },
399{ oid => '529', descr => 'modulus',
400  oprname => '%', oprleft => 'int2', oprright => 'int2', oprresult => 'int2',
401  oprcode => 'int2mod' },
402{ oid => '530', descr => 'modulus',
403  oprname => '%', oprleft => 'int4', oprright => 'int4', oprresult => 'int4',
404  oprcode => 'int4mod' },
405{ oid => '531', descr => 'not equal',
406  oprname => '<>', oprleft => 'text', oprright => 'text', oprresult => 'bool',
407  oprcom => '<>(text,text)', oprnegate => '=(text,text)', oprcode => 'textne',
408  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
409{ oid => '532', descr => 'equal',
410  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'int2',
411  oprright => 'int4', oprresult => 'bool', oprcom => '=(int4,int2)',
412  oprnegate => '<>(int2,int4)', oprcode => 'int24eq', oprrest => 'eqsel',
413  oprjoin => 'eqjoinsel' },
414{ oid => '533', descr => 'equal',
415  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'int4',
416  oprright => 'int2', oprresult => 'bool', oprcom => '=(int2,int4)',
417  oprnegate => '<>(int4,int2)', oprcode => 'int42eq', oprrest => 'eqsel',
418  oprjoin => 'eqjoinsel' },
419{ oid => '534', descr => 'less than',
420  oprname => '<', oprleft => 'int2', oprright => 'int4', oprresult => 'bool',
421  oprcom => '>(int4,int2)', oprnegate => '>=(int2,int4)', oprcode => 'int24lt',
422  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
423{ oid => '535', descr => 'less than',
424  oprname => '<', oprleft => 'int4', oprright => 'int2', oprresult => 'bool',
425  oprcom => '>(int2,int4)', oprnegate => '>=(int4,int2)', oprcode => 'int42lt',
426  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
427{ oid => '536', descr => 'greater than',
428  oprname => '>', oprleft => 'int2', oprright => 'int4', oprresult => 'bool',
429  oprcom => '<(int4,int2)', oprnegate => '<=(int2,int4)', oprcode => 'int24gt',
430  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
431{ oid => '537', descr => 'greater than',
432  oprname => '>', oprleft => 'int4', oprright => 'int2', oprresult => 'bool',
433  oprcom => '<(int2,int4)', oprnegate => '<=(int4,int2)', oprcode => 'int42gt',
434  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
435{ oid => '538', descr => 'not equal',
436  oprname => '<>', oprleft => 'int2', oprright => 'int4', oprresult => 'bool',
437  oprcom => '<>(int4,int2)', oprnegate => '=(int2,int4)', oprcode => 'int24ne',
438  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
439{ oid => '539', descr => 'not equal',
440  oprname => '<>', oprleft => 'int4', oprright => 'int2', oprresult => 'bool',
441  oprcom => '<>(int2,int4)', oprnegate => '=(int4,int2)', oprcode => 'int42ne',
442  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
443{ oid => '540', descr => 'less than or equal',
444  oprname => '<=', oprleft => 'int2', oprright => 'int4', oprresult => 'bool',
445  oprcom => '>=(int4,int2)', oprnegate => '>(int2,int4)', oprcode => 'int24le',
446  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
447{ oid => '541', descr => 'less than or equal',
448  oprname => '<=', oprleft => 'int4', oprright => 'int2', oprresult => 'bool',
449  oprcom => '>=(int2,int4)', oprnegate => '>(int4,int2)', oprcode => 'int42le',
450  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
451{ oid => '542', descr => 'greater than or equal',
452  oprname => '>=', oprleft => 'int2', oprright => 'int4', oprresult => 'bool',
453  oprcom => '<=(int4,int2)', oprnegate => '<(int2,int4)', oprcode => 'int24ge',
454  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
455{ oid => '543', descr => 'greater than or equal',
456  oprname => '>=', oprleft => 'int4', oprright => 'int2', oprresult => 'bool',
457  oprcom => '<=(int2,int4)', oprnegate => '<(int4,int2)', oprcode => 'int42ge',
458  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
459{ oid => '544', descr => 'multiply',
460  oprname => '*', oprleft => 'int2', oprright => 'int4', oprresult => 'int4',
461  oprcom => '*(int4,int2)', oprcode => 'int24mul' },
462{ oid => '545', descr => 'multiply',
463  oprname => '*', oprleft => 'int4', oprright => 'int2', oprresult => 'int4',
464  oprcom => '*(int2,int4)', oprcode => 'int42mul' },
465{ oid => '546', descr => 'divide',
466  oprname => '/', oprleft => 'int2', oprright => 'int4', oprresult => 'int4',
467  oprcode => 'int24div' },
468{ oid => '547', descr => 'divide',
469  oprname => '/', oprleft => 'int4', oprright => 'int2', oprresult => 'int4',
470  oprcode => 'int42div' },
471{ oid => '550', descr => 'add',
472  oprname => '+', oprleft => 'int2', oprright => 'int2', oprresult => 'int2',
473  oprcom => '+(int2,int2)', oprcode => 'int2pl' },
474{ oid => '551', descr => 'add',
475  oprname => '+', oprleft => 'int4', oprright => 'int4', oprresult => 'int4',
476  oprcom => '+(int4,int4)', oprcode => 'int4pl' },
477{ oid => '552', descr => 'add',
478  oprname => '+', oprleft => 'int2', oprright => 'int4', oprresult => 'int4',
479  oprcom => '+(int4,int2)', oprcode => 'int24pl' },
480{ oid => '553', descr => 'add',
481  oprname => '+', oprleft => 'int4', oprright => 'int2', oprresult => 'int4',
482  oprcom => '+(int2,int4)', oprcode => 'int42pl' },
483{ oid => '554', descr => 'subtract',
484  oprname => '-', oprleft => 'int2', oprright => 'int2', oprresult => 'int2',
485  oprcode => 'int2mi' },
486{ oid => '555', descr => 'subtract',
487  oprname => '-', oprleft => 'int4', oprright => 'int4', oprresult => 'int4',
488  oprcode => 'int4mi' },
489{ oid => '556', descr => 'subtract',
490  oprname => '-', oprleft => 'int2', oprright => 'int4', oprresult => 'int4',
491  oprcode => 'int24mi' },
492{ oid => '557', descr => 'subtract',
493  oprname => '-', oprleft => 'int4', oprright => 'int2', oprresult => 'int4',
494  oprcode => 'int42mi' },
495{ oid => '558', descr => 'negate',
496  oprname => '-', oprkind => 'l', oprleft => '0', oprright => 'int4',
497  oprresult => 'int4', oprcode => 'int4um' },
498{ oid => '559', descr => 'negate',
499  oprname => '-', oprkind => 'l', oprleft => '0', oprright => 'int2',
500  oprresult => 'int2', oprcode => 'int2um' },
501{ oid => '560', descr => 'equal',
502  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'abstime',
503  oprright => 'abstime', oprresult => 'bool', oprcom => '=(abstime,abstime)',
504  oprnegate => '<>(abstime,abstime)', oprcode => 'abstimeeq',
505  oprrest => 'eqsel', oprjoin => 'eqjoinsel' },
506{ oid => '561', descr => 'not equal',
507  oprname => '<>', oprleft => 'abstime', oprright => 'abstime',
508  oprresult => 'bool', oprcom => '<>(abstime,abstime)',
509  oprnegate => '=(abstime,abstime)', oprcode => 'abstimene',
510  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
511{ oid => '562', descr => 'less than',
512  oprname => '<', oprleft => 'abstime', oprright => 'abstime',
513  oprresult => 'bool', oprcom => '>(abstime,abstime)',
514  oprnegate => '>=(abstime,abstime)', oprcode => 'abstimelt',
515  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
516{ oid => '563', descr => 'greater than',
517  oprname => '>', oprleft => 'abstime', oprright => 'abstime',
518  oprresult => 'bool', oprcom => '<(abstime,abstime)',
519  oprnegate => '<=(abstime,abstime)', oprcode => 'abstimegt',
520  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
521{ oid => '564', descr => 'less than or equal',
522  oprname => '<=', oprleft => 'abstime', oprright => 'abstime',
523  oprresult => 'bool', oprcom => '>=(abstime,abstime)',
524  oprnegate => '>(abstime,abstime)', oprcode => 'abstimele',
525  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
526{ oid => '565', descr => 'greater than or equal',
527  oprname => '>=', oprleft => 'abstime', oprright => 'abstime',
528  oprresult => 'bool', oprcom => '<=(abstime,abstime)',
529  oprnegate => '<(abstime,abstime)', oprcode => 'abstimege',
530  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
531{ oid => '566', descr => 'equal',
532  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'reltime',
533  oprright => 'reltime', oprresult => 'bool', oprcom => '=(reltime,reltime)',
534  oprnegate => '<>(reltime,reltime)', oprcode => 'reltimeeq',
535  oprrest => 'eqsel', oprjoin => 'eqjoinsel' },
536{ oid => '567', descr => 'not equal',
537  oprname => '<>', oprleft => 'reltime', oprright => 'reltime',
538  oprresult => 'bool', oprcom => '<>(reltime,reltime)',
539  oprnegate => '=(reltime,reltime)', oprcode => 'reltimene',
540  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
541{ oid => '568', descr => 'less than',
542  oprname => '<', oprleft => 'reltime', oprright => 'reltime',
543  oprresult => 'bool', oprcom => '>(reltime,reltime)',
544  oprnegate => '>=(reltime,reltime)', oprcode => 'reltimelt',
545  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
546{ oid => '569', descr => 'greater than',
547  oprname => '>', oprleft => 'reltime', oprright => 'reltime',
548  oprresult => 'bool', oprcom => '<(reltime,reltime)',
549  oprnegate => '<=(reltime,reltime)', oprcode => 'reltimegt',
550  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
551{ oid => '570', descr => 'less than or equal',
552  oprname => '<=', oprleft => 'reltime', oprright => 'reltime',
553  oprresult => 'bool', oprcom => '>=(reltime,reltime)',
554  oprnegate => '>(reltime,reltime)', oprcode => 'reltimele',
555  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
556{ oid => '571', descr => 'greater than or equal',
557  oprname => '>=', oprleft => 'reltime', oprright => 'reltime',
558  oprresult => 'bool', oprcom => '<=(reltime,reltime)',
559  oprnegate => '<(reltime,reltime)', oprcode => 'reltimege',
560  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
561{ oid => '572', descr => 'same as',
562  oprname => '~=', oprleft => 'tinterval', oprright => 'tinterval',
563  oprresult => 'bool', oprcom => '~=(tinterval,tinterval)',
564  oprcode => 'tintervalsame', oprrest => 'eqsel', oprjoin => 'eqjoinsel' },
565{ oid => '573', descr => 'contains',
566  oprname => '<<', oprleft => 'tinterval', oprright => 'tinterval',
567  oprresult => 'bool', oprcode => 'tintervalct' },
568{ oid => '574', descr => 'overlaps',
569  oprname => '&&', oprleft => 'tinterval', oprright => 'tinterval',
570  oprresult => 'bool', oprcom => '&&(tinterval,tinterval)',
571  oprcode => 'tintervalov' },
572{ oid => '575', descr => 'equal by length',
573  oprname => '#=', oprleft => 'tinterval', oprright => 'reltime',
574  oprresult => 'bool', oprnegate => '#<>(tinterval,reltime)',
575  oprcode => 'tintervalleneq' },
576{ oid => '576', descr => 'not equal by length',
577  oprname => '#<>', oprleft => 'tinterval', oprright => 'reltime',
578  oprresult => 'bool', oprnegate => '#=(tinterval,reltime)',
579  oprcode => 'tintervallenne' },
580{ oid => '577', descr => 'less than by length',
581  oprname => '#<', oprleft => 'tinterval', oprright => 'reltime',
582  oprresult => 'bool', oprnegate => '#>=(tinterval,reltime)',
583  oprcode => 'tintervallenlt' },
584{ oid => '578', descr => 'greater than by length',
585  oprname => '#>', oprleft => 'tinterval', oprright => 'reltime',
586  oprresult => 'bool', oprnegate => '#<=(tinterval,reltime)',
587  oprcode => 'tintervallengt' },
588{ oid => '579', descr => 'less than or equal by length',
589  oprname => '#<=', oprleft => 'tinterval', oprright => 'reltime',
590  oprresult => 'bool', oprnegate => '#>(tinterval,reltime)',
591  oprcode => 'tintervallenle' },
592{ oid => '580', descr => 'greater than or equal by length',
593  oprname => '#>=', oprleft => 'tinterval', oprright => 'reltime',
594  oprresult => 'bool', oprnegate => '#<(tinterval,reltime)',
595  oprcode => 'tintervallenge' },
596{ oid => '581', descr => 'add',
597  oprname => '+', oprleft => 'abstime', oprright => 'reltime',
598  oprresult => 'abstime', oprcode => 'timepl' },
599{ oid => '582', descr => 'subtract',
600  oprname => '-', oprleft => 'abstime', oprright => 'reltime',
601  oprresult => 'abstime', oprcode => 'timemi' },
602{ oid => '583', descr => 'is contained by',
603  oprname => '<?>', oprleft => 'abstime', oprright => 'tinterval',
604  oprresult => 'bool', oprcode => 'intinterval' },
605{ oid => '584', descr => 'negate',
606  oprname => '-', oprkind => 'l', oprleft => '0', oprright => 'float4',
607  oprresult => 'float4', oprcode => 'float4um' },
608{ oid => '585', descr => 'negate',
609  oprname => '-', oprkind => 'l', oprleft => '0', oprright => 'float8',
610  oprresult => 'float8', oprcode => 'float8um' },
611{ oid => '586', descr => 'add',
612  oprname => '+', oprleft => 'float4', oprright => 'float4',
613  oprresult => 'float4', oprcom => '+(float4,float4)', oprcode => 'float4pl' },
614{ oid => '587', descr => 'subtract',
615  oprname => '-', oprleft => 'float4', oprright => 'float4',
616  oprresult => 'float4', oprcode => 'float4mi' },
617{ oid => '588', descr => 'divide',
618  oprname => '/', oprleft => 'float4', oprright => 'float4',
619  oprresult => 'float4', oprcode => 'float4div' },
620{ oid => '589', descr => 'multiply',
621  oprname => '*', oprleft => 'float4', oprright => 'float4',
622  oprresult => 'float4', oprcom => '*(float4,float4)', oprcode => 'float4mul' },
623{ oid => '590', descr => 'absolute value',
624  oprname => '@', oprkind => 'l', oprleft => '0', oprright => 'float4',
625  oprresult => 'float4', oprcode => 'float4abs' },
626{ oid => '591', descr => 'add',
627  oprname => '+', oprleft => 'float8', oprright => 'float8',
628  oprresult => 'float8', oprcom => '+(float8,float8)', oprcode => 'float8pl' },
629{ oid => '592', descr => 'subtract',
630  oprname => '-', oprleft => 'float8', oprright => 'float8',
631  oprresult => 'float8', oprcode => 'float8mi' },
632{ oid => '593', descr => 'divide',
633  oprname => '/', oprleft => 'float8', oprright => 'float8',
634  oprresult => 'float8', oprcode => 'float8div' },
635{ oid => '594', descr => 'multiply',
636  oprname => '*', oprleft => 'float8', oprright => 'float8',
637  oprresult => 'float8', oprcom => '*(float8,float8)', oprcode => 'float8mul' },
638{ oid => '595', descr => 'absolute value',
639  oprname => '@', oprkind => 'l', oprleft => '0', oprright => 'float8',
640  oprresult => 'float8', oprcode => 'float8abs' },
641{ oid => '596', descr => 'square root',
642  oprname => '|/', oprkind => 'l', oprleft => '0', oprright => 'float8',
643  oprresult => 'float8', oprcode => 'dsqrt' },
644{ oid => '597', descr => 'cube root',
645  oprname => '||/', oprkind => 'l', oprleft => '0', oprright => 'float8',
646  oprresult => 'float8', oprcode => 'dcbrt' },
647{ oid => '1284', descr => 'start of interval',
648  oprname => '|', oprkind => 'l', oprleft => '0', oprright => 'tinterval',
649  oprresult => 'abstime', oprcode => 'tintervalstart' },
650{ oid => '606', descr => 'convert to tinterval',
651  oprname => '<#>', oprleft => 'abstime', oprright => 'abstime',
652  oprresult => 'tinterval', oprcode => 'mktinterval' },
653
654{ oid => '607', descr => 'equal',
655  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'oid',
656  oprright => 'oid', oprresult => 'bool', oprcom => '=(oid,oid)',
657  oprnegate => '<>(oid,oid)', oprcode => 'oideq', oprrest => 'eqsel',
658  oprjoin => 'eqjoinsel' },
659{ oid => '608', descr => 'not equal',
660  oprname => '<>', oprleft => 'oid', oprright => 'oid', oprresult => 'bool',
661  oprcom => '<>(oid,oid)', oprnegate => '=(oid,oid)', oprcode => 'oidne',
662  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
663{ oid => '609', descr => 'less than',
664  oprname => '<', oprleft => 'oid', oprright => 'oid', oprresult => 'bool',
665  oprcom => '>(oid,oid)', oprnegate => '>=(oid,oid)', oprcode => 'oidlt',
666  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
667{ oid => '610', descr => 'greater than',
668  oprname => '>', oprleft => 'oid', oprright => 'oid', oprresult => 'bool',
669  oprcom => '<(oid,oid)', oprnegate => '<=(oid,oid)', oprcode => 'oidgt',
670  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
671{ oid => '611', descr => 'less than or equal',
672  oprname => '<=', oprleft => 'oid', oprright => 'oid', oprresult => 'bool',
673  oprcom => '>=(oid,oid)', oprnegate => '>(oid,oid)', oprcode => 'oidle',
674  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
675{ oid => '612', descr => 'greater than or equal',
676  oprname => '>=', oprleft => 'oid', oprright => 'oid', oprresult => 'bool',
677  oprcom => '<=(oid,oid)', oprnegate => '<(oid,oid)', oprcode => 'oidge',
678  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
679
680{ oid => '644', descr => 'not equal',
681  oprname => '<>', oprleft => 'oidvector', oprright => 'oidvector',
682  oprresult => 'bool', oprcom => '<>(oidvector,oidvector)',
683  oprnegate => '=(oidvector,oidvector)', oprcode => 'oidvectorne',
684  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
685{ oid => '645', descr => 'less than',
686  oprname => '<', oprleft => 'oidvector', oprright => 'oidvector',
687  oprresult => 'bool', oprcom => '>(oidvector,oidvector)',
688  oprnegate => '>=(oidvector,oidvector)', oprcode => 'oidvectorlt',
689  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
690{ oid => '646', descr => 'greater than',
691  oprname => '>', oprleft => 'oidvector', oprright => 'oidvector',
692  oprresult => 'bool', oprcom => '<(oidvector,oidvector)',
693  oprnegate => '<=(oidvector,oidvector)', oprcode => 'oidvectorgt',
694  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
695{ oid => '647', descr => 'less than or equal',
696  oprname => '<=', oprleft => 'oidvector', oprright => 'oidvector',
697  oprresult => 'bool', oprcom => '>=(oidvector,oidvector)',
698  oprnegate => '>(oidvector,oidvector)', oprcode => 'oidvectorle',
699  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
700{ oid => '648', descr => 'greater than or equal',
701  oprname => '>=', oprleft => 'oidvector', oprright => 'oidvector',
702  oprresult => 'bool', oprcom => '<=(oidvector,oidvector)',
703  oprnegate => '<(oidvector,oidvector)', oprcode => 'oidvectorge',
704  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
705{ oid => '649', descr => 'equal',
706  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'oidvector',
707  oprright => 'oidvector', oprresult => 'bool',
708  oprcom => '=(oidvector,oidvector)', oprnegate => '<>(oidvector,oidvector)',
709  oprcode => 'oidvectoreq', oprrest => 'eqsel', oprjoin => 'eqjoinsel' },
710
711{ oid => '613', descr => 'distance between',
712  oprname => '<->', oprleft => 'point', oprright => 'line',
713  oprresult => 'float8', oprcode => 'dist_pl' },
714{ oid => '614', descr => 'distance between',
715  oprname => '<->', oprleft => 'point', oprright => 'lseg',
716  oprresult => 'float8', oprcode => 'dist_ps' },
717{ oid => '615', descr => 'distance between',
718  oprname => '<->', oprleft => 'point', oprright => 'box',
719  oprresult => 'float8', oprcode => 'dist_pb' },
720{ oid => '616', descr => 'distance between',
721  oprname => '<->', oprleft => 'lseg', oprright => 'line',
722  oprresult => 'float8', oprcode => 'dist_sl' },
723{ oid => '617', descr => 'distance between',
724  oprname => '<->', oprleft => 'lseg', oprright => 'box', oprresult => 'float8',
725  oprcode => 'dist_sb' },
726{ oid => '618', descr => 'distance between',
727  oprname => '<->', oprleft => 'point', oprright => 'path',
728  oprresult => 'float8', oprcode => 'dist_ppath' },
729
730{ oid => '620', descr => 'equal',
731  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'float4',
732  oprright => 'float4', oprresult => 'bool', oprcom => '=(float4,float4)',
733  oprnegate => '<>(float4,float4)', oprcode => 'float4eq', oprrest => 'eqsel',
734  oprjoin => 'eqjoinsel' },
735{ oid => '621', descr => 'not equal',
736  oprname => '<>', oprleft => 'float4', oprright => 'float4',
737  oprresult => 'bool', oprcom => '<>(float4,float4)',
738  oprnegate => '=(float4,float4)', oprcode => 'float4ne', oprrest => 'neqsel',
739  oprjoin => 'neqjoinsel' },
740{ oid => '622', descr => 'less than',
741  oprname => '<', oprleft => 'float4', oprright => 'float4',
742  oprresult => 'bool', oprcom => '>(float4,float4)',
743  oprnegate => '>=(float4,float4)', oprcode => 'float4lt',
744  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
745{ oid => '623', descr => 'greater than',
746  oprname => '>', oprleft => 'float4', oprright => 'float4',
747  oprresult => 'bool', oprcom => '<(float4,float4)',
748  oprnegate => '<=(float4,float4)', oprcode => 'float4gt',
749  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
750{ oid => '624', descr => 'less than or equal',
751  oprname => '<=', oprleft => 'float4', oprright => 'float4',
752  oprresult => 'bool', oprcom => '>=(float4,float4)',
753  oprnegate => '>(float4,float4)', oprcode => 'float4le',
754  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
755{ oid => '625', descr => 'greater than or equal',
756  oprname => '>=', oprleft => 'float4', oprright => 'float4',
757  oprresult => 'bool', oprcom => '<=(float4,float4)',
758  oprnegate => '<(float4,float4)', oprcode => 'float4ge',
759  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
760{ oid => '630', descr => 'not equal',
761  oprname => '<>', oprleft => 'char', oprright => 'char', oprresult => 'bool',
762  oprcom => '<>(char,char)', oprnegate => '=(char,char)', oprcode => 'charne',
763  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
764
765{ oid => '631', descr => 'less than',
766  oprname => '<', oprleft => 'char', oprright => 'char', oprresult => 'bool',
767  oprcom => '>(char,char)', oprnegate => '>=(char,char)', oprcode => 'charlt',
768  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
769{ oid => '632', descr => 'less than or equal',
770  oprname => '<=', oprleft => 'char', oprright => 'char', oprresult => 'bool',
771  oprcom => '>=(char,char)', oprnegate => '>(char,char)', oprcode => 'charle',
772  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
773{ oid => '633', descr => 'greater than',
774  oprname => '>', oprleft => 'char', oprright => 'char', oprresult => 'bool',
775  oprcom => '<(char,char)', oprnegate => '<=(char,char)', oprcode => 'chargt',
776  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
777{ oid => '634', descr => 'greater than or equal',
778  oprname => '>=', oprleft => 'char', oprright => 'char', oprresult => 'bool',
779  oprcom => '<=(char,char)', oprnegate => '<(char,char)', oprcode => 'charge',
780  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
781
782{ oid => '639', oid_symbol => 'OID_NAME_REGEXEQ_OP',
783  descr => 'matches regular expression, case-sensitive',
784  oprname => '~', oprleft => 'name', oprright => 'text', oprresult => 'bool',
785  oprnegate => '!~(name,text)', oprcode => 'nameregexeq',
786  oprrest => 'regexeqsel', oprjoin => 'regexeqjoinsel' },
787{ oid => '640', descr => 'does not match regular expression, case-sensitive',
788  oprname => '!~', oprleft => 'name', oprright => 'text', oprresult => 'bool',
789  oprnegate => '~(name,text)', oprcode => 'nameregexne',
790  oprrest => 'regexnesel', oprjoin => 'regexnejoinsel' },
791{ oid => '641', oid_symbol => 'OID_TEXT_REGEXEQ_OP',
792  descr => 'matches regular expression, case-sensitive',
793  oprname => '~', oprleft => 'text', oprright => 'text', oprresult => 'bool',
794  oprnegate => '!~(text,text)', oprcode => 'textregexeq',
795  oprrest => 'regexeqsel', oprjoin => 'regexeqjoinsel' },
796{ oid => '642', descr => 'does not match regular expression, case-sensitive',
797  oprname => '!~', oprleft => 'text', oprright => 'text', oprresult => 'bool',
798  oprnegate => '~(text,text)', oprcode => 'textregexne',
799  oprrest => 'regexnesel', oprjoin => 'regexnejoinsel' },
800{ oid => '643', descr => 'not equal',
801  oprname => '<>', oprleft => 'name', oprright => 'name', oprresult => 'bool',
802  oprcom => '<>(name,name)', oprnegate => '=(name,name)', oprcode => 'namene',
803  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
804{ oid => '654', descr => 'concatenate',
805  oprname => '||', oprleft => 'text', oprright => 'text', oprresult => 'text',
806  oprcode => 'textcat' },
807
808{ oid => '660', descr => 'less than',
809  oprname => '<', oprleft => 'name', oprright => 'name', oprresult => 'bool',
810  oprcom => '>(name,name)', oprnegate => '>=(name,name)', oprcode => 'namelt',
811  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
812{ oid => '661', descr => 'less than or equal',
813  oprname => '<=', oprleft => 'name', oprright => 'name', oprresult => 'bool',
814  oprcom => '>=(name,name)', oprnegate => '>(name,name)', oprcode => 'namele',
815  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
816{ oid => '662', descr => 'greater than',
817  oprname => '>', oprleft => 'name', oprright => 'name', oprresult => 'bool',
818  oprcom => '<(name,name)', oprnegate => '<=(name,name)', oprcode => 'namegt',
819  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
820{ oid => '663', descr => 'greater than or equal',
821  oprname => '>=', oprleft => 'name', oprright => 'name', oprresult => 'bool',
822  oprcom => '<=(name,name)', oprnegate => '<(name,name)', oprcode => 'namege',
823  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
824{ oid => '664', descr => 'less than',
825  oprname => '<', oprleft => 'text', oprright => 'text', oprresult => 'bool',
826  oprcom => '>(text,text)', oprnegate => '>=(text,text)', oprcode => 'text_lt',
827  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
828{ oid => '665', descr => 'less than or equal',
829  oprname => '<=', oprleft => 'text', oprright => 'text', oprresult => 'bool',
830  oprcom => '>=(text,text)', oprnegate => '>(text,text)', oprcode => 'text_le',
831  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
832{ oid => '666', descr => 'greater than',
833  oprname => '>', oprleft => 'text', oprright => 'text', oprresult => 'bool',
834  oprcom => '<(text,text)', oprnegate => '<=(text,text)', oprcode => 'text_gt',
835  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
836{ oid => '667', descr => 'greater than or equal',
837  oprname => '>=', oprleft => 'text', oprright => 'text', oprresult => 'bool',
838  oprcom => '<=(text,text)', oprnegate => '<(text,text)', oprcode => 'text_ge',
839  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
840
841{ oid => '670', descr => 'equal',
842  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'float8',
843  oprright => 'float8', oprresult => 'bool', oprcom => '=(float8,float8)',
844  oprnegate => '<>(float8,float8)', oprcode => 'float8eq', oprrest => 'eqsel',
845  oprjoin => 'eqjoinsel' },
846{ oid => '671', descr => 'not equal',
847  oprname => '<>', oprleft => 'float8', oprright => 'float8',
848  oprresult => 'bool', oprcom => '<>(float8,float8)',
849  oprnegate => '=(float8,float8)', oprcode => 'float8ne', oprrest => 'neqsel',
850  oprjoin => 'neqjoinsel' },
851{ oid => '672', oid_symbol => 'Float8LessOperator', descr => 'less than',
852  oprname => '<', oprleft => 'float8', oprright => 'float8',
853  oprresult => 'bool', oprcom => '>(float8,float8)',
854  oprnegate => '>=(float8,float8)', oprcode => 'float8lt',
855  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
856{ oid => '673', descr => 'less than or equal',
857  oprname => '<=', oprleft => 'float8', oprright => 'float8',
858  oprresult => 'bool', oprcom => '>=(float8,float8)',
859  oprnegate => '>(float8,float8)', oprcode => 'float8le',
860  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
861{ oid => '674', descr => 'greater than',
862  oprname => '>', oprleft => 'float8', oprright => 'float8',
863  oprresult => 'bool', oprcom => '<(float8,float8)',
864  oprnegate => '<=(float8,float8)', oprcode => 'float8gt',
865  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
866{ oid => '675', descr => 'greater than or equal',
867  oprname => '>=', oprleft => 'float8', oprright => 'float8',
868  oprresult => 'bool', oprcom => '<=(float8,float8)',
869  oprnegate => '<(float8,float8)', oprcode => 'float8ge',
870  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
871
872{ oid => '682', descr => 'absolute value',
873  oprname => '@', oprkind => 'l', oprleft => '0', oprright => 'int2',
874  oprresult => 'int2', oprcode => 'int2abs' },
875{ oid => '684', descr => 'add',
876  oprname => '+', oprleft => 'int8', oprright => 'int8', oprresult => 'int8',
877  oprcom => '+(int8,int8)', oprcode => 'int8pl' },
878{ oid => '685', descr => 'subtract',
879  oprname => '-', oprleft => 'int8', oprright => 'int8', oprresult => 'int8',
880  oprcode => 'int8mi' },
881{ oid => '686', descr => 'multiply',
882  oprname => '*', oprleft => 'int8', oprright => 'int8', oprresult => 'int8',
883  oprcom => '*(int8,int8)', oprcode => 'int8mul' },
884{ oid => '687', descr => 'divide',
885  oprname => '/', oprleft => 'int8', oprright => 'int8', oprresult => 'int8',
886  oprcode => 'int8div' },
887
888{ oid => '688', descr => 'add',
889  oprname => '+', oprleft => 'int8', oprright => 'int4', oprresult => 'int8',
890  oprcom => '+(int4,int8)', oprcode => 'int84pl' },
891{ oid => '689', descr => 'subtract',
892  oprname => '-', oprleft => 'int8', oprright => 'int4', oprresult => 'int8',
893  oprcode => 'int84mi' },
894{ oid => '690', descr => 'multiply',
895  oprname => '*', oprleft => 'int8', oprright => 'int4', oprresult => 'int8',
896  oprcom => '*(int4,int8)', oprcode => 'int84mul' },
897{ oid => '691', descr => 'divide',
898  oprname => '/', oprleft => 'int8', oprright => 'int4', oprresult => 'int8',
899  oprcode => 'int84div' },
900{ oid => '692', descr => 'add',
901  oprname => '+', oprleft => 'int4', oprright => 'int8', oprresult => 'int8',
902  oprcom => '+(int8,int4)', oprcode => 'int48pl' },
903{ oid => '693', descr => 'subtract',
904  oprname => '-', oprleft => 'int4', oprright => 'int8', oprresult => 'int8',
905  oprcode => 'int48mi' },
906{ oid => '694', descr => 'multiply',
907  oprname => '*', oprleft => 'int4', oprright => 'int8', oprresult => 'int8',
908  oprcom => '*(int8,int4)', oprcode => 'int48mul' },
909{ oid => '695', descr => 'divide',
910  oprname => '/', oprleft => 'int4', oprright => 'int8', oprresult => 'int8',
911  oprcode => 'int48div' },
912
913{ oid => '818', descr => 'add',
914  oprname => '+', oprleft => 'int8', oprright => 'int2', oprresult => 'int8',
915  oprcom => '+(int2,int8)', oprcode => 'int82pl' },
916{ oid => '819', descr => 'subtract',
917  oprname => '-', oprleft => 'int8', oprright => 'int2', oprresult => 'int8',
918  oprcode => 'int82mi' },
919{ oid => '820', descr => 'multiply',
920  oprname => '*', oprleft => 'int8', oprright => 'int2', oprresult => 'int8',
921  oprcom => '*(int2,int8)', oprcode => 'int82mul' },
922{ oid => '821', descr => 'divide',
923  oprname => '/', oprleft => 'int8', oprright => 'int2', oprresult => 'int8',
924  oprcode => 'int82div' },
925{ oid => '822', descr => 'add',
926  oprname => '+', oprleft => 'int2', oprright => 'int8', oprresult => 'int8',
927  oprcom => '+(int8,int2)', oprcode => 'int28pl' },
928{ oid => '823', descr => 'subtract',
929  oprname => '-', oprleft => 'int2', oprright => 'int8', oprresult => 'int8',
930  oprcode => 'int28mi' },
931{ oid => '824', descr => 'multiply',
932  oprname => '*', oprleft => 'int2', oprright => 'int8', oprresult => 'int8',
933  oprcom => '*(int8,int2)', oprcode => 'int28mul' },
934{ oid => '825', descr => 'divide',
935  oprname => '/', oprleft => 'int2', oprright => 'int8', oprresult => 'int8',
936  oprcode => 'int28div' },
937
938{ oid => '706', descr => 'distance between',
939  oprname => '<->', oprleft => 'box', oprright => 'box', oprresult => 'float8',
940  oprcom => '<->(box,box)', oprcode => 'box_distance' },
941{ oid => '707', descr => 'distance between',
942  oprname => '<->', oprleft => 'path', oprright => 'path',
943  oprresult => 'float8', oprcom => '<->(path,path)',
944  oprcode => 'path_distance' },
945{ oid => '708', descr => 'distance between',
946  oprname => '<->', oprleft => 'line', oprright => 'line',
947  oprresult => 'float8', oprcom => '<->(line,line)',
948  oprcode => 'line_distance' },
949{ oid => '709', descr => 'distance between',
950  oprname => '<->', oprleft => 'lseg', oprright => 'lseg',
951  oprresult => 'float8', oprcom => '<->(lseg,lseg)',
952  oprcode => 'lseg_distance' },
953{ oid => '712', descr => 'distance between',
954  oprname => '<->', oprleft => 'polygon', oprright => 'polygon',
955  oprresult => 'float8', oprcom => '<->(polygon,polygon)',
956  oprcode => 'poly_distance' },
957
958{ oid => '713', descr => 'not equal',
959  oprname => '<>', oprleft => 'point', oprright => 'point', oprresult => 'bool',
960  oprcom => '<>(point,point)', oprnegate => '~=(point,point)',
961  oprcode => 'point_ne', oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
962
963# add translation/rotation/scaling operators for geometric types. - thomas 97/05/10
964{ oid => '731', descr => 'add points (translate)',
965  oprname => '+', oprleft => 'point', oprright => 'point', oprresult => 'point',
966  oprcom => '+(point,point)', oprcode => 'point_add' },
967{ oid => '732', descr => 'subtract points (translate)',
968  oprname => '-', oprleft => 'point', oprright => 'point', oprresult => 'point',
969  oprcode => 'point_sub' },
970{ oid => '733', descr => 'multiply points (scale/rotate)',
971  oprname => '*', oprleft => 'point', oprright => 'point', oprresult => 'point',
972  oprcom => '*(point,point)', oprcode => 'point_mul' },
973{ oid => '734', descr => 'divide points (scale/rotate)',
974  oprname => '/', oprleft => 'point', oprright => 'point', oprresult => 'point',
975  oprcode => 'point_div' },
976{ oid => '735', descr => 'concatenate',
977  oprname => '+', oprleft => 'path', oprright => 'path', oprresult => 'path',
978  oprcom => '+(path,path)', oprcode => 'path_add' },
979{ oid => '736', descr => 'add (translate path)',
980  oprname => '+', oprleft => 'path', oprright => 'point', oprresult => 'path',
981  oprcode => 'path_add_pt' },
982{ oid => '737', descr => 'subtract (translate path)',
983  oprname => '-', oprleft => 'path', oprright => 'point', oprresult => 'path',
984  oprcode => 'path_sub_pt' },
985{ oid => '738', descr => 'multiply (rotate/scale path)',
986  oprname => '*', oprleft => 'path', oprright => 'point', oprresult => 'path',
987  oprcode => 'path_mul_pt' },
988{ oid => '739', descr => 'divide (rotate/scale path)',
989  oprname => '/', oprleft => 'path', oprright => 'point', oprresult => 'path',
990  oprcode => 'path_div_pt' },
991{ oid => '755', descr => 'contains',
992  oprname => '@>', oprleft => 'path', oprright => 'point', oprresult => 'bool',
993  oprcom => '<@(point,path)', oprcode => 'path_contain_pt' },
994{ oid => '756', descr => 'is contained by',
995  oprname => '<@', oprleft => 'point', oprright => 'polygon',
996  oprresult => 'bool', oprcom => '@>(polygon,point)',
997  oprcode => 'pt_contained_poly', oprrest => 'contsel',
998  oprjoin => 'contjoinsel' },
999{ oid => '757', descr => 'contains',
1000  oprname => '@>', oprleft => 'polygon', oprright => 'point',
1001  oprresult => 'bool', oprcom => '<@(point,polygon)',
1002  oprcode => 'poly_contain_pt', oprrest => 'contsel',
1003  oprjoin => 'contjoinsel' },
1004{ oid => '758', descr => 'is contained by',
1005  oprname => '<@', oprleft => 'point', oprright => 'circle',
1006  oprresult => 'bool', oprcom => '@>(circle,point)',
1007  oprcode => 'pt_contained_circle', oprrest => 'contsel',
1008  oprjoin => 'contjoinsel' },
1009{ oid => '759', descr => 'contains',
1010  oprname => '@>', oprleft => 'circle', oprright => 'point',
1011  oprresult => 'bool', oprcom => '<@(point,circle)',
1012  oprcode => 'circle_contain_pt', oprrest => 'contsel',
1013  oprjoin => 'contjoinsel' },
1014
1015{ oid => '773', descr => 'absolute value',
1016  oprname => '@', oprkind => 'l', oprleft => '0', oprright => 'int4',
1017  oprresult => 'int4', oprcode => 'int4abs' },
1018
1019# additional operators for geometric types - thomas 1997-07-09
1020{ oid => '792', descr => 'equal',
1021  oprname => '=', oprleft => 'path', oprright => 'path', oprresult => 'bool',
1022  oprcom => '=(path,path)', oprcode => 'path_n_eq', oprrest => 'eqsel',
1023  oprjoin => 'eqjoinsel' },
1024{ oid => '793', descr => 'less than',
1025  oprname => '<', oprleft => 'path', oprright => 'path', oprresult => 'bool',
1026  oprcom => '>(path,path)', oprcode => 'path_n_lt' },
1027{ oid => '794', descr => 'greater than',
1028  oprname => '>', oprleft => 'path', oprright => 'path', oprresult => 'bool',
1029  oprcom => '<(path,path)', oprcode => 'path_n_gt' },
1030{ oid => '795', descr => 'less than or equal',
1031  oprname => '<=', oprleft => 'path', oprright => 'path', oprresult => 'bool',
1032  oprcom => '>=(path,path)', oprcode => 'path_n_le' },
1033{ oid => '796', descr => 'greater than or equal',
1034  oprname => '>=', oprleft => 'path', oprright => 'path', oprresult => 'bool',
1035  oprcom => '<=(path,path)', oprcode => 'path_n_ge' },
1036{ oid => '797', descr => 'number of points',
1037  oprname => '#', oprkind => 'l', oprleft => '0', oprright => 'path',
1038  oprresult => 'int4', oprcode => 'path_npoints' },
1039{ oid => '798', descr => 'intersect',
1040  oprname => '?#', oprleft => 'path', oprright => 'path', oprresult => 'bool',
1041  oprcode => 'path_inter' },
1042{ oid => '799', descr => 'sum of path segment lengths',
1043  oprname => '@-@', oprkind => 'l', oprleft => '0', oprright => 'path',
1044  oprresult => 'float8', oprcode => 'path_length' },
1045{ oid => '800', descr => 'is above (allows touching)',
1046  oprname => '>^', oprleft => 'box', oprright => 'box', oprresult => 'bool',
1047  oprcode => 'box_above_eq', oprrest => 'positionsel',
1048  oprjoin => 'positionjoinsel' },
1049{ oid => '801', descr => 'is below (allows touching)',
1050  oprname => '<^', oprleft => 'box', oprright => 'box', oprresult => 'bool',
1051  oprcode => 'box_below_eq', oprrest => 'positionsel',
1052  oprjoin => 'positionjoinsel' },
1053{ oid => '802', descr => 'deprecated, use && instead',
1054  oprname => '?#', oprleft => 'box', oprright => 'box', oprresult => 'bool',
1055  oprcode => 'box_overlap', oprrest => 'areasel', oprjoin => 'areajoinsel' },
1056{ oid => '803', descr => 'box intersection',
1057  oprname => '#', oprleft => 'box', oprright => 'box', oprresult => 'box',
1058  oprcode => 'box_intersect' },
1059{ oid => '804', descr => 'add point to box (translate)',
1060  oprname => '+', oprleft => 'box', oprright => 'point', oprresult => 'box',
1061  oprcode => 'box_add' },
1062{ oid => '805', descr => 'subtract point from box (translate)',
1063  oprname => '-', oprleft => 'box', oprright => 'point', oprresult => 'box',
1064  oprcode => 'box_sub' },
1065{ oid => '806', descr => 'multiply box by point (scale)',
1066  oprname => '*', oprleft => 'box', oprright => 'point', oprresult => 'box',
1067  oprcode => 'box_mul' },
1068{ oid => '807', descr => 'divide box by point (scale)',
1069  oprname => '/', oprleft => 'box', oprright => 'point', oprresult => 'box',
1070  oprcode => 'box_div' },
1071{ oid => '808', descr => 'horizontally aligned',
1072  oprname => '?-', oprleft => 'point', oprright => 'point', oprresult => 'bool',
1073  oprcom => '?-(point,point)', oprcode => 'point_horiz' },
1074{ oid => '809', descr => 'vertically aligned',
1075  oprname => '?|', oprleft => 'point', oprright => 'point', oprresult => 'bool',
1076  oprcom => '?|(point,point)', oprcode => 'point_vert' },
1077
1078{ oid => '811', descr => 'equal',
1079  oprname => '=', oprcanmerge => 't', oprleft => 'tinterval',
1080  oprright => 'tinterval', oprresult => 'bool',
1081  oprcom => '=(tinterval,tinterval)', oprnegate => '<>(tinterval,tinterval)',
1082  oprcode => 'tintervaleq', oprrest => 'eqsel', oprjoin => 'eqjoinsel' },
1083{ oid => '812', descr => 'not equal',
1084  oprname => '<>', oprleft => 'tinterval', oprright => 'tinterval',
1085  oprresult => 'bool', oprcom => '<>(tinterval,tinterval)',
1086  oprnegate => '=(tinterval,tinterval)', oprcode => 'tintervalne',
1087  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
1088{ oid => '813', descr => 'less than',
1089  oprname => '<', oprleft => 'tinterval', oprright => 'tinterval',
1090  oprresult => 'bool', oprcom => '>(tinterval,tinterval)',
1091  oprnegate => '>=(tinterval,tinterval)', oprcode => 'tintervallt',
1092  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
1093{ oid => '814', descr => 'greater than',
1094  oprname => '>', oprleft => 'tinterval', oprright => 'tinterval',
1095  oprresult => 'bool', oprcom => '<(tinterval,tinterval)',
1096  oprnegate => '<=(tinterval,tinterval)', oprcode => 'tintervalgt',
1097  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
1098{ oid => '815', descr => 'less than or equal',
1099  oprname => '<=', oprleft => 'tinterval', oprright => 'tinterval',
1100  oprresult => 'bool', oprcom => '>=(tinterval,tinterval)',
1101  oprnegate => '>(tinterval,tinterval)', oprcode => 'tintervalle',
1102  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
1103{ oid => '816', descr => 'greater than or equal',
1104  oprname => '>=', oprleft => 'tinterval', oprright => 'tinterval',
1105  oprresult => 'bool', oprcom => '<=(tinterval,tinterval)',
1106  oprnegate => '<(tinterval,tinterval)', oprcode => 'tintervalge',
1107  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
1108
1109{ oid => '843', descr => 'multiply',
1110  oprname => '*', oprleft => 'money', oprright => 'float4',
1111  oprresult => 'money', oprcom => '*(float4,money)',
1112  oprcode => 'cash_mul_flt4' },
1113{ oid => '844', descr => 'divide',
1114  oprname => '/', oprleft => 'money', oprright => 'float4',
1115  oprresult => 'money', oprcode => 'cash_div_flt4' },
1116{ oid => '845', descr => 'multiply',
1117  oprname => '*', oprleft => 'float4', oprright => 'money',
1118  oprresult => 'money', oprcom => '*(money,float4)',
1119  oprcode => 'flt4_mul_cash' },
1120
1121{ oid => '900', descr => 'equal',
1122  oprname => '=', oprcanmerge => 't', oprleft => 'money', oprright => 'money',
1123  oprresult => 'bool', oprcom => '=(money,money)',
1124  oprnegate => '<>(money,money)', oprcode => 'cash_eq', oprrest => 'eqsel',
1125  oprjoin => 'eqjoinsel' },
1126{ oid => '901', descr => 'not equal',
1127  oprname => '<>', oprleft => 'money', oprright => 'money', oprresult => 'bool',
1128  oprcom => '<>(money,money)', oprnegate => '=(money,money)',
1129  oprcode => 'cash_ne', oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
1130{ oid => '902', descr => 'less than',
1131  oprname => '<', oprleft => 'money', oprright => 'money', oprresult => 'bool',
1132  oprcom => '>(money,money)', oprnegate => '>=(money,money)',
1133  oprcode => 'cash_lt', oprrest => 'scalarltsel',
1134  oprjoin => 'scalarltjoinsel' },
1135{ oid => '903', descr => 'greater than',
1136  oprname => '>', oprleft => 'money', oprright => 'money', oprresult => 'bool',
1137  oprcom => '<(money,money)', oprnegate => '<=(money,money)',
1138  oprcode => 'cash_gt', oprrest => 'scalargtsel',
1139  oprjoin => 'scalargtjoinsel' },
1140{ oid => '904', descr => 'less than or equal',
1141  oprname => '<=', oprleft => 'money', oprright => 'money', oprresult => 'bool',
1142  oprcom => '>=(money,money)', oprnegate => '>(money,money)',
1143  oprcode => 'cash_le', oprrest => 'scalarlesel',
1144  oprjoin => 'scalarlejoinsel' },
1145{ oid => '905', descr => 'greater than or equal',
1146  oprname => '>=', oprleft => 'money', oprright => 'money', oprresult => 'bool',
1147  oprcom => '<=(money,money)', oprnegate => '<(money,money)',
1148  oprcode => 'cash_ge', oprrest => 'scalargesel',
1149  oprjoin => 'scalargejoinsel' },
1150{ oid => '906', descr => 'add',
1151  oprname => '+', oprleft => 'money', oprright => 'money', oprresult => 'money',
1152  oprcom => '+(money,money)', oprcode => 'cash_pl' },
1153{ oid => '907', descr => 'subtract',
1154  oprname => '-', oprleft => 'money', oprright => 'money', oprresult => 'money',
1155  oprcode => 'cash_mi' },
1156{ oid => '908', descr => 'multiply',
1157  oprname => '*', oprleft => 'money', oprright => 'float8',
1158  oprresult => 'money', oprcom => '*(float8,money)',
1159  oprcode => 'cash_mul_flt8' },
1160{ oid => '909', descr => 'divide',
1161  oprname => '/', oprleft => 'money', oprright => 'float8',
1162  oprresult => 'money', oprcode => 'cash_div_flt8' },
1163{ oid => '3346', descr => 'multiply',
1164  oprname => '*', oprleft => 'money', oprright => 'int8', oprresult => 'money',
1165  oprcom => '*(int8,money)', oprcode => 'cash_mul_int8' },
1166{ oid => '3347', descr => 'divide',
1167  oprname => '/', oprleft => 'money', oprright => 'int8', oprresult => 'money',
1168  oprcode => 'cash_div_int8' },
1169{ oid => '912', descr => 'multiply',
1170  oprname => '*', oprleft => 'money', oprright => 'int4', oprresult => 'money',
1171  oprcom => '*(int4,money)', oprcode => 'cash_mul_int4' },
1172{ oid => '913', descr => 'divide',
1173  oprname => '/', oprleft => 'money', oprright => 'int4', oprresult => 'money',
1174  oprcode => 'cash_div_int4' },
1175{ oid => '914', descr => 'multiply',
1176  oprname => '*', oprleft => 'money', oprright => 'int2', oprresult => 'money',
1177  oprcom => '*(int2,money)', oprcode => 'cash_mul_int2' },
1178{ oid => '915', descr => 'divide',
1179  oprname => '/', oprleft => 'money', oprright => 'int2', oprresult => 'money',
1180  oprcode => 'cash_div_int2' },
1181{ oid => '916', descr => 'multiply',
1182  oprname => '*', oprleft => 'float8', oprright => 'money',
1183  oprresult => 'money', oprcom => '*(money,float8)',
1184  oprcode => 'flt8_mul_cash' },
1185{ oid => '3349', descr => 'multiply',
1186  oprname => '*', oprleft => 'int8', oprright => 'money', oprresult => 'money',
1187  oprcom => '*(money,int8)', oprcode => 'int8_mul_cash' },
1188{ oid => '917', descr => 'multiply',
1189  oprname => '*', oprleft => 'int4', oprright => 'money', oprresult => 'money',
1190  oprcom => '*(money,int4)', oprcode => 'int4_mul_cash' },
1191{ oid => '918', descr => 'multiply',
1192  oprname => '*', oprleft => 'int2', oprright => 'money', oprresult => 'money',
1193  oprcom => '*(money,int2)', oprcode => 'int2_mul_cash' },
1194{ oid => '3825', descr => 'divide',
1195  oprname => '/', oprleft => 'money', oprright => 'money',
1196  oprresult => 'float8', oprcode => 'cash_div_cash' },
1197
1198{ oid => '965', descr => 'exponentiation',
1199  oprname => '^', oprleft => 'float8', oprright => 'float8',
1200  oprresult => 'float8', oprcode => 'dpow' },
1201{ oid => '966', descr => 'add/update ACL item',
1202  oprname => '+', oprleft => '_aclitem', oprright => 'aclitem',
1203  oprresult => '_aclitem', oprcode => 'aclinsert' },
1204{ oid => '967', descr => 'remove ACL item',
1205  oprname => '-', oprleft => '_aclitem', oprright => 'aclitem',
1206  oprresult => '_aclitem', oprcode => 'aclremove' },
1207{ oid => '968', descr => 'contains',
1208  oprname => '@>', oprleft => '_aclitem', oprright => 'aclitem',
1209  oprresult => 'bool', oprcode => 'aclcontains' },
1210{ oid => '974', descr => 'equal',
1211  oprname => '=', oprcanhash => 't', oprleft => 'aclitem',
1212  oprright => 'aclitem', oprresult => 'bool', oprcom => '=(aclitem,aclitem)',
1213  oprcode => 'aclitemeq', oprrest => 'eqsel', oprjoin => 'eqjoinsel' },
1214
1215# additional geometric operators - thomas 1997-07-09
1216{ oid => '969', descr => 'center of',
1217  oprname => '@@', oprkind => 'l', oprleft => '0', oprright => 'lseg',
1218  oprresult => 'point', oprcode => 'lseg_center' },
1219{ oid => '970', descr => 'center of',
1220  oprname => '@@', oprkind => 'l', oprleft => '0', oprright => 'path',
1221  oprresult => 'point', oprcode => 'path_center' },
1222{ oid => '971', descr => 'center of',
1223  oprname => '@@', oprkind => 'l', oprleft => '0', oprright => 'polygon',
1224  oprresult => 'point', oprcode => 'poly_center' },
1225
1226{ oid => '1054', descr => 'equal',
1227  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'bpchar',
1228  oprright => 'bpchar', oprresult => 'bool', oprcom => '=(bpchar,bpchar)',
1229  oprnegate => '<>(bpchar,bpchar)', oprcode => 'bpchareq', oprrest => 'eqsel',
1230  oprjoin => 'eqjoinsel' },
1231
1232{ oid => '1055', oid_symbol => 'OID_BPCHAR_REGEXEQ_OP',
1233  descr => 'matches regular expression, case-sensitive',
1234  oprname => '~', oprleft => 'bpchar', oprright => 'text', oprresult => 'bool',
1235  oprnegate => '!~(bpchar,text)', oprcode => 'bpcharregexeq',
1236  oprrest => 'regexeqsel', oprjoin => 'regexeqjoinsel' },
1237{ oid => '1056', descr => 'does not match regular expression, case-sensitive',
1238  oprname => '!~', oprleft => 'bpchar', oprright => 'text', oprresult => 'bool',
1239  oprnegate => '~(bpchar,text)', oprcode => 'bpcharregexne',
1240  oprrest => 'regexnesel', oprjoin => 'regexnejoinsel' },
1241{ oid => '1057', descr => 'not equal',
1242  oprname => '<>', oprleft => 'bpchar', oprright => 'bpchar',
1243  oprresult => 'bool', oprcom => '<>(bpchar,bpchar)',
1244  oprnegate => '=(bpchar,bpchar)', oprcode => 'bpcharne', oprrest => 'neqsel',
1245  oprjoin => 'neqjoinsel' },
1246{ oid => '1058', descr => 'less than',
1247  oprname => '<', oprleft => 'bpchar', oprright => 'bpchar',
1248  oprresult => 'bool', oprcom => '>(bpchar,bpchar)',
1249  oprnegate => '>=(bpchar,bpchar)', oprcode => 'bpcharlt',
1250  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
1251{ oid => '1059', descr => 'less than or equal',
1252  oprname => '<=', oprleft => 'bpchar', oprright => 'bpchar',
1253  oprresult => 'bool', oprcom => '>=(bpchar,bpchar)',
1254  oprnegate => '>(bpchar,bpchar)', oprcode => 'bpcharle',
1255  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
1256{ oid => '1060', descr => 'greater than',
1257  oprname => '>', oprleft => 'bpchar', oprright => 'bpchar',
1258  oprresult => 'bool', oprcom => '<(bpchar,bpchar)',
1259  oprnegate => '<=(bpchar,bpchar)', oprcode => 'bpchargt',
1260  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
1261{ oid => '1061', descr => 'greater than or equal',
1262  oprname => '>=', oprleft => 'bpchar', oprright => 'bpchar',
1263  oprresult => 'bool', oprcom => '<=(bpchar,bpchar)',
1264  oprnegate => '<(bpchar,bpchar)', oprcode => 'bpcharge',
1265  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
1266
1267# generic array comparison operators
1268{ oid => '1070', oid_symbol => 'ARRAY_EQ_OP', descr => 'equal',
1269  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'anyarray',
1270  oprright => 'anyarray', oprresult => 'bool', oprcom => '=(anyarray,anyarray)',
1271  oprnegate => '<>(anyarray,anyarray)', oprcode => 'array_eq',
1272  oprrest => 'eqsel', oprjoin => 'eqjoinsel' },
1273{ oid => '1071', descr => 'not equal',
1274  oprname => '<>', oprleft => 'anyarray', oprright => 'anyarray',
1275  oprresult => 'bool', oprcom => '<>(anyarray,anyarray)',
1276  oprnegate => '=(anyarray,anyarray)', oprcode => 'array_ne',
1277  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
1278{ oid => '1072', oid_symbol => 'ARRAY_LT_OP', descr => 'less than',
1279  oprname => '<', oprleft => 'anyarray', oprright => 'anyarray',
1280  oprresult => 'bool', oprcom => '>(anyarray,anyarray)',
1281  oprnegate => '>=(anyarray,anyarray)', oprcode => 'array_lt',
1282  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
1283{ oid => '1073', oid_symbol => 'ARRAY_GT_OP', descr => 'greater than',
1284  oprname => '>', oprleft => 'anyarray', oprright => 'anyarray',
1285  oprresult => 'bool', oprcom => '<(anyarray,anyarray)',
1286  oprnegate => '<=(anyarray,anyarray)', oprcode => 'array_gt',
1287  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
1288{ oid => '1074', descr => 'less than or equal',
1289  oprname => '<=', oprleft => 'anyarray', oprright => 'anyarray',
1290  oprresult => 'bool', oprcom => '>=(anyarray,anyarray)',
1291  oprnegate => '>(anyarray,anyarray)', oprcode => 'array_le',
1292  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
1293{ oid => '1075', descr => 'greater than or equal',
1294  oprname => '>=', oprleft => 'anyarray', oprright => 'anyarray',
1295  oprresult => 'bool', oprcom => '<=(anyarray,anyarray)',
1296  oprnegate => '<(anyarray,anyarray)', oprcode => 'array_ge',
1297  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
1298
1299# date operators
1300{ oid => '1076', descr => 'add',
1301  oprname => '+', oprleft => 'date', oprright => 'interval',
1302  oprresult => 'timestamp', oprcom => '+(interval,date)',
1303  oprcode => 'date_pl_interval' },
1304{ oid => '1077', descr => 'subtract',
1305  oprname => '-', oprleft => 'date', oprright => 'interval',
1306  oprresult => 'timestamp', oprcode => 'date_mi_interval' },
1307{ oid => '1093', descr => 'equal',
1308  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'date',
1309  oprright => 'date', oprresult => 'bool', oprcom => '=(date,date)',
1310  oprnegate => '<>(date,date)', oprcode => 'date_eq', oprrest => 'eqsel',
1311  oprjoin => 'eqjoinsel' },
1312{ oid => '1094', descr => 'not equal',
1313  oprname => '<>', oprleft => 'date', oprright => 'date', oprresult => 'bool',
1314  oprcom => '<>(date,date)', oprnegate => '=(date,date)', oprcode => 'date_ne',
1315  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
1316{ oid => '1095', descr => 'less than',
1317  oprname => '<', oprleft => 'date', oprright => 'date', oprresult => 'bool',
1318  oprcom => '>(date,date)', oprnegate => '>=(date,date)', oprcode => 'date_lt',
1319  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
1320{ oid => '1096', descr => 'less than or equal',
1321  oprname => '<=', oprleft => 'date', oprright => 'date', oprresult => 'bool',
1322  oprcom => '>=(date,date)', oprnegate => '>(date,date)', oprcode => 'date_le',
1323  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
1324{ oid => '1097', descr => 'greater than',
1325  oprname => '>', oprleft => 'date', oprright => 'date', oprresult => 'bool',
1326  oprcom => '<(date,date)', oprnegate => '<=(date,date)', oprcode => 'date_gt',
1327  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
1328{ oid => '1098', descr => 'greater than or equal',
1329  oprname => '>=', oprleft => 'date', oprright => 'date', oprresult => 'bool',
1330  oprcom => '<=(date,date)', oprnegate => '<(date,date)', oprcode => 'date_ge',
1331  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
1332{ oid => '1099', descr => 'subtract',
1333  oprname => '-', oprleft => 'date', oprright => 'date', oprresult => 'int4',
1334  oprcode => 'date_mi' },
1335{ oid => '1100', descr => 'add',
1336  oprname => '+', oprleft => 'date', oprright => 'int4', oprresult => 'date',
1337  oprcom => '+(int4,date)', oprcode => 'date_pli' },
1338{ oid => '1101', descr => 'subtract',
1339  oprname => '-', oprleft => 'date', oprright => 'int4', oprresult => 'date',
1340  oprcode => 'date_mii' },
1341
1342# time operators
1343{ oid => '1108', descr => 'equal',
1344  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'time',
1345  oprright => 'time', oprresult => 'bool', oprcom => '=(time,time)',
1346  oprnegate => '<>(time,time)', oprcode => 'time_eq', oprrest => 'eqsel',
1347  oprjoin => 'eqjoinsel' },
1348{ oid => '1109', descr => 'not equal',
1349  oprname => '<>', oprleft => 'time', oprright => 'time', oprresult => 'bool',
1350  oprcom => '<>(time,time)', oprnegate => '=(time,time)', oprcode => 'time_ne',
1351  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
1352{ oid => '1110', descr => 'less than',
1353  oprname => '<', oprleft => 'time', oprright => 'time', oprresult => 'bool',
1354  oprcom => '>(time,time)', oprnegate => '>=(time,time)', oprcode => 'time_lt',
1355  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
1356{ oid => '1111', descr => 'less than or equal',
1357  oprname => '<=', oprleft => 'time', oprright => 'time', oprresult => 'bool',
1358  oprcom => '>=(time,time)', oprnegate => '>(time,time)', oprcode => 'time_le',
1359  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
1360{ oid => '1112', descr => 'greater than',
1361  oprname => '>', oprleft => 'time', oprright => 'time', oprresult => 'bool',
1362  oprcom => '<(time,time)', oprnegate => '<=(time,time)', oprcode => 'time_gt',
1363  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
1364{ oid => '1113', descr => 'greater than or equal',
1365  oprname => '>=', oprleft => 'time', oprright => 'time', oprresult => 'bool',
1366  oprcom => '<=(time,time)', oprnegate => '<(time,time)', oprcode => 'time_ge',
1367  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
1368
1369# timetz operators
1370{ oid => '1550', descr => 'equal',
1371  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'timetz',
1372  oprright => 'timetz', oprresult => 'bool', oprcom => '=(timetz,timetz)',
1373  oprnegate => '<>(timetz,timetz)', oprcode => 'timetz_eq', oprrest => 'eqsel',
1374  oprjoin => 'eqjoinsel' },
1375{ oid => '1551', descr => 'not equal',
1376  oprname => '<>', oprleft => 'timetz', oprright => 'timetz',
1377  oprresult => 'bool', oprcom => '<>(timetz,timetz)',
1378  oprnegate => '=(timetz,timetz)', oprcode => 'timetz_ne', oprrest => 'neqsel',
1379  oprjoin => 'neqjoinsel' },
1380{ oid => '1552', descr => 'less than',
1381  oprname => '<', oprleft => 'timetz', oprright => 'timetz',
1382  oprresult => 'bool', oprcom => '>(timetz,timetz)',
1383  oprnegate => '>=(timetz,timetz)', oprcode => 'timetz_lt',
1384  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
1385{ oid => '1553', descr => 'less than or equal',
1386  oprname => '<=', oprleft => 'timetz', oprright => 'timetz',
1387  oprresult => 'bool', oprcom => '>=(timetz,timetz)',
1388  oprnegate => '>(timetz,timetz)', oprcode => 'timetz_le',
1389  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
1390{ oid => '1554', descr => 'greater than',
1391  oprname => '>', oprleft => 'timetz', oprright => 'timetz',
1392  oprresult => 'bool', oprcom => '<(timetz,timetz)',
1393  oprnegate => '<=(timetz,timetz)', oprcode => 'timetz_gt',
1394  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
1395{ oid => '1555', descr => 'greater than or equal',
1396  oprname => '>=', oprleft => 'timetz', oprright => 'timetz',
1397  oprresult => 'bool', oprcom => '<=(timetz,timetz)',
1398  oprnegate => '<(timetz,timetz)', oprcode => 'timetz_ge',
1399  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
1400
1401# float48 operators
1402{ oid => '1116', descr => 'add',
1403  oprname => '+', oprleft => 'float4', oprright => 'float8',
1404  oprresult => 'float8', oprcom => '+(float8,float4)', oprcode => 'float48pl' },
1405{ oid => '1117', descr => 'subtract',
1406  oprname => '-', oprleft => 'float4', oprright => 'float8',
1407  oprresult => 'float8', oprcode => 'float48mi' },
1408{ oid => '1118', descr => 'divide',
1409  oprname => '/', oprleft => 'float4', oprright => 'float8',
1410  oprresult => 'float8', oprcode => 'float48div' },
1411{ oid => '1119', descr => 'multiply',
1412  oprname => '*', oprleft => 'float4', oprright => 'float8',
1413  oprresult => 'float8', oprcom => '*(float8,float4)',
1414  oprcode => 'float48mul' },
1415{ oid => '1120', descr => 'equal',
1416  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'float4',
1417  oprright => 'float8', oprresult => 'bool', oprcom => '=(float8,float4)',
1418  oprnegate => '<>(float4,float8)', oprcode => 'float48eq', oprrest => 'eqsel',
1419  oprjoin => 'eqjoinsel' },
1420{ oid => '1121', descr => 'not equal',
1421  oprname => '<>', oprleft => 'float4', oprright => 'float8',
1422  oprresult => 'bool', oprcom => '<>(float8,float4)',
1423  oprnegate => '=(float4,float8)', oprcode => 'float48ne', oprrest => 'neqsel',
1424  oprjoin => 'neqjoinsel' },
1425{ oid => '1122', descr => 'less than',
1426  oprname => '<', oprleft => 'float4', oprright => 'float8',
1427  oprresult => 'bool', oprcom => '>(float8,float4)',
1428  oprnegate => '>=(float4,float8)', oprcode => 'float48lt',
1429  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
1430{ oid => '1123', descr => 'greater than',
1431  oprname => '>', oprleft => 'float4', oprright => 'float8',
1432  oprresult => 'bool', oprcom => '<(float8,float4)',
1433  oprnegate => '<=(float4,float8)', oprcode => 'float48gt',
1434  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
1435{ oid => '1124', descr => 'less than or equal',
1436  oprname => '<=', oprleft => 'float4', oprright => 'float8',
1437  oprresult => 'bool', oprcom => '>=(float8,float4)',
1438  oprnegate => '>(float4,float8)', oprcode => 'float48le',
1439  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
1440{ oid => '1125', descr => 'greater than or equal',
1441  oprname => '>=', oprleft => 'float4', oprright => 'float8',
1442  oprresult => 'bool', oprcom => '<=(float8,float4)',
1443  oprnegate => '<(float4,float8)', oprcode => 'float48ge',
1444  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
1445
1446# float84 operators
1447{ oid => '1126', descr => 'add',
1448  oprname => '+', oprleft => 'float8', oprright => 'float4',
1449  oprresult => 'float8', oprcom => '+(float4,float8)', oprcode => 'float84pl' },
1450{ oid => '1127', descr => 'subtract',
1451  oprname => '-', oprleft => 'float8', oprright => 'float4',
1452  oprresult => 'float8', oprcode => 'float84mi' },
1453{ oid => '1128', descr => 'divide',
1454  oprname => '/', oprleft => 'float8', oprright => 'float4',
1455  oprresult => 'float8', oprcode => 'float84div' },
1456{ oid => '1129', descr => 'multiply',
1457  oprname => '*', oprleft => 'float8', oprright => 'float4',
1458  oprresult => 'float8', oprcom => '*(float4,float8)',
1459  oprcode => 'float84mul' },
1460{ oid => '1130', descr => 'equal',
1461  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'float8',
1462  oprright => 'float4', oprresult => 'bool', oprcom => '=(float4,float8)',
1463  oprnegate => '<>(float8,float4)', oprcode => 'float84eq', oprrest => 'eqsel',
1464  oprjoin => 'eqjoinsel' },
1465{ oid => '1131', descr => 'not equal',
1466  oprname => '<>', oprleft => 'float8', oprright => 'float4',
1467  oprresult => 'bool', oprcom => '<>(float4,float8)',
1468  oprnegate => '=(float8,float4)', oprcode => 'float84ne', oprrest => 'neqsel',
1469  oprjoin => 'neqjoinsel' },
1470{ oid => '1132', descr => 'less than',
1471  oprname => '<', oprleft => 'float8', oprright => 'float4',
1472  oprresult => 'bool', oprcom => '>(float4,float8)',
1473  oprnegate => '>=(float8,float4)', oprcode => 'float84lt',
1474  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
1475{ oid => '1133', descr => 'greater than',
1476  oprname => '>', oprleft => 'float8', oprright => 'float4',
1477  oprresult => 'bool', oprcom => '<(float4,float8)',
1478  oprnegate => '<=(float8,float4)', oprcode => 'float84gt',
1479  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
1480{ oid => '1134', descr => 'less than or equal',
1481  oprname => '<=', oprleft => 'float8', oprright => 'float4',
1482  oprresult => 'bool', oprcom => '>=(float4,float8)',
1483  oprnegate => '>(float8,float4)', oprcode => 'float84le',
1484  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
1485{ oid => '1135', descr => 'greater than or equal',
1486  oprname => '>=', oprleft => 'float8', oprright => 'float4',
1487  oprresult => 'bool', oprcom => '<=(float4,float8)',
1488  oprnegate => '<(float8,float4)', oprcode => 'float84ge',
1489  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
1490
1491# LIKE hacks by Keith Parks.
1492{ oid => '1207', oid_symbol => 'OID_NAME_LIKE_OP',
1493  descr => 'matches LIKE expression',
1494  oprname => '~~', oprleft => 'name', oprright => 'text', oprresult => 'bool',
1495  oprnegate => '!~~(name,text)', oprcode => 'namelike', oprrest => 'likesel',
1496  oprjoin => 'likejoinsel' },
1497{ oid => '1208', descr => 'does not match LIKE expression',
1498  oprname => '!~~', oprleft => 'name', oprright => 'text', oprresult => 'bool',
1499  oprnegate => '~~(name,text)', oprcode => 'namenlike', oprrest => 'nlikesel',
1500  oprjoin => 'nlikejoinsel' },
1501{ oid => '1209', oid_symbol => 'OID_TEXT_LIKE_OP',
1502  descr => 'matches LIKE expression',
1503  oprname => '~~', oprleft => 'text', oprright => 'text', oprresult => 'bool',
1504  oprnegate => '!~~(text,text)', oprcode => 'textlike', oprrest => 'likesel',
1505  oprjoin => 'likejoinsel' },
1506{ oid => '1210', descr => 'does not match LIKE expression',
1507  oprname => '!~~', oprleft => 'text', oprright => 'text', oprresult => 'bool',
1508  oprnegate => '~~(text,text)', oprcode => 'textnlike', oprrest => 'nlikesel',
1509  oprjoin => 'nlikejoinsel' },
1510{ oid => '1211', oid_symbol => 'OID_BPCHAR_LIKE_OP',
1511  descr => 'matches LIKE expression',
1512  oprname => '~~', oprleft => 'bpchar', oprright => 'text', oprresult => 'bool',
1513  oprnegate => '!~~(bpchar,text)', oprcode => 'bpcharlike',
1514  oprrest => 'likesel', oprjoin => 'likejoinsel' },
1515{ oid => '1212', descr => 'does not match LIKE expression',
1516  oprname => '!~~', oprleft => 'bpchar', oprright => 'text',
1517  oprresult => 'bool', oprnegate => '~~(bpchar,text)', oprcode => 'bpcharnlike',
1518  oprrest => 'nlikesel', oprjoin => 'nlikejoinsel' },
1519
1520# case-insensitive regex hacks
1521{ oid => '1226', oid_symbol => 'OID_NAME_ICREGEXEQ_OP',
1522  descr => 'matches regular expression, case-insensitive',
1523  oprname => '~*', oprleft => 'name', oprright => 'text', oprresult => 'bool',
1524  oprnegate => '!~*(name,text)', oprcode => 'nameicregexeq',
1525  oprrest => 'icregexeqsel', oprjoin => 'icregexeqjoinsel' },
1526{ oid => '1227',
1527  descr => 'does not match regular expression, case-insensitive',
1528  oprname => '!~*', oprleft => 'name', oprright => 'text', oprresult => 'bool',
1529  oprnegate => '~*(name,text)', oprcode => 'nameicregexne',
1530  oprrest => 'icregexnesel', oprjoin => 'icregexnejoinsel' },
1531{ oid => '1228', oid_symbol => 'OID_TEXT_ICREGEXEQ_OP',
1532  descr => 'matches regular expression, case-insensitive',
1533  oprname => '~*', oprleft => 'text', oprright => 'text', oprresult => 'bool',
1534  oprnegate => '!~*(text,text)', oprcode => 'texticregexeq',
1535  oprrest => 'icregexeqsel', oprjoin => 'icregexeqjoinsel' },
1536{ oid => '1229',
1537  descr => 'does not match regular expression, case-insensitive',
1538  oprname => '!~*', oprleft => 'text', oprright => 'text', oprresult => 'bool',
1539  oprnegate => '~*(text,text)', oprcode => 'texticregexne',
1540  oprrest => 'icregexnesel', oprjoin => 'icregexnejoinsel' },
1541{ oid => '1234', oid_symbol => 'OID_BPCHAR_ICREGEXEQ_OP',
1542  descr => 'matches regular expression, case-insensitive',
1543  oprname => '~*', oprleft => 'bpchar', oprright => 'text', oprresult => 'bool',
1544  oprnegate => '!~*(bpchar,text)', oprcode => 'bpcharicregexeq',
1545  oprrest => 'icregexeqsel', oprjoin => 'icregexeqjoinsel' },
1546{ oid => '1235',
1547  descr => 'does not match regular expression, case-insensitive',
1548  oprname => '!~*', oprleft => 'bpchar', oprright => 'text',
1549  oprresult => 'bool', oprnegate => '~*(bpchar,text)',
1550  oprcode => 'bpcharicregexne', oprrest => 'icregexnesel',
1551  oprjoin => 'icregexnejoinsel' },
1552
1553# timestamptz operators
1554{ oid => '1320', descr => 'equal',
1555  oprname => '=', oprcanmerge => 't', oprcanhash => 't',
1556  oprleft => 'timestamptz', oprright => 'timestamptz', oprresult => 'bool',
1557  oprcom => '=(timestamptz,timestamptz)',
1558  oprnegate => '<>(timestamptz,timestamptz)', oprcode => 'timestamptz_eq',
1559  oprrest => 'eqsel', oprjoin => 'eqjoinsel' },
1560{ oid => '1321', descr => 'not equal',
1561  oprname => '<>', oprleft => 'timestamptz', oprright => 'timestamptz',
1562  oprresult => 'bool', oprcom => '<>(timestamptz,timestamptz)',
1563  oprnegate => '=(timestamptz,timestamptz)', oprcode => 'timestamptz_ne',
1564  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
1565{ oid => '1322', descr => 'less than',
1566  oprname => '<', oprleft => 'timestamptz', oprright => 'timestamptz',
1567  oprresult => 'bool', oprcom => '>(timestamptz,timestamptz)',
1568  oprnegate => '>=(timestamptz,timestamptz)', oprcode => 'timestamptz_lt',
1569  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
1570{ oid => '1323', descr => 'less than or equal',
1571  oprname => '<=', oprleft => 'timestamptz', oprright => 'timestamptz',
1572  oprresult => 'bool', oprcom => '>=(timestamptz,timestamptz)',
1573  oprnegate => '>(timestamptz,timestamptz)', oprcode => 'timestamptz_le',
1574  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
1575{ oid => '1324', descr => 'greater than',
1576  oprname => '>', oprleft => 'timestamptz', oprright => 'timestamptz',
1577  oprresult => 'bool', oprcom => '<(timestamptz,timestamptz)',
1578  oprnegate => '<=(timestamptz,timestamptz)', oprcode => 'timestamptz_gt',
1579  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
1580{ oid => '1325', descr => 'greater than or equal',
1581  oprname => '>=', oprleft => 'timestamptz', oprright => 'timestamptz',
1582  oprresult => 'bool', oprcom => '<=(timestamptz,timestamptz)',
1583  oprnegate => '<(timestamptz,timestamptz)', oprcode => 'timestamptz_ge',
1584  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
1585{ oid => '1327', descr => 'add',
1586  oprname => '+', oprleft => 'timestamptz', oprright => 'interval',
1587  oprresult => 'timestamptz', oprcom => '+(interval,timestamptz)',
1588  oprcode => 'timestamptz_pl_interval' },
1589{ oid => '1328', descr => 'subtract',
1590  oprname => '-', oprleft => 'timestamptz', oprright => 'timestamptz',
1591  oprresult => 'interval', oprcode => 'timestamptz_mi' },
1592{ oid => '1329', descr => 'subtract',
1593  oprname => '-', oprleft => 'timestamptz', oprright => 'interval',
1594  oprresult => 'timestamptz', oprcode => 'timestamptz_mi_interval' },
1595
1596# interval operators
1597{ oid => '1330', descr => 'equal',
1598  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'interval',
1599  oprright => 'interval', oprresult => 'bool', oprcom => '=(interval,interval)',
1600  oprnegate => '<>(interval,interval)', oprcode => 'interval_eq',
1601  oprrest => 'eqsel', oprjoin => 'eqjoinsel' },
1602{ oid => '1331', descr => 'not equal',
1603  oprname => '<>', oprleft => 'interval', oprright => 'interval',
1604  oprresult => 'bool', oprcom => '<>(interval,interval)',
1605  oprnegate => '=(interval,interval)', oprcode => 'interval_ne',
1606  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
1607{ oid => '1332', descr => 'less than',
1608  oprname => '<', oprleft => 'interval', oprright => 'interval',
1609  oprresult => 'bool', oprcom => '>(interval,interval)',
1610  oprnegate => '>=(interval,interval)', oprcode => 'interval_lt',
1611  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
1612{ oid => '1333', descr => 'less than or equal',
1613  oprname => '<=', oprleft => 'interval', oprright => 'interval',
1614  oprresult => 'bool', oprcom => '>=(interval,interval)',
1615  oprnegate => '>(interval,interval)', oprcode => 'interval_le',
1616  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
1617{ oid => '1334', descr => 'greater than',
1618  oprname => '>', oprleft => 'interval', oprright => 'interval',
1619  oprresult => 'bool', oprcom => '<(interval,interval)',
1620  oprnegate => '<=(interval,interval)', oprcode => 'interval_gt',
1621  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
1622{ oid => '1335', descr => 'greater than or equal',
1623  oprname => '>=', oprleft => 'interval', oprright => 'interval',
1624  oprresult => 'bool', oprcom => '<=(interval,interval)',
1625  oprnegate => '<(interval,interval)', oprcode => 'interval_ge',
1626  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
1627
1628{ oid => '1336', descr => 'negate',
1629  oprname => '-', oprkind => 'l', oprleft => '0', oprright => 'interval',
1630  oprresult => 'interval', oprcode => 'interval_um' },
1631{ oid => '1337', descr => 'add',
1632  oprname => '+', oprleft => 'interval', oprright => 'interval',
1633  oprresult => 'interval', oprcom => '+(interval,interval)',
1634  oprcode => 'interval_pl' },
1635{ oid => '1338', descr => 'subtract',
1636  oprname => '-', oprleft => 'interval', oprright => 'interval',
1637  oprresult => 'interval', oprcode => 'interval_mi' },
1638
1639{ oid => '1360', descr => 'convert date and time to timestamp',
1640  oprname => '+', oprleft => 'date', oprright => 'time',
1641  oprresult => 'timestamp', oprcom => '+(time,date)',
1642  oprcode => 'datetime_pl' },
1643{ oid => '1361',
1644  descr => 'convert date and time with time zone to timestamp with time zone',
1645  oprname => '+', oprleft => 'date', oprright => 'timetz',
1646  oprresult => 'timestamptz', oprcom => '+(timetz,date)',
1647  oprcode => 'datetimetz_pl' },
1648{ oid => '1363', descr => 'convert time and date to timestamp',
1649  oprname => '+', oprleft => 'time', oprright => 'date',
1650  oprresult => 'timestamp', oprcom => '+(date,time)',
1651  oprcode => 'timedate_pl' },
1652{ oid => '1366',
1653  descr => 'convert time with time zone and date to timestamp with time zone',
1654  oprname => '+', oprleft => 'timetz', oprright => 'date',
1655  oprresult => 'timestamptz', oprcom => '+(date,timetz)',
1656  oprcode => 'timetzdate_pl' },
1657
1658{ oid => '1399', descr => 'subtract',
1659  oprname => '-', oprleft => 'time', oprright => 'time',
1660  oprresult => 'interval', oprcode => 'time_mi_time' },
1661
1662# additional geometric operators - thomas 97/04/18
1663{ oid => '1420', descr => 'center of',
1664  oprname => '@@', oprkind => 'l', oprleft => '0', oprright => 'circle',
1665  oprresult => 'point', oprcode => 'circle_center' },
1666{ oid => '1500', descr => 'equal by area',
1667  oprname => '=', oprleft => 'circle', oprright => 'circle',
1668  oprresult => 'bool', oprcom => '=(circle,circle)',
1669  oprnegate => '<>(circle,circle)', oprcode => 'circle_eq', oprrest => 'eqsel',
1670  oprjoin => 'eqjoinsel' },
1671{ oid => '1501', descr => 'not equal by area',
1672  oprname => '<>', oprleft => 'circle', oprright => 'circle',
1673  oprresult => 'bool', oprcom => '<>(circle,circle)',
1674  oprnegate => '=(circle,circle)', oprcode => 'circle_ne', oprrest => 'neqsel',
1675  oprjoin => 'neqjoinsel' },
1676{ oid => '1502', descr => 'less than by area',
1677  oprname => '<', oprleft => 'circle', oprright => 'circle',
1678  oprresult => 'bool', oprcom => '>(circle,circle)',
1679  oprnegate => '>=(circle,circle)', oprcode => 'circle_lt',
1680  oprrest => 'areasel', oprjoin => 'areajoinsel' },
1681{ oid => '1503', descr => 'greater than by area',
1682  oprname => '>', oprleft => 'circle', oprright => 'circle',
1683  oprresult => 'bool', oprcom => '<(circle,circle)',
1684  oprnegate => '<=(circle,circle)', oprcode => 'circle_gt',
1685  oprrest => 'areasel', oprjoin => 'areajoinsel' },
1686{ oid => '1504', descr => 'less than or equal by area',
1687  oprname => '<=', oprleft => 'circle', oprright => 'circle',
1688  oprresult => 'bool', oprcom => '>=(circle,circle)',
1689  oprnegate => '>(circle,circle)', oprcode => 'circle_le', oprrest => 'areasel',
1690  oprjoin => 'areajoinsel' },
1691{ oid => '1505', descr => 'greater than or equal by area',
1692  oprname => '>=', oprleft => 'circle', oprright => 'circle',
1693  oprresult => 'bool', oprcom => '<=(circle,circle)',
1694  oprnegate => '<(circle,circle)', oprcode => 'circle_ge', oprrest => 'areasel',
1695  oprjoin => 'areajoinsel' },
1696
1697{ oid => '1506', descr => 'is left of',
1698  oprname => '<<', oprleft => 'circle', oprright => 'circle',
1699  oprresult => 'bool', oprcode => 'circle_left', oprrest => 'positionsel',
1700  oprjoin => 'positionjoinsel' },
1701{ oid => '1507', descr => 'overlaps or is left of',
1702  oprname => '&<', oprleft => 'circle', oprright => 'circle',
1703  oprresult => 'bool', oprcode => 'circle_overleft', oprrest => 'positionsel',
1704  oprjoin => 'positionjoinsel' },
1705{ oid => '1508', descr => 'overlaps or is right of',
1706  oprname => '&>', oprleft => 'circle', oprright => 'circle',
1707  oprresult => 'bool', oprcode => 'circle_overright', oprrest => 'positionsel',
1708  oprjoin => 'positionjoinsel' },
1709{ oid => '1509', descr => 'is right of',
1710  oprname => '>>', oprleft => 'circle', oprright => 'circle',
1711  oprresult => 'bool', oprcode => 'circle_right', oprrest => 'positionsel',
1712  oprjoin => 'positionjoinsel' },
1713{ oid => '1510', descr => 'is contained by',
1714  oprname => '<@', oprleft => 'circle', oprright => 'circle',
1715  oprresult => 'bool', oprcom => '@>(circle,circle)',
1716  oprcode => 'circle_contained', oprrest => 'contsel',
1717  oprjoin => 'contjoinsel' },
1718{ oid => '1511', descr => 'contains',
1719  oprname => '@>', oprleft => 'circle', oprright => 'circle',
1720  oprresult => 'bool', oprcom => '<@(circle,circle)',
1721  oprcode => 'circle_contain', oprrest => 'contsel', oprjoin => 'contjoinsel' },
1722{ oid => '1512', descr => 'same as',
1723  oprname => '~=', oprleft => 'circle', oprright => 'circle',
1724  oprresult => 'bool', oprcom => '~=(circle,circle)', oprcode => 'circle_same',
1725  oprrest => 'eqsel', oprjoin => 'eqjoinsel' },
1726{ oid => '1513', descr => 'overlaps',
1727  oprname => '&&', oprleft => 'circle', oprright => 'circle',
1728  oprresult => 'bool', oprcom => '&&(circle,circle)',
1729  oprcode => 'circle_overlap', oprrest => 'areasel', oprjoin => 'areajoinsel' },
1730{ oid => '1514', descr => 'is above',
1731  oprname => '|>>', oprleft => 'circle', oprright => 'circle',
1732  oprresult => 'bool', oprcode => 'circle_above', oprrest => 'positionsel',
1733  oprjoin => 'positionjoinsel' },
1734{ oid => '1515', descr => 'is below',
1735  oprname => '<<|', oprleft => 'circle', oprright => 'circle',
1736  oprresult => 'bool', oprcode => 'circle_below', oprrest => 'positionsel',
1737  oprjoin => 'positionjoinsel' },
1738
1739{ oid => '1516', descr => 'add',
1740  oprname => '+', oprleft => 'circle', oprright => 'point',
1741  oprresult => 'circle', oprcode => 'circle_add_pt' },
1742{ oid => '1517', descr => 'subtract',
1743  oprname => '-', oprleft => 'circle', oprright => 'point',
1744  oprresult => 'circle', oprcode => 'circle_sub_pt' },
1745{ oid => '1518', descr => 'multiply',
1746  oprname => '*', oprleft => 'circle', oprright => 'point',
1747  oprresult => 'circle', oprcode => 'circle_mul_pt' },
1748{ oid => '1519', descr => 'divide',
1749  oprname => '/', oprleft => 'circle', oprright => 'point',
1750  oprresult => 'circle', oprcode => 'circle_div_pt' },
1751
1752{ oid => '1520', descr => 'distance between',
1753  oprname => '<->', oprleft => 'circle', oprright => 'circle',
1754  oprresult => 'float8', oprcom => '<->(circle,circle)',
1755  oprcode => 'circle_distance' },
1756{ oid => '1521', descr => 'number of points',
1757  oprname => '#', oprkind => 'l', oprleft => '0', oprright => 'polygon',
1758  oprresult => 'int4', oprcode => 'poly_npoints' },
1759{ oid => '1522', descr => 'distance between',
1760  oprname => '<->', oprleft => 'point', oprright => 'circle',
1761  oprresult => 'float8', oprcom => '<->(circle,point)', oprcode => 'dist_pc' },
1762{ oid => '3291', descr => 'distance between',
1763  oprname => '<->', oprleft => 'circle', oprright => 'point',
1764  oprresult => 'float8', oprcom => '<->(point,circle)',
1765  oprcode => 'dist_cpoint' },
1766{ oid => '3276', descr => 'distance between',
1767  oprname => '<->', oprleft => 'point', oprright => 'polygon',
1768  oprresult => 'float8', oprcom => '<->(polygon,point)',
1769  oprcode => 'dist_ppoly' },
1770{ oid => '3289', descr => 'distance between',
1771  oprname => '<->', oprleft => 'polygon', oprright => 'point',
1772  oprresult => 'float8', oprcom => '<->(point,polygon)',
1773  oprcode => 'dist_polyp' },
1774{ oid => '1523', descr => 'distance between',
1775  oprname => '<->', oprleft => 'circle', oprright => 'polygon',
1776  oprresult => 'float8', oprcode => 'dist_cpoly' },
1777
1778# additional geometric operators - thomas 1997-07-09
1779{ oid => '1524', descr => 'distance between',
1780  oprname => '<->', oprleft => 'line', oprright => 'box', oprresult => 'float8',
1781  oprcode => 'dist_lb' },
1782
1783{ oid => '1525', descr => 'intersect',
1784  oprname => '?#', oprleft => 'lseg', oprright => 'lseg', oprresult => 'bool',
1785  oprcom => '?#(lseg,lseg)', oprcode => 'lseg_intersect' },
1786{ oid => '1526', descr => 'parallel',
1787  oprname => '?||', oprleft => 'lseg', oprright => 'lseg', oprresult => 'bool',
1788  oprcom => '?||(lseg,lseg)', oprcode => 'lseg_parallel' },
1789{ oid => '1527', descr => 'perpendicular',
1790  oprname => '?-|', oprleft => 'lseg', oprright => 'lseg', oprresult => 'bool',
1791  oprcom => '?-|(lseg,lseg)', oprcode => 'lseg_perp' },
1792{ oid => '1528', descr => 'horizontal',
1793  oprname => '?-', oprkind => 'l', oprleft => '0', oprright => 'lseg',
1794  oprresult => 'bool', oprcode => 'lseg_horizontal' },
1795{ oid => '1529', descr => 'vertical',
1796  oprname => '?|', oprkind => 'l', oprleft => '0', oprright => 'lseg',
1797  oprresult => 'bool', oprcode => 'lseg_vertical' },
1798{ oid => '1535', descr => 'equal',
1799  oprname => '=', oprleft => 'lseg', oprright => 'lseg', oprresult => 'bool',
1800  oprcom => '=(lseg,lseg)', oprnegate => '<>(lseg,lseg)', oprcode => 'lseg_eq',
1801  oprrest => 'eqsel', oprjoin => 'eqjoinsel' },
1802{ oid => '1536', descr => 'intersection point',
1803  oprname => '#', oprleft => 'lseg', oprright => 'lseg', oprresult => 'point',
1804  oprcom => '#(lseg,lseg)', oprcode => 'lseg_interpt' },
1805{ oid => '1537', descr => 'intersect',
1806  oprname => '?#', oprleft => 'lseg', oprright => 'line', oprresult => 'bool',
1807  oprcode => 'inter_sl' },
1808{ oid => '1538', descr => 'intersect',
1809  oprname => '?#', oprleft => 'lseg', oprright => 'box', oprresult => 'bool',
1810  oprcode => 'inter_sb' },
1811{ oid => '1539', descr => 'intersect',
1812  oprname => '?#', oprleft => 'line', oprright => 'box', oprresult => 'bool',
1813  oprcode => 'inter_lb' },
1814
1815{ oid => '1546', descr => 'point on line',
1816  oprname => '<@', oprleft => 'point', oprright => 'line', oprresult => 'bool',
1817  oprcode => 'on_pl' },
1818{ oid => '1547', descr => 'is contained by',
1819  oprname => '<@', oprleft => 'point', oprright => 'lseg', oprresult => 'bool',
1820  oprcode => 'on_ps' },
1821{ oid => '1548', descr => 'lseg on line',
1822  oprname => '<@', oprleft => 'lseg', oprright => 'line', oprresult => 'bool',
1823  oprcode => 'on_sl' },
1824{ oid => '1549', descr => 'is contained by',
1825  oprname => '<@', oprleft => 'lseg', oprright => 'box', oprresult => 'bool',
1826  oprcode => 'on_sb' },
1827
1828{ oid => '1557', descr => 'closest point to A on B',
1829  oprname => '##', oprleft => 'point', oprright => 'line', oprresult => 'point',
1830  oprcode => 'close_pl' },
1831{ oid => '1558', descr => 'closest point to A on B',
1832  oprname => '##', oprleft => 'point', oprright => 'lseg', oprresult => 'point',
1833  oprcode => 'close_ps' },
1834{ oid => '1559', descr => 'closest point to A on B',
1835  oprname => '##', oprleft => 'point', oprright => 'box', oprresult => 'point',
1836  oprcode => 'close_pb' },
1837
1838{ oid => '1566', descr => 'closest point to A on B',
1839  oprname => '##', oprleft => 'lseg', oprright => 'line', oprresult => 'point',
1840  oprcode => 'close_sl' },
1841{ oid => '1567', descr => 'closest point to A on B',
1842  oprname => '##', oprleft => 'lseg', oprright => 'box', oprresult => 'point',
1843  oprcode => 'close_sb' },
1844{ oid => '1568', descr => 'closest point to A on B',
1845  oprname => '##', oprleft => 'line', oprright => 'box', oprresult => 'point',
1846  oprcode => 'close_lb' },
1847{ oid => '1577', descr => 'closest point to A on B',
1848  oprname => '##', oprleft => 'line', oprright => 'lseg', oprresult => 'point',
1849  oprcode => 'close_ls' },
1850{ oid => '1578', descr => 'closest point to A on B',
1851  oprname => '##', oprleft => 'lseg', oprright => 'lseg', oprresult => 'point',
1852  oprcode => 'close_lseg' },
1853{ oid => '1583', descr => 'multiply',
1854  oprname => '*', oprleft => 'interval', oprright => 'float8',
1855  oprresult => 'interval', oprcom => '*(float8,interval)',
1856  oprcode => 'interval_mul' },
1857{ oid => '1584', descr => 'multiply',
1858  oprname => '*', oprleft => 'float8', oprright => 'interval',
1859  oprresult => 'interval', oprcom => '*(interval,float8)',
1860  oprcode => 'mul_d_interval' },
1861{ oid => '1585', descr => 'divide',
1862  oprname => '/', oprleft => 'interval', oprright => 'float8',
1863  oprresult => 'interval', oprcode => 'interval_div' },
1864
1865{ oid => '1586', descr => 'not equal',
1866  oprname => '<>', oprleft => 'lseg', oprright => 'lseg', oprresult => 'bool',
1867  oprcom => '<>(lseg,lseg)', oprnegate => '=(lseg,lseg)', oprcode => 'lseg_ne',
1868  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
1869{ oid => '1587', descr => 'less than by length',
1870  oprname => '<', oprleft => 'lseg', oprright => 'lseg', oprresult => 'bool',
1871  oprcom => '>(lseg,lseg)', oprnegate => '>=(lseg,lseg)',
1872  oprcode => 'lseg_lt' },
1873{ oid => '1588', descr => 'less than or equal by length',
1874  oprname => '<=', oprleft => 'lseg', oprright => 'lseg', oprresult => 'bool',
1875  oprcom => '>=(lseg,lseg)', oprnegate => '>(lseg,lseg)',
1876  oprcode => 'lseg_le' },
1877{ oid => '1589', descr => 'greater than by length',
1878  oprname => '>', oprleft => 'lseg', oprright => 'lseg', oprresult => 'bool',
1879  oprcom => '<(lseg,lseg)', oprnegate => '<=(lseg,lseg)',
1880  oprcode => 'lseg_gt' },
1881{ oid => '1590', descr => 'greater than or equal by length',
1882  oprname => '>=', oprleft => 'lseg', oprright => 'lseg', oprresult => 'bool',
1883  oprcom => '<=(lseg,lseg)', oprnegate => '<(lseg,lseg)',
1884  oprcode => 'lseg_ge' },
1885
1886{ oid => '1591', descr => 'distance between endpoints',
1887  oprname => '@-@', oprkind => 'l', oprleft => '0', oprright => 'lseg',
1888  oprresult => 'float8', oprcode => 'lseg_length' },
1889
1890{ oid => '1611', descr => 'intersect',
1891  oprname => '?#', oprleft => 'line', oprright => 'line', oprresult => 'bool',
1892  oprcom => '?#(line,line)', oprcode => 'line_intersect' },
1893{ oid => '1612', descr => 'parallel',
1894  oprname => '?||', oprleft => 'line', oprright => 'line', oprresult => 'bool',
1895  oprcom => '?||(line,line)', oprcode => 'line_parallel' },
1896{ oid => '1613', descr => 'perpendicular',
1897  oprname => '?-|', oprleft => 'line', oprright => 'line', oprresult => 'bool',
1898  oprcom => '?-|(line,line)', oprcode => 'line_perp' },
1899{ oid => '1614', descr => 'horizontal',
1900  oprname => '?-', oprkind => 'l', oprleft => '0', oprright => 'line',
1901  oprresult => 'bool', oprcode => 'line_horizontal' },
1902{ oid => '1615', descr => 'vertical',
1903  oprname => '?|', oprkind => 'l', oprleft => '0', oprright => 'line',
1904  oprresult => 'bool', oprcode => 'line_vertical' },
1905{ oid => '1616', descr => 'equal',
1906  oprname => '=', oprleft => 'line', oprright => 'line', oprresult => 'bool',
1907  oprcom => '=(line,line)', oprcode => 'line_eq', oprrest => 'eqsel',
1908  oprjoin => 'eqjoinsel' },
1909{ oid => '1617', descr => 'intersection point',
1910  oprname => '#', oprleft => 'line', oprright => 'line', oprresult => 'point',
1911  oprcom => '#(line,line)', oprcode => 'line_interpt' },
1912
1913# MACADDR type
1914{ oid => '1220', descr => 'equal',
1915  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'macaddr',
1916  oprright => 'macaddr', oprresult => 'bool', oprcom => '=(macaddr,macaddr)',
1917  oprnegate => '<>(macaddr,macaddr)', oprcode => 'macaddr_eq',
1918  oprrest => 'eqsel', oprjoin => 'eqjoinsel' },
1919{ oid => '1221', descr => 'not equal',
1920  oprname => '<>', oprleft => 'macaddr', oprright => 'macaddr',
1921  oprresult => 'bool', oprcom => '<>(macaddr,macaddr)',
1922  oprnegate => '=(macaddr,macaddr)', oprcode => 'macaddr_ne',
1923  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
1924{ oid => '1222', descr => 'less than',
1925  oprname => '<', oprleft => 'macaddr', oprright => 'macaddr',
1926  oprresult => 'bool', oprcom => '>(macaddr,macaddr)',
1927  oprnegate => '>=(macaddr,macaddr)', oprcode => 'macaddr_lt',
1928  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
1929{ oid => '1223', descr => 'less than or equal',
1930  oprname => '<=', oprleft => 'macaddr', oprright => 'macaddr',
1931  oprresult => 'bool', oprcom => '>=(macaddr,macaddr)',
1932  oprnegate => '>(macaddr,macaddr)', oprcode => 'macaddr_le',
1933  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
1934{ oid => '1224', descr => 'greater than',
1935  oprname => '>', oprleft => 'macaddr', oprright => 'macaddr',
1936  oprresult => 'bool', oprcom => '<(macaddr,macaddr)',
1937  oprnegate => '<=(macaddr,macaddr)', oprcode => 'macaddr_gt',
1938  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
1939{ oid => '1225', descr => 'greater than or equal',
1940  oprname => '>=', oprleft => 'macaddr', oprright => 'macaddr',
1941  oprresult => 'bool', oprcom => '<=(macaddr,macaddr)',
1942  oprnegate => '<(macaddr,macaddr)', oprcode => 'macaddr_ge',
1943  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
1944
1945{ oid => '3147', descr => 'bitwise not',
1946  oprname => '~', oprkind => 'l', oprleft => '0', oprright => 'macaddr',
1947  oprresult => 'macaddr', oprcode => 'macaddr_not' },
1948{ oid => '3148', descr => 'bitwise and',
1949  oprname => '&', oprleft => 'macaddr', oprright => 'macaddr',
1950  oprresult => 'macaddr', oprcode => 'macaddr_and' },
1951{ oid => '3149', descr => 'bitwise or',
1952  oprname => '|', oprleft => 'macaddr', oprright => 'macaddr',
1953  oprresult => 'macaddr', oprcode => 'macaddr_or' },
1954
1955# MACADDR8 type
1956{ oid => '3362', descr => 'equal',
1957  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'macaddr8',
1958  oprright => 'macaddr8', oprresult => 'bool', oprcom => '=(macaddr8,macaddr8)',
1959  oprnegate => '<>(macaddr8,macaddr8)', oprcode => 'macaddr8_eq',
1960  oprrest => 'eqsel', oprjoin => 'eqjoinsel' },
1961{ oid => '3363', descr => 'not equal',
1962  oprname => '<>', oprleft => 'macaddr8', oprright => 'macaddr8',
1963  oprresult => 'bool', oprcom => '<>(macaddr8,macaddr8)',
1964  oprnegate => '=(macaddr8,macaddr8)', oprcode => 'macaddr8_ne',
1965  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
1966{ oid => '3364', descr => 'less than',
1967  oprname => '<', oprleft => 'macaddr8', oprright => 'macaddr8',
1968  oprresult => 'bool', oprcom => '>(macaddr8,macaddr8)',
1969  oprnegate => '>=(macaddr8,macaddr8)', oprcode => 'macaddr8_lt',
1970  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
1971{ oid => '3365', descr => 'less than or equal',
1972  oprname => '<=', oprleft => 'macaddr8', oprright => 'macaddr8',
1973  oprresult => 'bool', oprcom => '>=(macaddr8,macaddr8)',
1974  oprnegate => '>(macaddr8,macaddr8)', oprcode => 'macaddr8_le',
1975  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
1976{ oid => '3366', descr => 'greater than',
1977  oprname => '>', oprleft => 'macaddr8', oprright => 'macaddr8',
1978  oprresult => 'bool', oprcom => '<(macaddr8,macaddr8)',
1979  oprnegate => '<=(macaddr8,macaddr8)', oprcode => 'macaddr8_gt',
1980  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
1981{ oid => '3367', descr => 'greater than or equal',
1982  oprname => '>=', oprleft => 'macaddr8', oprright => 'macaddr8',
1983  oprresult => 'bool', oprcom => '<=(macaddr8,macaddr8)',
1984  oprnegate => '<(macaddr8,macaddr8)', oprcode => 'macaddr8_ge',
1985  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
1986
1987{ oid => '3368', descr => 'bitwise not',
1988  oprname => '~', oprkind => 'l', oprleft => '0', oprright => 'macaddr8',
1989  oprresult => 'macaddr8', oprcode => 'macaddr8_not' },
1990{ oid => '3369', descr => 'bitwise and',
1991  oprname => '&', oprleft => 'macaddr8', oprright => 'macaddr8',
1992  oprresult => 'macaddr8', oprcode => 'macaddr8_and' },
1993{ oid => '3370', descr => 'bitwise or',
1994  oprname => '|', oprleft => 'macaddr8', oprright => 'macaddr8',
1995  oprresult => 'macaddr8', oprcode => 'macaddr8_or' },
1996
1997# INET type (these also support CIDR via implicit cast)
1998{ oid => '1201', descr => 'equal',
1999  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'inet',
2000  oprright => 'inet', oprresult => 'bool', oprcom => '=(inet,inet)',
2001  oprnegate => '<>(inet,inet)', oprcode => 'network_eq', oprrest => 'eqsel',
2002  oprjoin => 'eqjoinsel' },
2003{ oid => '1202', descr => 'not equal',
2004  oprname => '<>', oprleft => 'inet', oprright => 'inet', oprresult => 'bool',
2005  oprcom => '<>(inet,inet)', oprnegate => '=(inet,inet)',
2006  oprcode => 'network_ne', oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
2007{ oid => '1203', descr => 'less than',
2008  oprname => '<', oprleft => 'inet', oprright => 'inet', oprresult => 'bool',
2009  oprcom => '>(inet,inet)', oprnegate => '>=(inet,inet)',
2010  oprcode => 'network_lt', oprrest => 'scalarltsel',
2011  oprjoin => 'scalarltjoinsel' },
2012{ oid => '1204', descr => 'less than or equal',
2013  oprname => '<=', oprleft => 'inet', oprright => 'inet', oprresult => 'bool',
2014  oprcom => '>=(inet,inet)', oprnegate => '>(inet,inet)',
2015  oprcode => 'network_le', oprrest => 'scalarlesel',
2016  oprjoin => 'scalarlejoinsel' },
2017{ oid => '1205', descr => 'greater than',
2018  oprname => '>', oprleft => 'inet', oprright => 'inet', oprresult => 'bool',
2019  oprcom => '<(inet,inet)', oprnegate => '<=(inet,inet)',
2020  oprcode => 'network_gt', oprrest => 'scalargtsel',
2021  oprjoin => 'scalargtjoinsel' },
2022{ oid => '1206', descr => 'greater than or equal',
2023  oprname => '>=', oprleft => 'inet', oprright => 'inet', oprresult => 'bool',
2024  oprcom => '<=(inet,inet)', oprnegate => '<(inet,inet)',
2025  oprcode => 'network_ge', oprrest => 'scalargesel',
2026  oprjoin => 'scalargejoinsel' },
2027{ oid => '931', oid_symbol => 'OID_INET_SUB_OP', descr => 'is subnet',
2028  oprname => '<<', oprleft => 'inet', oprright => 'inet', oprresult => 'bool',
2029  oprcom => '>>(inet,inet)', oprcode => 'network_sub', oprrest => 'networksel',
2030  oprjoin => 'networkjoinsel' },
2031{ oid => '932', oid_symbol => 'OID_INET_SUBEQ_OP',
2032  descr => 'is subnet or equal',
2033  oprname => '<<=', oprleft => 'inet', oprright => 'inet', oprresult => 'bool',
2034  oprcom => '>>=(inet,inet)', oprcode => 'network_subeq',
2035  oprrest => 'networksel', oprjoin => 'networkjoinsel' },
2036{ oid => '933', oid_symbol => 'OID_INET_SUP_OP', descr => 'is supernet',
2037  oprname => '>>', oprleft => 'inet', oprright => 'inet', oprresult => 'bool',
2038  oprcom => '<<(inet,inet)', oprcode => 'network_sup', oprrest => 'networksel',
2039  oprjoin => 'networkjoinsel' },
2040{ oid => '934', oid_symbol => 'OID_INET_SUPEQ_OP',
2041  descr => 'is supernet or equal',
2042  oprname => '>>=', oprleft => 'inet', oprright => 'inet', oprresult => 'bool',
2043  oprcom => '<<=(inet,inet)', oprcode => 'network_supeq',
2044  oprrest => 'networksel', oprjoin => 'networkjoinsel' },
2045{ oid => '3552', oid_symbol => 'OID_INET_OVERLAP_OP',
2046  descr => 'overlaps (is subnet or supernet)',
2047  oprname => '&&', oprleft => 'inet', oprright => 'inet', oprresult => 'bool',
2048  oprcom => '&&(inet,inet)', oprcode => 'network_overlap',
2049  oprrest => 'networksel', oprjoin => 'networkjoinsel' },
2050
2051{ oid => '2634', descr => 'bitwise not',
2052  oprname => '~', oprkind => 'l', oprleft => '0', oprright => 'inet',
2053  oprresult => 'inet', oprcode => 'inetnot' },
2054{ oid => '2635', descr => 'bitwise and',
2055  oprname => '&', oprleft => 'inet', oprright => 'inet', oprresult => 'inet',
2056  oprcode => 'inetand' },
2057{ oid => '2636', descr => 'bitwise or',
2058  oprname => '|', oprleft => 'inet', oprright => 'inet', oprresult => 'inet',
2059  oprcode => 'inetor' },
2060{ oid => '2637', descr => 'add',
2061  oprname => '+', oprleft => 'inet', oprright => 'int8', oprresult => 'inet',
2062  oprcom => '+(int8,inet)', oprcode => 'inetpl' },
2063{ oid => '2638', descr => 'add',
2064  oprname => '+', oprleft => 'int8', oprright => 'inet', oprresult => 'inet',
2065  oprcom => '+(inet,int8)', oprcode => 'int8pl_inet' },
2066{ oid => '2639', descr => 'subtract',
2067  oprname => '-', oprleft => 'inet', oprright => 'int8', oprresult => 'inet',
2068  oprcode => 'inetmi_int8' },
2069{ oid => '2640', descr => 'subtract',
2070  oprname => '-', oprleft => 'inet', oprright => 'inet', oprresult => 'int8',
2071  oprcode => 'inetmi' },
2072
2073# case-insensitive LIKE hacks
2074{ oid => '1625', oid_symbol => 'OID_NAME_ICLIKE_OP',
2075  descr => 'matches LIKE expression, case-insensitive',
2076  oprname => '~~*', oprleft => 'name', oprright => 'text', oprresult => 'bool',
2077  oprnegate => '!~~*(name,text)', oprcode => 'nameiclike',
2078  oprrest => 'iclikesel', oprjoin => 'iclikejoinsel' },
2079{ oid => '1626', descr => 'does not match LIKE expression, case-insensitive',
2080  oprname => '!~~*', oprleft => 'name', oprright => 'text', oprresult => 'bool',
2081  oprnegate => '~~*(name,text)', oprcode => 'nameicnlike',
2082  oprrest => 'icnlikesel', oprjoin => 'icnlikejoinsel' },
2083{ oid => '1627', oid_symbol => 'OID_TEXT_ICLIKE_OP',
2084  descr => 'matches LIKE expression, case-insensitive',
2085  oprname => '~~*', oprleft => 'text', oprright => 'text', oprresult => 'bool',
2086  oprnegate => '!~~*(text,text)', oprcode => 'texticlike',
2087  oprrest => 'iclikesel', oprjoin => 'iclikejoinsel' },
2088{ oid => '1628', descr => 'does not match LIKE expression, case-insensitive',
2089  oprname => '!~~*', oprleft => 'text', oprright => 'text', oprresult => 'bool',
2090  oprnegate => '~~*(text,text)', oprcode => 'texticnlike',
2091  oprrest => 'icnlikesel', oprjoin => 'icnlikejoinsel' },
2092{ oid => '1629', oid_symbol => 'OID_BPCHAR_ICLIKE_OP',
2093  descr => 'matches LIKE expression, case-insensitive',
2094  oprname => '~~*', oprleft => 'bpchar', oprright => 'text',
2095  oprresult => 'bool', oprnegate => '!~~*(bpchar,text)',
2096  oprcode => 'bpchariclike', oprrest => 'iclikesel',
2097  oprjoin => 'iclikejoinsel' },
2098{ oid => '1630', descr => 'does not match LIKE expression, case-insensitive',
2099  oprname => '!~~*', oprleft => 'bpchar', oprright => 'text',
2100  oprresult => 'bool', oprnegate => '~~*(bpchar,text)',
2101  oprcode => 'bpcharicnlike', oprrest => 'icnlikesel',
2102  oprjoin => 'icnlikejoinsel' },
2103
2104# NUMERIC type - OID's 1700-1799
2105{ oid => '1751', descr => 'negate',
2106  oprname => '-', oprkind => 'l', oprleft => '0', oprright => 'numeric',
2107  oprresult => 'numeric', oprcode => 'numeric_uminus' },
2108{ oid => '1752', descr => 'equal',
2109  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'numeric',
2110  oprright => 'numeric', oprresult => 'bool', oprcom => '=(numeric,numeric)',
2111  oprnegate => '<>(numeric,numeric)', oprcode => 'numeric_eq',
2112  oprrest => 'eqsel', oprjoin => 'eqjoinsel' },
2113{ oid => '1753', descr => 'not equal',
2114  oprname => '<>', oprleft => 'numeric', oprright => 'numeric',
2115  oprresult => 'bool', oprcom => '<>(numeric,numeric)',
2116  oprnegate => '=(numeric,numeric)', oprcode => 'numeric_ne',
2117  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
2118{ oid => '1754', descr => 'less than',
2119  oprname => '<', oprleft => 'numeric', oprright => 'numeric',
2120  oprresult => 'bool', oprcom => '>(numeric,numeric)',
2121  oprnegate => '>=(numeric,numeric)', oprcode => 'numeric_lt',
2122  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
2123{ oid => '1755', descr => 'less than or equal',
2124  oprname => '<=', oprleft => 'numeric', oprright => 'numeric',
2125  oprresult => 'bool', oprcom => '>=(numeric,numeric)',
2126  oprnegate => '>(numeric,numeric)', oprcode => 'numeric_le',
2127  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
2128{ oid => '1756', descr => 'greater than',
2129  oprname => '>', oprleft => 'numeric', oprright => 'numeric',
2130  oprresult => 'bool', oprcom => '<(numeric,numeric)',
2131  oprnegate => '<=(numeric,numeric)', oprcode => 'numeric_gt',
2132  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
2133{ oid => '1757', descr => 'greater than or equal',
2134  oprname => '>=', oprleft => 'numeric', oprright => 'numeric',
2135  oprresult => 'bool', oprcom => '<=(numeric,numeric)',
2136  oprnegate => '<(numeric,numeric)', oprcode => 'numeric_ge',
2137  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
2138{ oid => '1758', descr => 'add',
2139  oprname => '+', oprleft => 'numeric', oprright => 'numeric',
2140  oprresult => 'numeric', oprcom => '+(numeric,numeric)',
2141  oprcode => 'numeric_add' },
2142{ oid => '1759', descr => 'subtract',
2143  oprname => '-', oprleft => 'numeric', oprright => 'numeric',
2144  oprresult => 'numeric', oprcode => 'numeric_sub' },
2145{ oid => '1760', descr => 'multiply',
2146  oprname => '*', oprleft => 'numeric', oprright => 'numeric',
2147  oprresult => 'numeric', oprcom => '*(numeric,numeric)',
2148  oprcode => 'numeric_mul' },
2149{ oid => '1761', descr => 'divide',
2150  oprname => '/', oprleft => 'numeric', oprright => 'numeric',
2151  oprresult => 'numeric', oprcode => 'numeric_div' },
2152{ oid => '1762', descr => 'modulus',
2153  oprname => '%', oprleft => 'numeric', oprright => 'numeric',
2154  oprresult => 'numeric', oprcode => 'numeric_mod' },
2155{ oid => '1038', descr => 'exponentiation',
2156  oprname => '^', oprleft => 'numeric', oprright => 'numeric',
2157  oprresult => 'numeric', oprcode => 'numeric_power' },
2158{ oid => '1763', descr => 'absolute value',
2159  oprname => '@', oprkind => 'l', oprleft => '0', oprright => 'numeric',
2160  oprresult => 'numeric', oprcode => 'numeric_abs' },
2161
2162{ oid => '1784', descr => 'equal',
2163  oprname => '=', oprcanmerge => 't', oprleft => 'bit', oprright => 'bit',
2164  oprresult => 'bool', oprcom => '=(bit,bit)', oprnegate => '<>(bit,bit)',
2165  oprcode => 'biteq', oprrest => 'eqsel', oprjoin => 'eqjoinsel' },
2166{ oid => '1785', descr => 'not equal',
2167  oprname => '<>', oprleft => 'bit', oprright => 'bit', oprresult => 'bool',
2168  oprcom => '<>(bit,bit)', oprnegate => '=(bit,bit)', oprcode => 'bitne',
2169  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
2170{ oid => '1786', descr => 'less than',
2171  oprname => '<', oprleft => 'bit', oprright => 'bit', oprresult => 'bool',
2172  oprcom => '>(bit,bit)', oprnegate => '>=(bit,bit)', oprcode => 'bitlt',
2173  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
2174{ oid => '1787', descr => 'greater than',
2175  oprname => '>', oprleft => 'bit', oprright => 'bit', oprresult => 'bool',
2176  oprcom => '<(bit,bit)', oprnegate => '<=(bit,bit)', oprcode => 'bitgt',
2177  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
2178{ oid => '1788', descr => 'less than or equal',
2179  oprname => '<=', oprleft => 'bit', oprright => 'bit', oprresult => 'bool',
2180  oprcom => '>=(bit,bit)', oprnegate => '>(bit,bit)', oprcode => 'bitle',
2181  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
2182{ oid => '1789', descr => 'greater than or equal',
2183  oprname => '>=', oprleft => 'bit', oprright => 'bit', oprresult => 'bool',
2184  oprcom => '<=(bit,bit)', oprnegate => '<(bit,bit)', oprcode => 'bitge',
2185  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
2186{ oid => '1791', descr => 'bitwise and',
2187  oprname => '&', oprleft => 'bit', oprright => 'bit', oprresult => 'bit',
2188  oprcom => '&(bit,bit)', oprcode => 'bitand' },
2189{ oid => '1792', descr => 'bitwise or',
2190  oprname => '|', oprleft => 'bit', oprright => 'bit', oprresult => 'bit',
2191  oprcom => '|(bit,bit)', oprcode => 'bitor' },
2192{ oid => '1793', descr => 'bitwise exclusive or',
2193  oprname => '#', oprleft => 'bit', oprright => 'bit', oprresult => 'bit',
2194  oprcom => '#(bit,bit)', oprcode => 'bitxor' },
2195{ oid => '1794', descr => 'bitwise not',
2196  oprname => '~', oprkind => 'l', oprleft => '0', oprright => 'bit',
2197  oprresult => 'bit', oprcode => 'bitnot' },
2198{ oid => '1795', descr => 'bitwise shift left',
2199  oprname => '<<', oprleft => 'bit', oprright => 'int4', oprresult => 'bit',
2200  oprcode => 'bitshiftleft' },
2201{ oid => '1796', descr => 'bitwise shift right',
2202  oprname => '>>', oprleft => 'bit', oprright => 'int4', oprresult => 'bit',
2203  oprcode => 'bitshiftright' },
2204{ oid => '1797', descr => 'concatenate',
2205  oprname => '||', oprleft => 'varbit', oprright => 'varbit',
2206  oprresult => 'varbit', oprcode => 'bitcat' },
2207
2208{ oid => '1800', descr => 'add',
2209  oprname => '+', oprleft => 'time', oprright => 'interval',
2210  oprresult => 'time', oprcom => '+(interval,time)',
2211  oprcode => 'time_pl_interval' },
2212{ oid => '1801', descr => 'subtract',
2213  oprname => '-', oprleft => 'time', oprright => 'interval',
2214  oprresult => 'time', oprcode => 'time_mi_interval' },
2215{ oid => '1802', descr => 'add',
2216  oprname => '+', oprleft => 'timetz', oprright => 'interval',
2217  oprresult => 'timetz', oprcom => '+(interval,timetz)',
2218  oprcode => 'timetz_pl_interval' },
2219{ oid => '1803', descr => 'subtract',
2220  oprname => '-', oprleft => 'timetz', oprright => 'interval',
2221  oprresult => 'timetz', oprcode => 'timetz_mi_interval' },
2222
2223{ oid => '1804', descr => 'equal',
2224  oprname => '=', oprcanmerge => 't', oprleft => 'varbit', oprright => 'varbit',
2225  oprresult => 'bool', oprcom => '=(varbit,varbit)',
2226  oprnegate => '<>(varbit,varbit)', oprcode => 'varbiteq', oprrest => 'eqsel',
2227  oprjoin => 'eqjoinsel' },
2228{ oid => '1805', descr => 'not equal',
2229  oprname => '<>', oprleft => 'varbit', oprright => 'varbit',
2230  oprresult => 'bool', oprcom => '<>(varbit,varbit)',
2231  oprnegate => '=(varbit,varbit)', oprcode => 'varbitne', oprrest => 'neqsel',
2232  oprjoin => 'neqjoinsel' },
2233{ oid => '1806', descr => 'less than',
2234  oprname => '<', oprleft => 'varbit', oprright => 'varbit',
2235  oprresult => 'bool', oprcom => '>(varbit,varbit)',
2236  oprnegate => '>=(varbit,varbit)', oprcode => 'varbitlt',
2237  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
2238{ oid => '1807', descr => 'greater than',
2239  oprname => '>', oprleft => 'varbit', oprright => 'varbit',
2240  oprresult => 'bool', oprcom => '<(varbit,varbit)',
2241  oprnegate => '<=(varbit,varbit)', oprcode => 'varbitgt',
2242  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
2243{ oid => '1808', descr => 'less than or equal',
2244  oprname => '<=', oprleft => 'varbit', oprright => 'varbit',
2245  oprresult => 'bool', oprcom => '>=(varbit,varbit)',
2246  oprnegate => '>(varbit,varbit)', oprcode => 'varbitle',
2247  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
2248{ oid => '1809', descr => 'greater than or equal',
2249  oprname => '>=', oprleft => 'varbit', oprright => 'varbit',
2250  oprresult => 'bool', oprcom => '<=(varbit,varbit)',
2251  oprnegate => '<(varbit,varbit)', oprcode => 'varbitge',
2252  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
2253
2254{ oid => '1849', descr => 'add',
2255  oprname => '+', oprleft => 'interval', oprright => 'time',
2256  oprresult => 'time', oprcom => '+(time,interval)',
2257  oprcode => 'interval_pl_time' },
2258
2259{ oid => '1862', descr => 'equal',
2260  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'int2',
2261  oprright => 'int8', oprresult => 'bool', oprcom => '=(int8,int2)',
2262  oprnegate => '<>(int2,int8)', oprcode => 'int28eq', oprrest => 'eqsel',
2263  oprjoin => 'eqjoinsel' },
2264{ oid => '1863', descr => 'not equal',
2265  oprname => '<>', oprleft => 'int2', oprright => 'int8', oprresult => 'bool',
2266  oprcom => '<>(int8,int2)', oprnegate => '=(int2,int8)', oprcode => 'int28ne',
2267  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
2268{ oid => '1864', descr => 'less than',
2269  oprname => '<', oprleft => 'int2', oprright => 'int8', oprresult => 'bool',
2270  oprcom => '>(int8,int2)', oprnegate => '>=(int2,int8)', oprcode => 'int28lt',
2271  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
2272{ oid => '1865', descr => 'greater than',
2273  oprname => '>', oprleft => 'int2', oprright => 'int8', oprresult => 'bool',
2274  oprcom => '<(int8,int2)', oprnegate => '<=(int2,int8)', oprcode => 'int28gt',
2275  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
2276{ oid => '1866', descr => 'less than or equal',
2277  oprname => '<=', oprleft => 'int2', oprright => 'int8', oprresult => 'bool',
2278  oprcom => '>=(int8,int2)', oprnegate => '>(int2,int8)', oprcode => 'int28le',
2279  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
2280{ oid => '1867', descr => 'greater than or equal',
2281  oprname => '>=', oprleft => 'int2', oprright => 'int8', oprresult => 'bool',
2282  oprcom => '<=(int8,int2)', oprnegate => '<(int2,int8)', oprcode => 'int28ge',
2283  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
2284
2285{ oid => '1868', descr => 'equal',
2286  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'int8',
2287  oprright => 'int2', oprresult => 'bool', oprcom => '=(int2,int8)',
2288  oprnegate => '<>(int8,int2)', oprcode => 'int82eq', oprrest => 'eqsel',
2289  oprjoin => 'eqjoinsel' },
2290{ oid => '1869', descr => 'not equal',
2291  oprname => '<>', oprleft => 'int8', oprright => 'int2', oprresult => 'bool',
2292  oprcom => '<>(int2,int8)', oprnegate => '=(int8,int2)', oprcode => 'int82ne',
2293  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
2294{ oid => '1870', descr => 'less than',
2295  oprname => '<', oprleft => 'int8', oprright => 'int2', oprresult => 'bool',
2296  oprcom => '>(int2,int8)', oprnegate => '>=(int8,int2)', oprcode => 'int82lt',
2297  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
2298{ oid => '1871', descr => 'greater than',
2299  oprname => '>', oprleft => 'int8', oprright => 'int2', oprresult => 'bool',
2300  oprcom => '<(int2,int8)', oprnegate => '<=(int8,int2)', oprcode => 'int82gt',
2301  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
2302{ oid => '1872', descr => 'less than or equal',
2303  oprname => '<=', oprleft => 'int8', oprright => 'int2', oprresult => 'bool',
2304  oprcom => '>=(int2,int8)', oprnegate => '>(int8,int2)', oprcode => 'int82le',
2305  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
2306{ oid => '1873', descr => 'greater than or equal',
2307  oprname => '>=', oprleft => 'int8', oprright => 'int2', oprresult => 'bool',
2308  oprcom => '<=(int2,int8)', oprnegate => '<(int8,int2)', oprcode => 'int82ge',
2309  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
2310
2311{ oid => '1874', descr => 'bitwise and',
2312  oprname => '&', oprleft => 'int2', oprright => 'int2', oprresult => 'int2',
2313  oprcom => '&(int2,int2)', oprcode => 'int2and' },
2314{ oid => '1875', descr => 'bitwise or',
2315  oprname => '|', oprleft => 'int2', oprright => 'int2', oprresult => 'int2',
2316  oprcom => '|(int2,int2)', oprcode => 'int2or' },
2317{ oid => '1876', descr => 'bitwise exclusive or',
2318  oprname => '#', oprleft => 'int2', oprright => 'int2', oprresult => 'int2',
2319  oprcom => '#(int2,int2)', oprcode => 'int2xor' },
2320{ oid => '1877', descr => 'bitwise not',
2321  oprname => '~', oprkind => 'l', oprleft => '0', oprright => 'int2',
2322  oprresult => 'int2', oprcode => 'int2not' },
2323{ oid => '1878', descr => 'bitwise shift left',
2324  oprname => '<<', oprleft => 'int2', oprright => 'int4', oprresult => 'int2',
2325  oprcode => 'int2shl' },
2326{ oid => '1879', descr => 'bitwise shift right',
2327  oprname => '>>', oprleft => 'int2', oprright => 'int4', oprresult => 'int2',
2328  oprcode => 'int2shr' },
2329
2330{ oid => '1880', descr => 'bitwise and',
2331  oprname => '&', oprleft => 'int4', oprright => 'int4', oprresult => 'int4',
2332  oprcom => '&(int4,int4)', oprcode => 'int4and' },
2333{ oid => '1881', descr => 'bitwise or',
2334  oprname => '|', oprleft => 'int4', oprright => 'int4', oprresult => 'int4',
2335  oprcom => '|(int4,int4)', oprcode => 'int4or' },
2336{ oid => '1882', descr => 'bitwise exclusive or',
2337  oprname => '#', oprleft => 'int4', oprright => 'int4', oprresult => 'int4',
2338  oprcom => '#(int4,int4)', oprcode => 'int4xor' },
2339{ oid => '1883', descr => 'bitwise not',
2340  oprname => '~', oprkind => 'l', oprleft => '0', oprright => 'int4',
2341  oprresult => 'int4', oprcode => 'int4not' },
2342{ oid => '1884', descr => 'bitwise shift left',
2343  oprname => '<<', oprleft => 'int4', oprright => 'int4', oprresult => 'int4',
2344  oprcode => 'int4shl' },
2345{ oid => '1885', descr => 'bitwise shift right',
2346  oprname => '>>', oprleft => 'int4', oprright => 'int4', oprresult => 'int4',
2347  oprcode => 'int4shr' },
2348
2349{ oid => '1886', descr => 'bitwise and',
2350  oprname => '&', oprleft => 'int8', oprright => 'int8', oprresult => 'int8',
2351  oprcom => '&(int8,int8)', oprcode => 'int8and' },
2352{ oid => '1887', descr => 'bitwise or',
2353  oprname => '|', oprleft => 'int8', oprright => 'int8', oprresult => 'int8',
2354  oprcom => '|(int8,int8)', oprcode => 'int8or' },
2355{ oid => '1888', descr => 'bitwise exclusive or',
2356  oprname => '#', oprleft => 'int8', oprright => 'int8', oprresult => 'int8',
2357  oprcom => '#(int8,int8)', oprcode => 'int8xor' },
2358{ oid => '1889', descr => 'bitwise not',
2359  oprname => '~', oprkind => 'l', oprleft => '0', oprright => 'int8',
2360  oprresult => 'int8', oprcode => 'int8not' },
2361{ oid => '1890', descr => 'bitwise shift left',
2362  oprname => '<<', oprleft => 'int8', oprright => 'int4', oprresult => 'int8',
2363  oprcode => 'int8shl' },
2364{ oid => '1891', descr => 'bitwise shift right',
2365  oprname => '>>', oprleft => 'int8', oprright => 'int4', oprresult => 'int8',
2366  oprcode => 'int8shr' },
2367
2368{ oid => '1916', descr => 'unary plus',
2369  oprname => '+', oprkind => 'l', oprleft => '0', oprright => 'int8',
2370  oprresult => 'int8', oprcode => 'int8up' },
2371{ oid => '1917', descr => 'unary plus',
2372  oprname => '+', oprkind => 'l', oprleft => '0', oprright => 'int2',
2373  oprresult => 'int2', oprcode => 'int2up' },
2374{ oid => '1918', descr => 'unary plus',
2375  oprname => '+', oprkind => 'l', oprleft => '0', oprright => 'int4',
2376  oprresult => 'int4', oprcode => 'int4up' },
2377{ oid => '1919', descr => 'unary plus',
2378  oprname => '+', oprkind => 'l', oprleft => '0', oprright => 'float4',
2379  oprresult => 'float4', oprcode => 'float4up' },
2380{ oid => '1920', descr => 'unary plus',
2381  oprname => '+', oprkind => 'l', oprleft => '0', oprright => 'float8',
2382  oprresult => 'float8', oprcode => 'float8up' },
2383{ oid => '1921', descr => 'unary plus',
2384  oprname => '+', oprkind => 'l', oprleft => '0', oprright => 'numeric',
2385  oprresult => 'numeric', oprcode => 'numeric_uplus' },
2386
2387# bytea operators
2388{ oid => '1955', descr => 'equal',
2389  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'bytea',
2390  oprright => 'bytea', oprresult => 'bool', oprcom => '=(bytea,bytea)',
2391  oprnegate => '<>(bytea,bytea)', oprcode => 'byteaeq', oprrest => 'eqsel',
2392  oprjoin => 'eqjoinsel' },
2393{ oid => '1956', descr => 'not equal',
2394  oprname => '<>', oprleft => 'bytea', oprright => 'bytea', oprresult => 'bool',
2395  oprcom => '<>(bytea,bytea)', oprnegate => '=(bytea,bytea)',
2396  oprcode => 'byteane', oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
2397{ oid => '1957', descr => 'less than',
2398  oprname => '<', oprleft => 'bytea', oprright => 'bytea', oprresult => 'bool',
2399  oprcom => '>(bytea,bytea)', oprnegate => '>=(bytea,bytea)',
2400  oprcode => 'bytealt', oprrest => 'scalarltsel',
2401  oprjoin => 'scalarltjoinsel' },
2402{ oid => '1958', descr => 'less than or equal',
2403  oprname => '<=', oprleft => 'bytea', oprright => 'bytea', oprresult => 'bool',
2404  oprcom => '>=(bytea,bytea)', oprnegate => '>(bytea,bytea)',
2405  oprcode => 'byteale', oprrest => 'scalarlesel',
2406  oprjoin => 'scalarlejoinsel' },
2407{ oid => '1959', descr => 'greater than',
2408  oprname => '>', oprleft => 'bytea', oprright => 'bytea', oprresult => 'bool',
2409  oprcom => '<(bytea,bytea)', oprnegate => '<=(bytea,bytea)',
2410  oprcode => 'byteagt', oprrest => 'scalargtsel',
2411  oprjoin => 'scalargtjoinsel' },
2412{ oid => '1960', descr => 'greater than or equal',
2413  oprname => '>=', oprleft => 'bytea', oprright => 'bytea', oprresult => 'bool',
2414  oprcom => '<=(bytea,bytea)', oprnegate => '<(bytea,bytea)',
2415  oprcode => 'byteage', oprrest => 'scalargesel',
2416  oprjoin => 'scalargejoinsel' },
2417
2418{ oid => '2016', oid_symbol => 'OID_BYTEA_LIKE_OP',
2419  descr => 'matches LIKE expression',
2420  oprname => '~~', oprleft => 'bytea', oprright => 'bytea', oprresult => 'bool',
2421  oprnegate => '!~~(bytea,bytea)', oprcode => 'bytealike', oprrest => 'likesel',
2422  oprjoin => 'likejoinsel' },
2423{ oid => '2017', descr => 'does not match LIKE expression',
2424  oprname => '!~~', oprleft => 'bytea', oprright => 'bytea',
2425  oprresult => 'bool', oprnegate => '~~(bytea,bytea)', oprcode => 'byteanlike',
2426  oprrest => 'nlikesel', oprjoin => 'nlikejoinsel' },
2427{ oid => '2018', descr => 'concatenate',
2428  oprname => '||', oprleft => 'bytea', oprright => 'bytea',
2429  oprresult => 'bytea', oprcode => 'byteacat' },
2430
2431# timestamp operators
2432{ oid => '2060', descr => 'equal',
2433  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'timestamp',
2434  oprright => 'timestamp', oprresult => 'bool',
2435  oprcom => '=(timestamp,timestamp)', oprnegate => '<>(timestamp,timestamp)',
2436  oprcode => 'timestamp_eq', oprrest => 'eqsel', oprjoin => 'eqjoinsel' },
2437{ oid => '2061', descr => 'not equal',
2438  oprname => '<>', oprleft => 'timestamp', oprright => 'timestamp',
2439  oprresult => 'bool', oprcom => '<>(timestamp,timestamp)',
2440  oprnegate => '=(timestamp,timestamp)', oprcode => 'timestamp_ne',
2441  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
2442{ oid => '2062', descr => 'less than',
2443  oprname => '<', oprleft => 'timestamp', oprright => 'timestamp',
2444  oprresult => 'bool', oprcom => '>(timestamp,timestamp)',
2445  oprnegate => '>=(timestamp,timestamp)', oprcode => 'timestamp_lt',
2446  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
2447{ oid => '2063', descr => 'less than or equal',
2448  oprname => '<=', oprleft => 'timestamp', oprright => 'timestamp',
2449  oprresult => 'bool', oprcom => '>=(timestamp,timestamp)',
2450  oprnegate => '>(timestamp,timestamp)', oprcode => 'timestamp_le',
2451  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
2452{ oid => '2064', descr => 'greater than',
2453  oprname => '>', oprleft => 'timestamp', oprright => 'timestamp',
2454  oprresult => 'bool', oprcom => '<(timestamp,timestamp)',
2455  oprnegate => '<=(timestamp,timestamp)', oprcode => 'timestamp_gt',
2456  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
2457{ oid => '2065', descr => 'greater than or equal',
2458  oprname => '>=', oprleft => 'timestamp', oprright => 'timestamp',
2459  oprresult => 'bool', oprcom => '<=(timestamp,timestamp)',
2460  oprnegate => '<(timestamp,timestamp)', oprcode => 'timestamp_ge',
2461  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
2462{ oid => '2066', descr => 'add',
2463  oprname => '+', oprleft => 'timestamp', oprright => 'interval',
2464  oprresult => 'timestamp', oprcom => '+(interval,timestamp)',
2465  oprcode => 'timestamp_pl_interval' },
2466{ oid => '2067', descr => 'subtract',
2467  oprname => '-', oprleft => 'timestamp', oprright => 'timestamp',
2468  oprresult => 'interval', oprcode => 'timestamp_mi' },
2469{ oid => '2068', descr => 'subtract',
2470  oprname => '-', oprleft => 'timestamp', oprright => 'interval',
2471  oprresult => 'timestamp', oprcode => 'timestamp_mi_interval' },
2472
2473# character-by-character (not collation order) comparison operators for character types
2474{ oid => '2314', descr => 'less than',
2475  oprname => '~<~', oprleft => 'text', oprright => 'text', oprresult => 'bool',
2476  oprcom => '~>~(text,text)', oprnegate => '~>=~(text,text)',
2477  oprcode => 'text_pattern_lt', oprrest => 'scalarltsel',
2478  oprjoin => 'scalarltjoinsel' },
2479{ oid => '2315', descr => 'less than or equal',
2480  oprname => '~<=~', oprleft => 'text', oprright => 'text', oprresult => 'bool',
2481  oprcom => '~>=~(text,text)', oprnegate => '~>~(text,text)',
2482  oprcode => 'text_pattern_le', oprrest => 'scalarlesel',
2483  oprjoin => 'scalarlejoinsel' },
2484{ oid => '2317', descr => 'greater than or equal',
2485  oprname => '~>=~', oprleft => 'text', oprright => 'text', oprresult => 'bool',
2486  oprcom => '~<=~(text,text)', oprnegate => '~<~(text,text)',
2487  oprcode => 'text_pattern_ge', oprrest => 'scalargesel',
2488  oprjoin => 'scalargejoinsel' },
2489{ oid => '2318', descr => 'greater than',
2490  oprname => '~>~', oprleft => 'text', oprright => 'text', oprresult => 'bool',
2491  oprcom => '~<~(text,text)', oprnegate => '~<=~(text,text)',
2492  oprcode => 'text_pattern_gt', oprrest => 'scalargtsel',
2493  oprjoin => 'scalargtjoinsel' },
2494
2495{ oid => '2326', descr => 'less than',
2496  oprname => '~<~', oprleft => 'bpchar', oprright => 'bpchar',
2497  oprresult => 'bool', oprcom => '~>~(bpchar,bpchar)',
2498  oprnegate => '~>=~(bpchar,bpchar)', oprcode => 'bpchar_pattern_lt',
2499  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
2500{ oid => '2327', descr => 'less than or equal',
2501  oprname => '~<=~', oprleft => 'bpchar', oprright => 'bpchar',
2502  oprresult => 'bool', oprcom => '~>=~(bpchar,bpchar)',
2503  oprnegate => '~>~(bpchar,bpchar)', oprcode => 'bpchar_pattern_le',
2504  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
2505{ oid => '2329', descr => 'greater than or equal',
2506  oprname => '~>=~', oprleft => 'bpchar', oprright => 'bpchar',
2507  oprresult => 'bool', oprcom => '~<=~(bpchar,bpchar)',
2508  oprnegate => '~<~(bpchar,bpchar)', oprcode => 'bpchar_pattern_ge',
2509  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
2510{ oid => '2330', descr => 'greater than',
2511  oprname => '~>~', oprleft => 'bpchar', oprright => 'bpchar',
2512  oprresult => 'bool', oprcom => '~<~(bpchar,bpchar)',
2513  oprnegate => '~<=~(bpchar,bpchar)', oprcode => 'bpchar_pattern_gt',
2514  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
2515
2516# crosstype operations for date vs. timestamp and timestamptz
2517{ oid => '2345', descr => 'less than',
2518  oprname => '<', oprleft => 'date', oprright => 'timestamp',
2519  oprresult => 'bool', oprcom => '>(timestamp,date)',
2520  oprnegate => '>=(date,timestamp)', oprcode => 'date_lt_timestamp',
2521  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
2522{ oid => '2346', descr => 'less than or equal',
2523  oprname => '<=', oprleft => 'date', oprright => 'timestamp',
2524  oprresult => 'bool', oprcom => '>=(timestamp,date)',
2525  oprnegate => '>(date,timestamp)', oprcode => 'date_le_timestamp',
2526  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
2527{ oid => '2347', descr => 'equal',
2528  oprname => '=', oprcanmerge => 't', oprleft => 'date',
2529  oprright => 'timestamp', oprresult => 'bool', oprcom => '=(timestamp,date)',
2530  oprnegate => '<>(date,timestamp)', oprcode => 'date_eq_timestamp',
2531  oprrest => 'eqsel', oprjoin => 'eqjoinsel' },
2532{ oid => '2348', descr => 'greater than or equal',
2533  oprname => '>=', oprleft => 'date', oprright => 'timestamp',
2534  oprresult => 'bool', oprcom => '<=(timestamp,date)',
2535  oprnegate => '<(date,timestamp)', oprcode => 'date_ge_timestamp',
2536  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
2537{ oid => '2349', descr => 'greater than',
2538  oprname => '>', oprleft => 'date', oprright => 'timestamp',
2539  oprresult => 'bool', oprcom => '<(timestamp,date)',
2540  oprnegate => '<=(date,timestamp)', oprcode => 'date_gt_timestamp',
2541  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
2542{ oid => '2350', descr => 'not equal',
2543  oprname => '<>', oprleft => 'date', oprright => 'timestamp',
2544  oprresult => 'bool', oprcom => '<>(timestamp,date)',
2545  oprnegate => '=(date,timestamp)', oprcode => 'date_ne_timestamp',
2546  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
2547
2548{ oid => '2358', descr => 'less than',
2549  oprname => '<', oprleft => 'date', oprright => 'timestamptz',
2550  oprresult => 'bool', oprcom => '>(timestamptz,date)',
2551  oprnegate => '>=(date,timestamptz)', oprcode => 'date_lt_timestamptz',
2552  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
2553{ oid => '2359', descr => 'less than or equal',
2554  oprname => '<=', oprleft => 'date', oprright => 'timestamptz',
2555  oprresult => 'bool', oprcom => '>=(timestamptz,date)',
2556  oprnegate => '>(date,timestamptz)', oprcode => 'date_le_timestamptz',
2557  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
2558{ oid => '2360', descr => 'equal',
2559  oprname => '=', oprcanmerge => 't', oprleft => 'date',
2560  oprright => 'timestamptz', oprresult => 'bool',
2561  oprcom => '=(timestamptz,date)', oprnegate => '<>(date,timestamptz)',
2562  oprcode => 'date_eq_timestamptz', oprrest => 'eqsel',
2563  oprjoin => 'eqjoinsel' },
2564{ oid => '2361', descr => 'greater than or equal',
2565  oprname => '>=', oprleft => 'date', oprright => 'timestamptz',
2566  oprresult => 'bool', oprcom => '<=(timestamptz,date)',
2567  oprnegate => '<(date,timestamptz)', oprcode => 'date_ge_timestamptz',
2568  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
2569{ oid => '2362', descr => 'greater than',
2570  oprname => '>', oprleft => 'date', oprright => 'timestamptz',
2571  oprresult => 'bool', oprcom => '<(timestamptz,date)',
2572  oprnegate => '<=(date,timestamptz)', oprcode => 'date_gt_timestamptz',
2573  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
2574{ oid => '2363', descr => 'not equal',
2575  oprname => '<>', oprleft => 'date', oprright => 'timestamptz',
2576  oprresult => 'bool', oprcom => '<>(timestamptz,date)',
2577  oprnegate => '=(date,timestamptz)', oprcode => 'date_ne_timestamptz',
2578  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
2579
2580{ oid => '2371', descr => 'less than',
2581  oprname => '<', oprleft => 'timestamp', oprright => 'date',
2582  oprresult => 'bool', oprcom => '>(date,timestamp)',
2583  oprnegate => '>=(timestamp,date)', oprcode => 'timestamp_lt_date',
2584  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
2585{ oid => '2372', descr => 'less than or equal',
2586  oprname => '<=', oprleft => 'timestamp', oprright => 'date',
2587  oprresult => 'bool', oprcom => '>=(date,timestamp)',
2588  oprnegate => '>(timestamp,date)', oprcode => 'timestamp_le_date',
2589  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
2590{ oid => '2373', descr => 'equal',
2591  oprname => '=', oprcanmerge => 't', oprleft => 'timestamp',
2592  oprright => 'date', oprresult => 'bool', oprcom => '=(date,timestamp)',
2593  oprnegate => '<>(timestamp,date)', oprcode => 'timestamp_eq_date',
2594  oprrest => 'eqsel', oprjoin => 'eqjoinsel' },
2595{ oid => '2374', descr => 'greater than or equal',
2596  oprname => '>=', oprleft => 'timestamp', oprright => 'date',
2597  oprresult => 'bool', oprcom => '<=(date,timestamp)',
2598  oprnegate => '<(timestamp,date)', oprcode => 'timestamp_ge_date',
2599  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
2600{ oid => '2375', descr => 'greater than',
2601  oprname => '>', oprleft => 'timestamp', oprright => 'date',
2602  oprresult => 'bool', oprcom => '<(date,timestamp)',
2603  oprnegate => '<=(timestamp,date)', oprcode => 'timestamp_gt_date',
2604  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
2605{ oid => '2376', descr => 'not equal',
2606  oprname => '<>', oprleft => 'timestamp', oprright => 'date',
2607  oprresult => 'bool', oprcom => '<>(date,timestamp)',
2608  oprnegate => '=(timestamp,date)', oprcode => 'timestamp_ne_date',
2609  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
2610
2611{ oid => '2384', descr => 'less than',
2612  oprname => '<', oprleft => 'timestamptz', oprright => 'date',
2613  oprresult => 'bool', oprcom => '>(date,timestamptz)',
2614  oprnegate => '>=(timestamptz,date)', oprcode => 'timestamptz_lt_date',
2615  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
2616{ oid => '2385', descr => 'less than or equal',
2617  oprname => '<=', oprleft => 'timestamptz', oprright => 'date',
2618  oprresult => 'bool', oprcom => '>=(date,timestamptz)',
2619  oprnegate => '>(timestamptz,date)', oprcode => 'timestamptz_le_date',
2620  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
2621{ oid => '2386', descr => 'equal',
2622  oprname => '=', oprcanmerge => 't', oprleft => 'timestamptz',
2623  oprright => 'date', oprresult => 'bool', oprcom => '=(date,timestamptz)',
2624  oprnegate => '<>(timestamptz,date)', oprcode => 'timestamptz_eq_date',
2625  oprrest => 'eqsel', oprjoin => 'eqjoinsel' },
2626{ oid => '2387', descr => 'greater than or equal',
2627  oprname => '>=', oprleft => 'timestamptz', oprright => 'date',
2628  oprresult => 'bool', oprcom => '<=(date,timestamptz)',
2629  oprnegate => '<(timestamptz,date)', oprcode => 'timestamptz_ge_date',
2630  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
2631{ oid => '2388', descr => 'greater than',
2632  oprname => '>', oprleft => 'timestamptz', oprright => 'date',
2633  oprresult => 'bool', oprcom => '<(date,timestamptz)',
2634  oprnegate => '<=(timestamptz,date)', oprcode => 'timestamptz_gt_date',
2635  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
2636{ oid => '2389', descr => 'not equal',
2637  oprname => '<>', oprleft => 'timestamptz', oprright => 'date',
2638  oprresult => 'bool', oprcom => '<>(date,timestamptz)',
2639  oprnegate => '=(timestamptz,date)', oprcode => 'timestamptz_ne_date',
2640  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
2641
2642# crosstype operations for timestamp vs. timestamptz
2643{ oid => '2534', descr => 'less than',
2644  oprname => '<', oprleft => 'timestamp', oprright => 'timestamptz',
2645  oprresult => 'bool', oprcom => '>(timestamptz,timestamp)',
2646  oprnegate => '>=(timestamp,timestamptz)',
2647  oprcode => 'timestamp_lt_timestamptz', oprrest => 'scalarltsel',
2648  oprjoin => 'scalarltjoinsel' },
2649{ oid => '2535', descr => 'less than or equal',
2650  oprname => '<=', oprleft => 'timestamp', oprright => 'timestamptz',
2651  oprresult => 'bool', oprcom => '>=(timestamptz,timestamp)',
2652  oprnegate => '>(timestamp,timestamptz)',
2653  oprcode => 'timestamp_le_timestamptz', oprrest => 'scalarlesel',
2654  oprjoin => 'scalarlejoinsel' },
2655{ oid => '2536', descr => 'equal',
2656  oprname => '=', oprcanmerge => 't', oprleft => 'timestamp',
2657  oprright => 'timestamptz', oprresult => 'bool',
2658  oprcom => '=(timestamptz,timestamp)',
2659  oprnegate => '<>(timestamp,timestamptz)',
2660  oprcode => 'timestamp_eq_timestamptz', oprrest => 'eqsel',
2661  oprjoin => 'eqjoinsel' },
2662{ oid => '2537', descr => 'greater than or equal',
2663  oprname => '>=', oprleft => 'timestamp', oprright => 'timestamptz',
2664  oprresult => 'bool', oprcom => '<=(timestamptz,timestamp)',
2665  oprnegate => '<(timestamp,timestamptz)',
2666  oprcode => 'timestamp_ge_timestamptz', oprrest => 'scalargesel',
2667  oprjoin => 'scalargejoinsel' },
2668{ oid => '2538', descr => 'greater than',
2669  oprname => '>', oprleft => 'timestamp', oprright => 'timestamptz',
2670  oprresult => 'bool', oprcom => '<(timestamptz,timestamp)',
2671  oprnegate => '<=(timestamp,timestamptz)',
2672  oprcode => 'timestamp_gt_timestamptz', oprrest => 'scalargtsel',
2673  oprjoin => 'scalargtjoinsel' },
2674{ oid => '2539', descr => 'not equal',
2675  oprname => '<>', oprleft => 'timestamp', oprright => 'timestamptz',
2676  oprresult => 'bool', oprcom => '<>(timestamptz,timestamp)',
2677  oprnegate => '=(timestamp,timestamptz)',
2678  oprcode => 'timestamp_ne_timestamptz', oprrest => 'neqsel',
2679  oprjoin => 'neqjoinsel' },
2680
2681{ oid => '2540', descr => 'less than',
2682  oprname => '<', oprleft => 'timestamptz', oprright => 'timestamp',
2683  oprresult => 'bool', oprcom => '>(timestamp,timestamptz)',
2684  oprnegate => '>=(timestamptz,timestamp)',
2685  oprcode => 'timestamptz_lt_timestamp', oprrest => 'scalarltsel',
2686  oprjoin => 'scalarltjoinsel' },
2687{ oid => '2541', descr => 'less than or equal',
2688  oprname => '<=', oprleft => 'timestamptz', oprright => 'timestamp',
2689  oprresult => 'bool', oprcom => '>=(timestamp,timestamptz)',
2690  oprnegate => '>(timestamptz,timestamp)',
2691  oprcode => 'timestamptz_le_timestamp', oprrest => 'scalarlesel',
2692  oprjoin => 'scalarlejoinsel' },
2693{ oid => '2542', descr => 'equal',
2694  oprname => '=', oprcanmerge => 't', oprleft => 'timestamptz',
2695  oprright => 'timestamp', oprresult => 'bool',
2696  oprcom => '=(timestamp,timestamptz)',
2697  oprnegate => '<>(timestamptz,timestamp)',
2698  oprcode => 'timestamptz_eq_timestamp', oprrest => 'eqsel',
2699  oprjoin => 'eqjoinsel' },
2700{ oid => '2543', descr => 'greater than or equal',
2701  oprname => '>=', oprleft => 'timestamptz', oprright => 'timestamp',
2702  oprresult => 'bool', oprcom => '<=(timestamp,timestamptz)',
2703  oprnegate => '<(timestamptz,timestamp)',
2704  oprcode => 'timestamptz_ge_timestamp', oprrest => 'scalargesel',
2705  oprjoin => 'scalargejoinsel' },
2706{ oid => '2544', descr => 'greater than',
2707  oprname => '>', oprleft => 'timestamptz', oprright => 'timestamp',
2708  oprresult => 'bool', oprcom => '<(timestamp,timestamptz)',
2709  oprnegate => '<=(timestamptz,timestamp)',
2710  oprcode => 'timestamptz_gt_timestamp', oprrest => 'scalargtsel',
2711  oprjoin => 'scalargtjoinsel' },
2712{ oid => '2545', descr => 'not equal',
2713  oprname => '<>', oprleft => 'timestamptz', oprright => 'timestamp',
2714  oprresult => 'bool', oprcom => '<>(timestamp,timestamptz)',
2715  oprnegate => '=(timestamptz,timestamp)',
2716  oprcode => 'timestamptz_ne_timestamp', oprrest => 'neqsel',
2717  oprjoin => 'neqjoinsel' },
2718
2719# formerly-missing interval + datetime operators
2720{ oid => '2551', descr => 'add',
2721  oprname => '+', oprleft => 'interval', oprright => 'date',
2722  oprresult => 'timestamp', oprcom => '+(date,interval)',
2723  oprcode => 'interval_pl_date' },
2724{ oid => '2552', descr => 'add',
2725  oprname => '+', oprleft => 'interval', oprright => 'timetz',
2726  oprresult => 'timetz', oprcom => '+(timetz,interval)',
2727  oprcode => 'interval_pl_timetz' },
2728{ oid => '2553', descr => 'add',
2729  oprname => '+', oprleft => 'interval', oprright => 'timestamp',
2730  oprresult => 'timestamp', oprcom => '+(timestamp,interval)',
2731  oprcode => 'interval_pl_timestamp' },
2732{ oid => '2554', descr => 'add',
2733  oprname => '+', oprleft => 'interval', oprright => 'timestamptz',
2734  oprresult => 'timestamptz', oprcom => '+(timestamptz,interval)',
2735  oprcode => 'interval_pl_timestamptz' },
2736{ oid => '2555', descr => 'add',
2737  oprname => '+', oprleft => 'int4', oprright => 'date', oprresult => 'date',
2738  oprcom => '+(date,int4)', oprcode => 'integer_pl_date' },
2739
2740# new operators for Y-direction rtree opfamilies
2741{ oid => '2570', descr => 'is below',
2742  oprname => '<<|', oprleft => 'box', oprright => 'box', oprresult => 'bool',
2743  oprcode => 'box_below', oprrest => 'positionsel',
2744  oprjoin => 'positionjoinsel' },
2745{ oid => '2571', descr => 'overlaps or is below',
2746  oprname => '&<|', oprleft => 'box', oprright => 'box', oprresult => 'bool',
2747  oprcode => 'box_overbelow', oprrest => 'positionsel',
2748  oprjoin => 'positionjoinsel' },
2749{ oid => '2572', descr => 'overlaps or is above',
2750  oprname => '|&>', oprleft => 'box', oprright => 'box', oprresult => 'bool',
2751  oprcode => 'box_overabove', oprrest => 'positionsel',
2752  oprjoin => 'positionjoinsel' },
2753{ oid => '2573', descr => 'is above',
2754  oprname => '|>>', oprleft => 'box', oprright => 'box', oprresult => 'bool',
2755  oprcode => 'box_above', oprrest => 'positionsel',
2756  oprjoin => 'positionjoinsel' },
2757{ oid => '2574', descr => 'is below',
2758  oprname => '<<|', oprleft => 'polygon', oprright => 'polygon',
2759  oprresult => 'bool', oprcode => 'poly_below', oprrest => 'positionsel',
2760  oprjoin => 'positionjoinsel' },
2761{ oid => '2575', descr => 'overlaps or is below',
2762  oprname => '&<|', oprleft => 'polygon', oprright => 'polygon',
2763  oprresult => 'bool', oprcode => 'poly_overbelow', oprrest => 'positionsel',
2764  oprjoin => 'positionjoinsel' },
2765{ oid => '2576', descr => 'overlaps or is above',
2766  oprname => '|&>', oprleft => 'polygon', oprright => 'polygon',
2767  oprresult => 'bool', oprcode => 'poly_overabove', oprrest => 'positionsel',
2768  oprjoin => 'positionjoinsel' },
2769{ oid => '2577', descr => 'is above',
2770  oprname => '|>>', oprleft => 'polygon', oprright => 'polygon',
2771  oprresult => 'bool', oprcode => 'poly_above', oprrest => 'positionsel',
2772  oprjoin => 'positionjoinsel' },
2773{ oid => '2589', descr => 'overlaps or is below',
2774  oprname => '&<|', oprleft => 'circle', oprright => 'circle',
2775  oprresult => 'bool', oprcode => 'circle_overbelow', oprrest => 'positionsel',
2776  oprjoin => 'positionjoinsel' },
2777{ oid => '2590', descr => 'overlaps or is above',
2778  oprname => '|&>', oprleft => 'circle', oprright => 'circle',
2779  oprresult => 'bool', oprcode => 'circle_overabove', oprrest => 'positionsel',
2780  oprjoin => 'positionjoinsel' },
2781
2782# overlap/contains/contained for arrays
2783{ oid => '2750', oid_symbol => 'OID_ARRAY_OVERLAP_OP', descr => 'overlaps',
2784  oprname => '&&', oprleft => 'anyarray', oprright => 'anyarray',
2785  oprresult => 'bool', oprcom => '&&(anyarray,anyarray)',
2786  oprcode => 'arrayoverlap', oprrest => 'arraycontsel',
2787  oprjoin => 'arraycontjoinsel' },
2788{ oid => '2751', oid_symbol => 'OID_ARRAY_CONTAINS_OP', descr => 'contains',
2789  oprname => '@>', oprleft => 'anyarray', oprright => 'anyarray',
2790  oprresult => 'bool', oprcom => '<@(anyarray,anyarray)',
2791  oprcode => 'arraycontains', oprrest => 'arraycontsel',
2792  oprjoin => 'arraycontjoinsel' },
2793{ oid => '2752', oid_symbol => 'OID_ARRAY_CONTAINED_OP',
2794  descr => 'is contained by',
2795  oprname => '<@', oprleft => 'anyarray', oprright => 'anyarray',
2796  oprresult => 'bool', oprcom => '@>(anyarray,anyarray)',
2797  oprcode => 'arraycontained', oprrest => 'arraycontsel',
2798  oprjoin => 'arraycontjoinsel' },
2799
2800# capturing operators to preserve pre-8.3 behavior of text concatenation
2801{ oid => '2779', descr => 'concatenate',
2802  oprname => '||', oprleft => 'text', oprright => 'anynonarray',
2803  oprresult => 'text', oprcode => 'textanycat' },
2804{ oid => '2780', descr => 'concatenate',
2805  oprname => '||', oprleft => 'anynonarray', oprright => 'text',
2806  oprresult => 'text', oprcode => 'anytextcat' },
2807
2808# obsolete names for contains/contained-by operators; remove these someday
2809{ oid => '2860', descr => 'deprecated, use <@ instead',
2810  oprname => '@', oprleft => 'polygon', oprright => 'polygon',
2811  oprresult => 'bool', oprcom => '~(polygon,polygon)',
2812  oprcode => 'poly_contained', oprrest => 'contsel', oprjoin => 'contjoinsel' },
2813{ oid => '2861', descr => 'deprecated, use @> instead',
2814  oprname => '~', oprleft => 'polygon', oprright => 'polygon',
2815  oprresult => 'bool', oprcom => '@(polygon,polygon)',
2816  oprcode => 'poly_contain', oprrest => 'contsel', oprjoin => 'contjoinsel' },
2817{ oid => '2862', descr => 'deprecated, use <@ instead',
2818  oprname => '@', oprleft => 'box', oprright => 'box', oprresult => 'bool',
2819  oprcom => '~(box,box)', oprcode => 'box_contained', oprrest => 'contsel',
2820  oprjoin => 'contjoinsel' },
2821{ oid => '2863', descr => 'deprecated, use @> instead',
2822  oprname => '~', oprleft => 'box', oprright => 'box', oprresult => 'bool',
2823  oprcom => '@(box,box)', oprcode => 'box_contain', oprrest => 'contsel',
2824  oprjoin => 'contjoinsel' },
2825{ oid => '2864', descr => 'deprecated, use <@ instead',
2826  oprname => '@', oprleft => 'circle', oprright => 'circle',
2827  oprresult => 'bool', oprcom => '~(circle,circle)',
2828  oprcode => 'circle_contained', oprrest => 'contsel',
2829  oprjoin => 'contjoinsel' },
2830{ oid => '2865', descr => 'deprecated, use @> instead',
2831  oprname => '~', oprleft => 'circle', oprright => 'circle',
2832  oprresult => 'bool', oprcom => '@(circle,circle)',
2833  oprcode => 'circle_contain', oprrest => 'contsel', oprjoin => 'contjoinsel' },
2834{ oid => '2866', descr => 'deprecated, use <@ instead',
2835  oprname => '@', oprleft => 'point', oprright => 'box', oprresult => 'bool',
2836  oprcode => 'on_pb' },
2837{ oid => '2867', descr => 'deprecated, use <@ instead',
2838  oprname => '@', oprleft => 'point', oprright => 'path', oprresult => 'bool',
2839  oprcom => '~(path,point)', oprcode => 'on_ppath' },
2840{ oid => '2868', descr => 'deprecated, use @> instead',
2841  oprname => '~', oprleft => 'path', oprright => 'point', oprresult => 'bool',
2842  oprcom => '@(point,path)', oprcode => 'path_contain_pt' },
2843{ oid => '2869', descr => 'deprecated, use <@ instead',
2844  oprname => '@', oprleft => 'point', oprright => 'polygon',
2845  oprresult => 'bool', oprcom => '~(polygon,point)',
2846  oprcode => 'pt_contained_poly' },
2847{ oid => '2870', descr => 'deprecated, use @> instead',
2848  oprname => '~', oprleft => 'polygon', oprright => 'point',
2849  oprresult => 'bool', oprcom => '@(point,polygon)',
2850  oprcode => 'poly_contain_pt' },
2851{ oid => '2871', descr => 'deprecated, use <@ instead',
2852  oprname => '@', oprleft => 'point', oprright => 'circle', oprresult => 'bool',
2853  oprcom => '~(circle,point)', oprcode => 'pt_contained_circle' },
2854{ oid => '2872', descr => 'deprecated, use @> instead',
2855  oprname => '~', oprleft => 'circle', oprright => 'point', oprresult => 'bool',
2856  oprcom => '@(point,circle)', oprcode => 'circle_contain_pt' },
2857{ oid => '2873', descr => 'deprecated, use <@ instead',
2858  oprname => '@', oprleft => 'point', oprright => 'line', oprresult => 'bool',
2859  oprcode => 'on_pl' },
2860{ oid => '2874', descr => 'deprecated, use <@ instead',
2861  oprname => '@', oprleft => 'point', oprright => 'lseg', oprresult => 'bool',
2862  oprcode => 'on_ps' },
2863{ oid => '2875', descr => 'deprecated, use <@ instead',
2864  oprname => '@', oprleft => 'lseg', oprright => 'line', oprresult => 'bool',
2865  oprcode => 'on_sl' },
2866{ oid => '2876', descr => 'deprecated, use <@ instead',
2867  oprname => '@', oprleft => 'lseg', oprright => 'box', oprresult => 'bool',
2868  oprcode => 'on_sb' },
2869{ oid => '2877', descr => 'deprecated, use @> instead',
2870  oprname => '~', oprleft => '_aclitem', oprright => 'aclitem',
2871  oprresult => 'bool', oprcode => 'aclcontains' },
2872
2873# uuid operators
2874{ oid => '2972', descr => 'equal',
2875  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'uuid',
2876  oprright => 'uuid', oprresult => 'bool', oprcom => '=(uuid,uuid)',
2877  oprnegate => '<>(uuid,uuid)', oprcode => 'uuid_eq', oprrest => 'eqsel',
2878  oprjoin => 'eqjoinsel' },
2879{ oid => '2973', descr => 'not equal',
2880  oprname => '<>', oprleft => 'uuid', oprright => 'uuid', oprresult => 'bool',
2881  oprcom => '<>(uuid,uuid)', oprnegate => '=(uuid,uuid)', oprcode => 'uuid_ne',
2882  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
2883{ oid => '2974', descr => 'less than',
2884  oprname => '<', oprleft => 'uuid', oprright => 'uuid', oprresult => 'bool',
2885  oprcom => '>(uuid,uuid)', oprnegate => '>=(uuid,uuid)', oprcode => 'uuid_lt',
2886  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
2887{ oid => '2975', descr => 'greater than',
2888  oprname => '>', oprleft => 'uuid', oprright => 'uuid', oprresult => 'bool',
2889  oprcom => '<(uuid,uuid)', oprnegate => '<=(uuid,uuid)', oprcode => 'uuid_gt',
2890  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
2891{ oid => '2976', descr => 'less than or equal',
2892  oprname => '<=', oprleft => 'uuid', oprright => 'uuid', oprresult => 'bool',
2893  oprcom => '>=(uuid,uuid)', oprnegate => '>(uuid,uuid)', oprcode => 'uuid_le',
2894  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
2895{ oid => '2977', descr => 'greater than or equal',
2896  oprname => '>=', oprleft => 'uuid', oprright => 'uuid', oprresult => 'bool',
2897  oprcom => '<=(uuid,uuid)', oprnegate => '<(uuid,uuid)', oprcode => 'uuid_ge',
2898  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
2899
2900# pg_lsn operators
2901{ oid => '3222', descr => 'equal',
2902  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'pg_lsn',
2903  oprright => 'pg_lsn', oprresult => 'bool', oprcom => '=(pg_lsn,pg_lsn)',
2904  oprnegate => '<>(pg_lsn,pg_lsn)', oprcode => 'pg_lsn_eq', oprrest => 'eqsel',
2905  oprjoin => 'eqjoinsel' },
2906{ oid => '3223', descr => 'not equal',
2907  oprname => '<>', oprleft => 'pg_lsn', oprright => 'pg_lsn',
2908  oprresult => 'bool', oprcom => '<>(pg_lsn,pg_lsn)',
2909  oprnegate => '=(pg_lsn,pg_lsn)', oprcode => 'pg_lsn_ne', oprrest => 'neqsel',
2910  oprjoin => 'neqjoinsel' },
2911{ oid => '3224', descr => 'less than',
2912  oprname => '<', oprleft => 'pg_lsn', oprright => 'pg_lsn',
2913  oprresult => 'bool', oprcom => '>(pg_lsn,pg_lsn)',
2914  oprnegate => '>=(pg_lsn,pg_lsn)', oprcode => 'pg_lsn_lt',
2915  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
2916{ oid => '3225', descr => 'greater than',
2917  oprname => '>', oprleft => 'pg_lsn', oprright => 'pg_lsn',
2918  oprresult => 'bool', oprcom => '<(pg_lsn,pg_lsn)',
2919  oprnegate => '<=(pg_lsn,pg_lsn)', oprcode => 'pg_lsn_gt',
2920  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
2921{ oid => '3226', descr => 'less than or equal',
2922  oprname => '<=', oprleft => 'pg_lsn', oprright => 'pg_lsn',
2923  oprresult => 'bool', oprcom => '>=(pg_lsn,pg_lsn)',
2924  oprnegate => '>(pg_lsn,pg_lsn)', oprcode => 'pg_lsn_le',
2925  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
2926{ oid => '3227', descr => 'greater than or equal',
2927  oprname => '>=', oprleft => 'pg_lsn', oprright => 'pg_lsn',
2928  oprresult => 'bool', oprcom => '<=(pg_lsn,pg_lsn)',
2929  oprnegate => '<(pg_lsn,pg_lsn)', oprcode => 'pg_lsn_ge',
2930  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
2931{ oid => '3228', descr => 'minus',
2932  oprname => '-', oprleft => 'pg_lsn', oprright => 'pg_lsn',
2933  oprresult => 'numeric', oprcode => 'pg_lsn_mi' },
2934
2935# enum operators
2936{ oid => '3516', descr => 'equal',
2937  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'anyenum',
2938  oprright => 'anyenum', oprresult => 'bool', oprcom => '=(anyenum,anyenum)',
2939  oprnegate => '<>(anyenum,anyenum)', oprcode => 'enum_eq', oprrest => 'eqsel',
2940  oprjoin => 'eqjoinsel' },
2941{ oid => '3517', descr => 'not equal',
2942  oprname => '<>', oprleft => 'anyenum', oprright => 'anyenum',
2943  oprresult => 'bool', oprcom => '<>(anyenum,anyenum)',
2944  oprnegate => '=(anyenum,anyenum)', oprcode => 'enum_ne', oprrest => 'neqsel',
2945  oprjoin => 'neqjoinsel' },
2946{ oid => '3518', descr => 'less than',
2947  oprname => '<', oprleft => 'anyenum', oprright => 'anyenum',
2948  oprresult => 'bool', oprcom => '>(anyenum,anyenum)',
2949  oprnegate => '>=(anyenum,anyenum)', oprcode => 'enum_lt',
2950  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
2951{ oid => '3519', descr => 'greater than',
2952  oprname => '>', oprleft => 'anyenum', oprright => 'anyenum',
2953  oprresult => 'bool', oprcom => '<(anyenum,anyenum)',
2954  oprnegate => '<=(anyenum,anyenum)', oprcode => 'enum_gt',
2955  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
2956{ oid => '3520', descr => 'less than or equal',
2957  oprname => '<=', oprleft => 'anyenum', oprright => 'anyenum',
2958  oprresult => 'bool', oprcom => '>=(anyenum,anyenum)',
2959  oprnegate => '>(anyenum,anyenum)', oprcode => 'enum_le',
2960  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
2961{ oid => '3521', descr => 'greater than or equal',
2962  oprname => '>=', oprleft => 'anyenum', oprright => 'anyenum',
2963  oprresult => 'bool', oprcom => '<=(anyenum,anyenum)',
2964  oprnegate => '<(anyenum,anyenum)', oprcode => 'enum_ge',
2965  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
2966
2967# tsearch operations
2968{ oid => '3627', descr => 'less than',
2969  oprname => '<', oprleft => 'tsvector', oprright => 'tsvector',
2970  oprresult => 'bool', oprcom => '>(tsvector,tsvector)',
2971  oprnegate => '>=(tsvector,tsvector)', oprcode => 'tsvector_lt',
2972  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
2973{ oid => '3628', descr => 'less than or equal',
2974  oprname => '<=', oprleft => 'tsvector', oprright => 'tsvector',
2975  oprresult => 'bool', oprcom => '>=(tsvector,tsvector)',
2976  oprnegate => '>(tsvector,tsvector)', oprcode => 'tsvector_le',
2977  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
2978{ oid => '3629', descr => 'equal',
2979  oprname => '=', oprcanmerge => 't', oprleft => 'tsvector',
2980  oprright => 'tsvector', oprresult => 'bool', oprcom => '=(tsvector,tsvector)',
2981  oprnegate => '<>(tsvector,tsvector)', oprcode => 'tsvector_eq',
2982  oprrest => 'eqsel', oprjoin => 'eqjoinsel' },
2983{ oid => '3630', descr => 'not equal',
2984  oprname => '<>', oprleft => 'tsvector', oprright => 'tsvector',
2985  oprresult => 'bool', oprcom => '<>(tsvector,tsvector)',
2986  oprnegate => '=(tsvector,tsvector)', oprcode => 'tsvector_ne',
2987  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
2988{ oid => '3631', descr => 'greater than or equal',
2989  oprname => '>=', oprleft => 'tsvector', oprright => 'tsvector',
2990  oprresult => 'bool', oprcom => '<=(tsvector,tsvector)',
2991  oprnegate => '<(tsvector,tsvector)', oprcode => 'tsvector_ge',
2992  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
2993{ oid => '3632', descr => 'greater than',
2994  oprname => '>', oprleft => 'tsvector', oprright => 'tsvector',
2995  oprresult => 'bool', oprcom => '<(tsvector,tsvector)',
2996  oprnegate => '<=(tsvector,tsvector)', oprcode => 'tsvector_gt',
2997  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
2998{ oid => '3633', descr => 'concatenate',
2999  oprname => '||', oprleft => 'tsvector', oprright => 'tsvector',
3000  oprresult => 'tsvector', oprcode => 'tsvector_concat' },
3001{ oid => '3636', descr => 'text search match',
3002  oprname => '@@', oprleft => 'tsvector', oprright => 'tsquery',
3003  oprresult => 'bool', oprcom => '@@(tsquery,tsvector)',
3004  oprcode => 'ts_match_vq', oprrest => 'tsmatchsel',
3005  oprjoin => 'tsmatchjoinsel' },
3006{ oid => '3637', descr => 'text search match',
3007  oprname => '@@', oprleft => 'tsquery', oprright => 'tsvector',
3008  oprresult => 'bool', oprcom => '@@(tsvector,tsquery)',
3009  oprcode => 'ts_match_qv', oprrest => 'tsmatchsel',
3010  oprjoin => 'tsmatchjoinsel' },
3011{ oid => '3660', descr => 'deprecated, use @@ instead',
3012  oprname => '@@@', oprleft => 'tsvector', oprright => 'tsquery',
3013  oprresult => 'bool', oprcom => '@@@(tsquery,tsvector)',
3014  oprcode => 'ts_match_vq', oprrest => 'tsmatchsel',
3015  oprjoin => 'tsmatchjoinsel' },
3016{ oid => '3661', descr => 'deprecated, use @@ instead',
3017  oprname => '@@@', oprleft => 'tsquery', oprright => 'tsvector',
3018  oprresult => 'bool', oprcom => '@@@(tsvector,tsquery)',
3019  oprcode => 'ts_match_qv', oprrest => 'tsmatchsel',
3020  oprjoin => 'tsmatchjoinsel' },
3021{ oid => '3674', descr => 'less than',
3022  oprname => '<', oprleft => 'tsquery', oprright => 'tsquery',
3023  oprresult => 'bool', oprcom => '>(tsquery,tsquery)',
3024  oprnegate => '>=(tsquery,tsquery)', oprcode => 'tsquery_lt',
3025  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
3026{ oid => '3675', descr => 'less than or equal',
3027  oprname => '<=', oprleft => 'tsquery', oprright => 'tsquery',
3028  oprresult => 'bool', oprcom => '>=(tsquery,tsquery)',
3029  oprnegate => '>(tsquery,tsquery)', oprcode => 'tsquery_le',
3030  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
3031{ oid => '3676', descr => 'equal',
3032  oprname => '=', oprcanmerge => 't', oprleft => 'tsquery',
3033  oprright => 'tsquery', oprresult => 'bool', oprcom => '=(tsquery,tsquery)',
3034  oprnegate => '<>(tsquery,tsquery)', oprcode => 'tsquery_eq',
3035  oprrest => 'eqsel', oprjoin => 'eqjoinsel' },
3036{ oid => '3677', descr => 'not equal',
3037  oprname => '<>', oprleft => 'tsquery', oprright => 'tsquery',
3038  oprresult => 'bool', oprcom => '<>(tsquery,tsquery)',
3039  oprnegate => '=(tsquery,tsquery)', oprcode => 'tsquery_ne',
3040  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
3041{ oid => '3678', descr => 'greater than or equal',
3042  oprname => '>=', oprleft => 'tsquery', oprright => 'tsquery',
3043  oprresult => 'bool', oprcom => '<=(tsquery,tsquery)',
3044  oprnegate => '<(tsquery,tsquery)', oprcode => 'tsquery_ge',
3045  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
3046{ oid => '3679', descr => 'greater than',
3047  oprname => '>', oprleft => 'tsquery', oprright => 'tsquery',
3048  oprresult => 'bool', oprcom => '<(tsquery,tsquery)',
3049  oprnegate => '<=(tsquery,tsquery)', oprcode => 'tsquery_gt',
3050  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
3051{ oid => '3680', descr => 'AND-concatenate',
3052  oprname => '&&', oprleft => 'tsquery', oprright => 'tsquery',
3053  oprresult => 'tsquery', oprcode => 'tsquery_and' },
3054{ oid => '3681', descr => 'OR-concatenate',
3055  oprname => '||', oprleft => 'tsquery', oprright => 'tsquery',
3056  oprresult => 'tsquery', oprcode => 'tsquery_or' },
3057{ oid => '5005', descr => 'phrase-concatenate',
3058  oprname => '<->', oprleft => 'tsquery', oprright => 'tsquery',
3059  oprresult => 'tsquery', oprcode => 'tsquery_phrase(tsquery,tsquery)' },
3060{ oid => '3682', descr => 'NOT tsquery',
3061  oprname => '!!', oprkind => 'l', oprleft => '0', oprright => 'tsquery',
3062  oprresult => 'tsquery', oprcode => 'tsquery_not' },
3063{ oid => '3693', descr => 'contains',
3064  oprname => '@>', oprleft => 'tsquery', oprright => 'tsquery',
3065  oprresult => 'bool', oprcom => '<@(tsquery,tsquery)',
3066  oprcode => 'tsq_mcontains', oprrest => 'contsel', oprjoin => 'contjoinsel' },
3067{ oid => '3694', descr => 'is contained by',
3068  oprname => '<@', oprleft => 'tsquery', oprright => 'tsquery',
3069  oprresult => 'bool', oprcom => '@>(tsquery,tsquery)',
3070  oprcode => 'tsq_mcontained', oprrest => 'contsel', oprjoin => 'contjoinsel' },
3071{ oid => '3762', descr => 'text search match',
3072  oprname => '@@', oprleft => 'text', oprright => 'text', oprresult => 'bool',
3073  oprcode => 'ts_match_tt', oprrest => 'contsel', oprjoin => 'contjoinsel' },
3074{ oid => '3763', descr => 'text search match',
3075  oprname => '@@', oprleft => 'text', oprright => 'tsquery',
3076  oprresult => 'bool', oprcode => 'ts_match_tq', oprrest => 'contsel',
3077  oprjoin => 'contjoinsel' },
3078
3079# generic record comparison operators
3080{ oid => '2988', oid_symbol => 'RECORD_EQ_OP', descr => 'equal',
3081  oprname => '=', oprcanmerge => 't', oprleft => 'record', oprright => 'record',
3082  oprresult => 'bool', oprcom => '=(record,record)',
3083  oprnegate => '<>(record,record)', oprcode => 'record_eq', oprrest => 'eqsel',
3084  oprjoin => 'eqjoinsel' },
3085{ oid => '2989', descr => 'not equal',
3086  oprname => '<>', oprleft => 'record', oprright => 'record',
3087  oprresult => 'bool', oprcom => '<>(record,record)',
3088  oprnegate => '=(record,record)', oprcode => 'record_ne', oprrest => 'neqsel',
3089  oprjoin => 'neqjoinsel' },
3090{ oid => '2990', oid_symbol => 'RECORD_LT_OP', descr => 'less than',
3091  oprname => '<', oprleft => 'record', oprright => 'record',
3092  oprresult => 'bool', oprcom => '>(record,record)',
3093  oprnegate => '>=(record,record)', oprcode => 'record_lt',
3094  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
3095{ oid => '2991', oid_symbol => 'RECORD_GT_OP', descr => 'greater than',
3096  oprname => '>', oprleft => 'record', oprright => 'record',
3097  oprresult => 'bool', oprcom => '<(record,record)',
3098  oprnegate => '<=(record,record)', oprcode => 'record_gt',
3099  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
3100{ oid => '2992', descr => 'less than or equal',
3101  oprname => '<=', oprleft => 'record', oprright => 'record',
3102  oprresult => 'bool', oprcom => '>=(record,record)',
3103  oprnegate => '>(record,record)', oprcode => 'record_le',
3104  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
3105{ oid => '2993', descr => 'greater than or equal',
3106  oprname => '>=', oprleft => 'record', oprright => 'record',
3107  oprresult => 'bool', oprcom => '<=(record,record)',
3108  oprnegate => '<(record,record)', oprcode => 'record_ge',
3109  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
3110
3111# byte-oriented tests for identical rows and fast sorting
3112{ oid => '3188', descr => 'identical',
3113  oprname => '*=', oprcanmerge => 't', oprleft => 'record',
3114  oprright => 'record', oprresult => 'bool', oprcom => '*=(record,record)',
3115  oprnegate => '*<>(record,record)', oprcode => 'record_image_eq',
3116  oprrest => 'eqsel', oprjoin => 'eqjoinsel' },
3117{ oid => '3189', descr => 'not identical',
3118  oprname => '*<>', oprleft => 'record', oprright => 'record',
3119  oprresult => 'bool', oprcom => '*<>(record,record)',
3120  oprnegate => '*=(record,record)', oprcode => 'record_image_ne',
3121  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
3122{ oid => '3190', descr => 'less than',
3123  oprname => '*<', oprleft => 'record', oprright => 'record',
3124  oprresult => 'bool', oprcom => '*>(record,record)',
3125  oprnegate => '*>=(record,record)', oprcode => 'record_image_lt',
3126  oprrest => 'scalarltsel', oprjoin => 'scalarltjoinsel' },
3127{ oid => '3191', descr => 'greater than',
3128  oprname => '*>', oprleft => 'record', oprright => 'record',
3129  oprresult => 'bool', oprcom => '*<(record,record)',
3130  oprnegate => '*<=(record,record)', oprcode => 'record_image_gt',
3131  oprrest => 'scalargtsel', oprjoin => 'scalargtjoinsel' },
3132{ oid => '3192', descr => 'less than or equal',
3133  oprname => '*<=', oprleft => 'record', oprright => 'record',
3134  oprresult => 'bool', oprcom => '*>=(record,record)',
3135  oprnegate => '*>(record,record)', oprcode => 'record_image_le',
3136  oprrest => 'scalarlesel', oprjoin => 'scalarlejoinsel' },
3137{ oid => '3193', descr => 'greater than or equal',
3138  oprname => '*>=', oprleft => 'record', oprright => 'record',
3139  oprresult => 'bool', oprcom => '*<=(record,record)',
3140  oprnegate => '*<(record,record)', oprcode => 'record_image_ge',
3141  oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' },
3142
3143# generic range type operators
3144{ oid => '3882', descr => 'equal',
3145  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'anyrange',
3146  oprright => 'anyrange', oprresult => 'bool', oprcom => '=(anyrange,anyrange)',
3147  oprnegate => '<>(anyrange,anyrange)', oprcode => 'range_eq',
3148  oprrest => 'eqsel', oprjoin => 'eqjoinsel' },
3149{ oid => '3883', descr => 'not equal',
3150  oprname => '<>', oprleft => 'anyrange', oprright => 'anyrange',
3151  oprresult => 'bool', oprcom => '<>(anyrange,anyrange)',
3152  oprnegate => '=(anyrange,anyrange)', oprcode => 'range_ne',
3153  oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
3154{ oid => '3884', oid_symbol => 'OID_RANGE_LESS_OP', descr => 'less than',
3155  oprname => '<', oprleft => 'anyrange', oprright => 'anyrange',
3156  oprresult => 'bool', oprcom => '>(anyrange,anyrange)',
3157  oprnegate => '>=(anyrange,anyrange)', oprcode => 'range_lt',
3158  oprrest => 'rangesel', oprjoin => 'scalarltjoinsel' },
3159{ oid => '3885', oid_symbol => 'OID_RANGE_LESS_EQUAL_OP',
3160  descr => 'less than or equal',
3161  oprname => '<=', oprleft => 'anyrange', oprright => 'anyrange',
3162  oprresult => 'bool', oprcom => '>=(anyrange,anyrange)',
3163  oprnegate => '>(anyrange,anyrange)', oprcode => 'range_le',
3164  oprrest => 'rangesel', oprjoin => 'scalarlejoinsel' },
3165{ oid => '3886', oid_symbol => 'OID_RANGE_GREATER_EQUAL_OP',
3166  descr => 'greater than or equal',
3167  oprname => '>=', oprleft => 'anyrange', oprright => 'anyrange',
3168  oprresult => 'bool', oprcom => '<=(anyrange,anyrange)',
3169  oprnegate => '<(anyrange,anyrange)', oprcode => 'range_ge',
3170  oprrest => 'rangesel', oprjoin => 'scalargejoinsel' },
3171{ oid => '3887', oid_symbol => 'OID_RANGE_GREATER_OP',
3172  descr => 'greater than',
3173  oprname => '>', oprleft => 'anyrange', oprright => 'anyrange',
3174  oprresult => 'bool', oprcom => '<(anyrange,anyrange)',
3175  oprnegate => '<=(anyrange,anyrange)', oprcode => 'range_gt',
3176  oprrest => 'rangesel', oprjoin => 'scalargtjoinsel' },
3177{ oid => '3888', oid_symbol => 'OID_RANGE_OVERLAP_OP', descr => 'overlaps',
3178  oprname => '&&', oprleft => 'anyrange', oprright => 'anyrange',
3179  oprresult => 'bool', oprcom => '&&(anyrange,anyrange)',
3180  oprcode => 'range_overlaps', oprrest => 'rangesel',
3181  oprjoin => 'areajoinsel' },
3182{ oid => '3889', oid_symbol => 'OID_RANGE_CONTAINS_ELEM_OP',
3183  descr => 'contains',
3184  oprname => '@>', oprleft => 'anyrange', oprright => 'anyelement',
3185  oprresult => 'bool', oprcom => '<@(anyelement,anyrange)',
3186  oprcode => 'range_contains_elem', oprrest => 'rangesel',
3187  oprjoin => 'contjoinsel' },
3188{ oid => '3890', oid_symbol => 'OID_RANGE_CONTAINS_OP', descr => 'contains',
3189  oprname => '@>', oprleft => 'anyrange', oprright => 'anyrange',
3190  oprresult => 'bool', oprcom => '<@(anyrange,anyrange)',
3191  oprcode => 'range_contains', oprrest => 'rangesel',
3192  oprjoin => 'contjoinsel' },
3193{ oid => '3891', oid_symbol => 'OID_RANGE_ELEM_CONTAINED_OP',
3194  descr => 'is contained by',
3195  oprname => '<@', oprleft => 'anyelement', oprright => 'anyrange',
3196  oprresult => 'bool', oprcom => '@>(anyrange,anyelement)',
3197  oprcode => 'elem_contained_by_range', oprrest => 'rangesel',
3198  oprjoin => 'contjoinsel' },
3199{ oid => '3892', oid_symbol => 'OID_RANGE_CONTAINED_OP',
3200  descr => 'is contained by',
3201  oprname => '<@', oprleft => 'anyrange', oprright => 'anyrange',
3202  oprresult => 'bool', oprcom => '@>(anyrange,anyrange)',
3203  oprcode => 'range_contained_by', oprrest => 'rangesel',
3204  oprjoin => 'contjoinsel' },
3205{ oid => '3893', oid_symbol => 'OID_RANGE_LEFT_OP', descr => 'is left of',
3206  oprname => '<<', oprleft => 'anyrange', oprright => 'anyrange',
3207  oprresult => 'bool', oprcom => '>>(anyrange,anyrange)',
3208  oprcode => 'range_before', oprrest => 'rangesel',
3209  oprjoin => 'scalarltjoinsel' },
3210{ oid => '3894', oid_symbol => 'OID_RANGE_RIGHT_OP', descr => 'is right of',
3211  oprname => '>>', oprleft => 'anyrange', oprright => 'anyrange',
3212  oprresult => 'bool', oprcom => '<<(anyrange,anyrange)',
3213  oprcode => 'range_after', oprrest => 'rangesel',
3214  oprjoin => 'scalargtjoinsel' },
3215{ oid => '3895', oid_symbol => 'OID_RANGE_OVERLAPS_LEFT_OP',
3216  descr => 'overlaps or is left of',
3217  oprname => '&<', oprleft => 'anyrange', oprright => 'anyrange',
3218  oprresult => 'bool', oprcode => 'range_overleft', oprrest => 'rangesel',
3219  oprjoin => 'scalarltjoinsel' },
3220{ oid => '3896', oid_symbol => 'OID_RANGE_OVERLAPS_RIGHT_OP',
3221  descr => 'overlaps or is right of',
3222  oprname => '&>', oprleft => 'anyrange', oprright => 'anyrange',
3223  oprresult => 'bool', oprcode => 'range_overright', oprrest => 'rangesel',
3224  oprjoin => 'scalargtjoinsel' },
3225{ oid => '3897', descr => 'is adjacent to',
3226  oprname => '-|-', oprleft => 'anyrange', oprright => 'anyrange',
3227  oprresult => 'bool', oprcom => '-|-(anyrange,anyrange)',
3228  oprcode => 'range_adjacent', oprrest => 'contsel', oprjoin => 'contjoinsel' },
3229{ oid => '3898', descr => 'range union',
3230  oprname => '+', oprleft => 'anyrange', oprright => 'anyrange',
3231  oprresult => 'anyrange', oprcom => '+(anyrange,anyrange)',
3232  oprcode => 'range_union' },
3233{ oid => '3899', descr => 'range difference',
3234  oprname => '-', oprleft => 'anyrange', oprright => 'anyrange',
3235  oprresult => 'anyrange', oprcode => 'range_minus' },
3236{ oid => '3900', descr => 'range intersection',
3237  oprname => '*', oprleft => 'anyrange', oprright => 'anyrange',
3238  oprresult => 'anyrange', oprcom => '*(anyrange,anyrange)',
3239  oprcode => 'range_intersect' },
3240{ oid => '3962', descr => 'get json object field',
3241  oprname => '->', oprleft => 'json', oprright => 'text', oprresult => 'json',
3242  oprcode => 'json_object_field' },
3243{ oid => '3963', descr => 'get json object field as text',
3244  oprname => '->>', oprleft => 'json', oprright => 'text', oprresult => 'text',
3245  oprcode => 'json_object_field_text' },
3246{ oid => '3964', descr => 'get json array element',
3247  oprname => '->', oprleft => 'json', oprright => 'int4', oprresult => 'json',
3248  oprcode => 'json_array_element' },
3249{ oid => '3965', descr => 'get json array element as text',
3250  oprname => '->>', oprleft => 'json', oprright => 'int4', oprresult => 'text',
3251  oprcode => 'json_array_element_text' },
3252{ oid => '3966', descr => 'get value from json with path elements',
3253  oprname => '#>', oprleft => 'json', oprright => '_text', oprresult => 'json',
3254  oprcode => 'json_extract_path' },
3255{ oid => '3967', descr => 'get value from json as text with path elements',
3256  oprname => '#>>', oprleft => 'json', oprright => '_text', oprresult => 'text',
3257  oprcode => 'json_extract_path_text' },
3258{ oid => '3211', descr => 'get jsonb object field',
3259  oprname => '->', oprleft => 'jsonb', oprright => 'text', oprresult => 'jsonb',
3260  oprcode => 'jsonb_object_field' },
3261{ oid => '3477', descr => 'get jsonb object field as text',
3262  oprname => '->>', oprleft => 'jsonb', oprright => 'text', oprresult => 'text',
3263  oprcode => 'jsonb_object_field_text' },
3264{ oid => '3212', descr => 'get jsonb array element',
3265  oprname => '->', oprleft => 'jsonb', oprright => 'int4', oprresult => 'jsonb',
3266  oprcode => 'jsonb_array_element' },
3267{ oid => '3481', descr => 'get jsonb array element as text',
3268  oprname => '->>', oprleft => 'jsonb', oprright => 'int4', oprresult => 'text',
3269  oprcode => 'jsonb_array_element_text' },
3270{ oid => '3213', descr => 'get value from jsonb with path elements',
3271  oprname => '#>', oprleft => 'jsonb', oprright => '_text',
3272  oprresult => 'jsonb', oprcode => 'jsonb_extract_path' },
3273{ oid => '3206', descr => 'get value from jsonb as text with path elements',
3274  oprname => '#>>', oprleft => 'jsonb', oprright => '_text',
3275  oprresult => 'text', oprcode => 'jsonb_extract_path_text' },
3276{ oid => '3240', descr => 'equal',
3277  oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'jsonb',
3278  oprright => 'jsonb', oprresult => 'bool', oprcom => '=(jsonb,jsonb)',
3279  oprnegate => '<>(jsonb,jsonb)', oprcode => 'jsonb_eq', oprrest => 'eqsel',
3280  oprjoin => 'eqjoinsel' },
3281{ oid => '3241', descr => 'not equal',
3282  oprname => '<>', oprleft => 'jsonb', oprright => 'jsonb', oprresult => 'bool',
3283  oprcom => '<>(jsonb,jsonb)', oprnegate => '=(jsonb,jsonb)',
3284  oprcode => 'jsonb_ne', oprrest => 'neqsel', oprjoin => 'neqjoinsel' },
3285{ oid => '3242', descr => 'less than',
3286  oprname => '<', oprleft => 'jsonb', oprright => 'jsonb', oprresult => 'bool',
3287  oprcom => '>(jsonb,jsonb)', oprnegate => '>=(jsonb,jsonb)',
3288  oprcode => 'jsonb_lt', oprrest => 'scalarltsel',
3289  oprjoin => 'scalarltjoinsel' },
3290{ oid => '3243', descr => 'greater than',
3291  oprname => '>', oprleft => 'jsonb', oprright => 'jsonb', oprresult => 'bool',
3292  oprcom => '<(jsonb,jsonb)', oprnegate => '<=(jsonb,jsonb)',
3293  oprcode => 'jsonb_gt', oprrest => 'scalargtsel',
3294  oprjoin => 'scalargtjoinsel' },
3295{ oid => '3244', descr => 'less than or equal',
3296  oprname => '<=', oprleft => 'jsonb', oprright => 'jsonb', oprresult => 'bool',
3297  oprcom => '>=(jsonb,jsonb)', oprnegate => '>(jsonb,jsonb)',
3298  oprcode => 'jsonb_le', oprrest => 'scalarlesel',
3299  oprjoin => 'scalarlejoinsel' },
3300{ oid => '3245', descr => 'greater than or equal',
3301  oprname => '>=', oprleft => 'jsonb', oprright => 'jsonb', oprresult => 'bool',
3302  oprcom => '<=(jsonb,jsonb)', oprnegate => '<(jsonb,jsonb)',
3303  oprcode => 'jsonb_ge', oprrest => 'scalargesel',
3304  oprjoin => 'scalargejoinsel' },
3305{ oid => '3246', descr => 'contains',
3306  oprname => '@>', oprleft => 'jsonb', oprright => 'jsonb', oprresult => 'bool',
3307  oprcom => '<@(jsonb,jsonb)', oprcode => 'jsonb_contains',
3308  oprrest => 'contsel', oprjoin => 'contjoinsel' },
3309{ oid => '3247', descr => 'key exists',
3310  oprname => '?', oprleft => 'jsonb', oprright => 'text', oprresult => 'bool',
3311  oprcode => 'jsonb_exists', oprrest => 'contsel', oprjoin => 'contjoinsel' },
3312{ oid => '3248', descr => 'any key exists',
3313  oprname => '?|', oprleft => 'jsonb', oprright => '_text', oprresult => 'bool',
3314  oprcode => 'jsonb_exists_any', oprrest => 'contsel',
3315  oprjoin => 'contjoinsel' },
3316{ oid => '3249', descr => 'all keys exist',
3317  oprname => '?&', oprleft => 'jsonb', oprright => '_text', oprresult => 'bool',
3318  oprcode => 'jsonb_exists_all', oprrest => 'contsel',
3319  oprjoin => 'contjoinsel' },
3320{ oid => '3250', descr => 'is contained by',
3321  oprname => '<@', oprleft => 'jsonb', oprright => 'jsonb', oprresult => 'bool',
3322  oprcom => '@>(jsonb,jsonb)', oprcode => 'jsonb_contained',
3323  oprrest => 'contsel', oprjoin => 'contjoinsel' },
3324{ oid => '3284', descr => 'concatenate',
3325  oprname => '||', oprleft => 'jsonb', oprright => 'jsonb',
3326  oprresult => 'jsonb', oprcode => 'jsonb_concat' },
3327{ oid => '3285', descr => 'delete object field',
3328  oprname => '-', oprleft => 'jsonb', oprright => 'text', oprresult => 'jsonb',
3329  oprcode => 'jsonb_delete(jsonb,text)' },
3330{ oid => '3398', descr => 'delete object fields',
3331  oprname => '-', oprleft => 'jsonb', oprright => '_text', oprresult => 'jsonb',
3332  oprcode => 'jsonb_delete(jsonb,_text)' },
3333{ oid => '3286', descr => 'delete array element',
3334  oprname => '-', oprleft => 'jsonb', oprright => 'int4', oprresult => 'jsonb',
3335  oprcode => 'jsonb_delete(jsonb,int4)' },
3336{ oid => '3287', descr => 'delete path',
3337  oprname => '#-', oprleft => 'jsonb', oprright => '_text',
3338  oprresult => 'jsonb', oprcode => 'jsonb_delete_path' },
3339
3340]
3341