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