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