@@ -320,6 +320,181 @@ SELECT nspname, opcname, amname, rolname
320320 alt_nsp2 | alt_opc2 | hash | regtest_alter_user3
321321(4 rows)
322322
323+ -- ALTER OPERATOR FAMILY ... ADD/DROP
324+ -- Should work. Textbook case of CREATE / ALTER ADD / ALTER DROP / DROP
325+ BEGIN TRANSACTION;
326+ CREATE OPERATOR FAMILY alt_opf4 USING btree;
327+ ALTER OPERATOR FAMILY alt_opf4 USING btree ADD
328+ -- int4 vs int2
329+ OPERATOR 1 < (int4, int2) ,
330+ OPERATOR 2 <= (int4, int2) ,
331+ OPERATOR 3 = (int4, int2) ,
332+ OPERATOR 4 >= (int4, int2) ,
333+ OPERATOR 5 > (int4, int2) ,
334+ FUNCTION 1 btint42cmp(int4, int2);
335+ ALTER OPERATOR FAMILY alt_opf4 USING btree DROP
336+ -- int4 vs int2
337+ OPERATOR 1 (int4, int2) ,
338+ OPERATOR 2 (int4, int2) ,
339+ OPERATOR 3 (int4, int2) ,
340+ OPERATOR 4 (int4, int2) ,
341+ OPERATOR 5 (int4, int2) ,
342+ FUNCTION 1 (int4, int2) ;
343+ DROP OPERATOR FAMILY alt_opf4 USING btree;
344+ ROLLBACK;
345+ -- Should fail. Invalid values for ALTER OPERATOR FAMILY .. ADD / DROP
346+ CREATE OPERATOR FAMILY alt_opf4 USING btree;
347+ ALTER OPERATOR FAMILY alt_opf4 USING invalid_index_method ADD OPERATOR 1 < (int4, int2); -- invalid indexing_method
348+ ERROR: access method "invalid_index_method" does not exist
349+ ALTER OPERATOR FAMILY alt_opf4 USING btree ADD OPERATOR 6 < (int4, int2); -- operator number should be between 1 and 5
350+ ERROR: invalid operator number 6, must be between 1 and 5
351+ ALTER OPERATOR FAMILY alt_opf4 USING btree ADD OPERATOR 0 < (int4, int2); -- operator number should be between 1 and 5
352+ ERROR: invalid operator number 0, must be between 1 and 5
353+ ALTER OPERATOR FAMILY alt_opf4 USING btree ADD OPERATOR 1 < ; -- operator without argument types
354+ ERROR: operator argument types must be specified in ALTER OPERATOR FAMILY
355+ ALTER OPERATOR FAMILY alt_opf4 USING btree ADD FUNCTION 0 btint42cmp(int4, int2); -- function number should be between 1 and 5
356+ ERROR: invalid procedure number 0, must be between 1 and 2
357+ ALTER OPERATOR FAMILY alt_opf4 USING btree ADD FUNCTION 6 btint42cmp(int4, int2); -- function number should be between 1 and 5
358+ ERROR: invalid procedure number 6, must be between 1 and 2
359+ ALTER OPERATOR FAMILY alt_opf4 USING btree ADD STORAGE invalid_storage; -- Ensure STORAGE is not a part of ALTER OPERATOR FAMILY
360+ ERROR: STORAGE cannot be specified in ALTER OPERATOR FAMILY
361+ DROP OPERATOR FAMILY alt_opf4 USING btree;
362+ -- Should fail. Need to be SUPERUSER to do ALTER OPERATOR FAMILY .. ADD / DROP
363+ BEGIN TRANSACTION;
364+ CREATE ROLE regtest_alter_user5 NOSUPERUSER;
365+ CREATE OPERATOR FAMILY alt_opf5 USING btree;
366+ SET ROLE regtest_alter_user5;
367+ ALTER OPERATOR FAMILY alt_opf5 USING btree ADD OPERATOR 1 < (int4, int2), FUNCTION 1 btint42cmp(int4, int2);
368+ ERROR: must be superuser to alter an operator family
369+ RESET ROLE;
370+ ERROR: current transaction is aborted, commands ignored until end of transaction block
371+ DROP OPERATOR FAMILY alt_opf5 USING btree;
372+ ERROR: current transaction is aborted, commands ignored until end of transaction block
373+ ROLLBACK;
374+ -- Should fail. Need rights to namespace for ALTER OPERATOR FAMILY .. ADD / DROP
375+ BEGIN TRANSACTION;
376+ CREATE ROLE regtest_alter_user6;
377+ CREATE SCHEMA alt_nsp6;
378+ REVOKE ALL ON SCHEMA alt_nsp6 FROM regtest_alter_user6;
379+ CREATE OPERATOR FAMILY alt_nsp6.alt_opf6 USING btree;
380+ SET ROLE regtest_alter_user6;
381+ ALTER OPERATOR FAMILY alt_nsp6.alt_opf6 USING btree ADD OPERATOR 1 < (int4, int2);
382+ ERROR: permission denied for schema alt_nsp6
383+ ROLLBACK;
384+ -- Should fail. Only two arguments required for ALTER OPERATOR FAMILY ... DROP OPERATOR
385+ CREATE OPERATOR FAMILY alt_opf7 USING btree;
386+ ALTER OPERATOR FAMILY alt_opf7 USING btree ADD OPERATOR 1 < (int4, int2);
387+ ALTER OPERATOR FAMILY alt_opf7 USING btree DROP OPERATOR 1 (int4, int2, int8);
388+ ERROR: one or two argument types must be specified
389+ DROP OPERATOR FAMILY alt_opf7 USING btree;
390+ -- Should work. During ALTER OPERATOR FAMILY ... DROP OPERATOR
391+ -- when left type is the same as right type, a DROP with only one argument type should work
392+ CREATE OPERATOR FAMILY alt_opf8 USING btree;
393+ ALTER OPERATOR FAMILY alt_opf8 USING btree ADD OPERATOR 1 < (int4, int4);
394+ DROP OPERATOR FAMILY alt_opf8 USING btree;
395+ -- Should work. Textbook case of ALTER OPERATOR FAMILY ... ADD OPERATOR with FOR ORDER BY
396+ CREATE OPERATOR FAMILY alt_opf9 USING gist;
397+ ALTER OPERATOR FAMILY alt_opf9 USING gist ADD OPERATOR 1 < (int4, int4) FOR ORDER BY float_ops;
398+ DROP OPERATOR FAMILY alt_opf9 USING gist;
399+ -- Should fail. Ensure correct ordering methods in ALTER OPERATOR FAMILY ... ADD OPERATOR .. FOR ORDER BY
400+ CREATE OPERATOR FAMILY alt_opf10 USING btree;
401+ ALTER OPERATOR FAMILY alt_opf10 USING btree ADD OPERATOR 1 < (int4, int4) FOR ORDER BY float_ops;
402+ ERROR: access method "btree" does not support ordering operators
403+ DROP OPERATOR FAMILY alt_opf10 USING btree;
404+ -- Should work. Textbook case of ALTER OPERATOR FAMILY ... ADD OPERATOR with FOR ORDER BY
405+ CREATE OPERATOR FAMILY alt_opf11 USING gist;
406+ ALTER OPERATOR FAMILY alt_opf11 USING gist ADD OPERATOR 1 < (int4, int4) FOR ORDER BY float_ops;
407+ ALTER OPERATOR FAMILY alt_opf11 USING gist DROP OPERATOR 1 (int4, int4);
408+ DROP OPERATOR FAMILY alt_opf11 USING gist;
409+ -- Should fail. btree comparison functions should return INTEGER in ALTER OPERATOR FAMILY ... ADD FUNCTION
410+ BEGIN TRANSACTION;
411+ CREATE OPERATOR FAMILY alt_opf12 USING btree;
412+ CREATE FUNCTION fn_opf12 (int4, int2) RETURNS BIGINT AS 'SELECT NULL::BIGINT;' LANGUAGE SQL;
413+ ALTER OPERATOR FAMILY alt_opf12 USING btree ADD FUNCTION 1 fn_opf12(int4, int2);
414+ ERROR: btree comparison procedures must return integer
415+ DROP OPERATOR FAMILY alt_opf12 USING btree;
416+ ERROR: current transaction is aborted, commands ignored until end of transaction block
417+ ROLLBACK;
418+ -- Should fail. hash comparison functions should return INTEGER in ALTER OPERATOR FAMILY ... ADD FUNCTION
419+ BEGIN TRANSACTION;
420+ CREATE OPERATOR FAMILY alt_opf13 USING hash;
421+ CREATE FUNCTION fn_opf13 (int4) RETURNS BIGINT AS 'SELECT NULL::BIGINT;' LANGUAGE SQL;
422+ ALTER OPERATOR FAMILY alt_opf13 USING hash ADD FUNCTION 1 fn_opf13(int4);
423+ ERROR: hash procedures must return integer
424+ DROP OPERATOR FAMILY alt_opf13 USING hash;
425+ ERROR: current transaction is aborted, commands ignored until end of transaction block
426+ ROLLBACK;
427+ -- Should fail. btree comparison functions should have two arguments in ALTER OPERATOR FAMILY ... ADD FUNCTION
428+ BEGIN TRANSACTION;
429+ CREATE OPERATOR FAMILY alt_opf14 USING btree;
430+ CREATE FUNCTION fn_opf14 (int4) RETURNS BIGINT AS 'SELECT NULL::BIGINT;' LANGUAGE SQL;
431+ ALTER OPERATOR FAMILY alt_opf14 USING btree ADD FUNCTION 1 fn_opf14(int4);
432+ ERROR: btree comparison procedures must have two arguments
433+ DROP OPERATOR FAMILY alt_opf14 USING btree;
434+ ERROR: current transaction is aborted, commands ignored until end of transaction block
435+ ROLLBACK;
436+ -- Should fail. hash comparison functions should have one argument in ALTER OPERATOR FAMILY ... ADD FUNCTION
437+ BEGIN TRANSACTION;
438+ CREATE OPERATOR FAMILY alt_opf15 USING hash;
439+ CREATE FUNCTION fn_opf15 (int4, int2) RETURNS BIGINT AS 'SELECT NULL::BIGINT;' LANGUAGE SQL;
440+ ALTER OPERATOR FAMILY alt_opf15 USING hash ADD FUNCTION 1 fn_opf15(int4, int2);
441+ ERROR: hash procedures must have one argument
442+ DROP OPERATOR FAMILY alt_opf15 USING hash;
443+ ERROR: current transaction is aborted, commands ignored until end of transaction block
444+ ROLLBACK;
445+ -- Should fail. In gist throw an error when giving different data types for function argument
446+ -- without defining left / right type in ALTER OPERATOR FAMILY ... ADD FUNCTION
447+ CREATE OPERATOR FAMILY alt_opf16 USING gist;
448+ ALTER OPERATOR FAMILY alt_opf16 USING gist ADD FUNCTION 1 btint42cmp(int4, int2);
449+ ERROR: associated data types must be specified for index support procedure
450+ DROP OPERATOR FAMILY alt_opf16 USING gist;
451+ -- Should fail. duplicate operator number / function number in ALTER OPERATOR FAMILY ... ADD FUNCTION
452+ CREATE OPERATOR FAMILY alt_opf17 USING btree;
453+ ALTER OPERATOR FAMILY alt_opf17 USING btree ADD OPERATOR 1 < (int4, int4), OPERATOR 1 < (int4, int4); -- operator # appears twice in same statment
454+ ERROR: operator number 1 for (integer,integer) appears more than once
455+ ALTER OPERATOR FAMILY alt_opf17 USING btree ADD OPERATOR 1 < (int4, int4); -- operator 1 requested first-time
456+ ALTER OPERATOR FAMILY alt_opf17 USING btree ADD OPERATOR 1 < (int4, int4); -- operator 1 requested again in separate statement
457+ ERROR: operator 1(integer,integer) already exists in operator family "alt_opf17"
458+ ALTER OPERATOR FAMILY alt_opf17 USING btree ADD
459+ OPERATOR 1 < (int4, int2) ,
460+ OPERATOR 2 <= (int4, int2) ,
461+ OPERATOR 3 = (int4, int2) ,
462+ OPERATOR 4 >= (int4, int2) ,
463+ OPERATOR 5 > (int4, int2) ,
464+ FUNCTION 1 btint42cmp(int4, int2) ,
465+ FUNCTION 1 btint42cmp(int4, int2); -- procedure 1 appears twice in same statement
466+ ERROR: procedure number 1 for (integer,smallint) appears more than once
467+ ALTER OPERATOR FAMILY alt_opf17 USING btree ADD
468+ OPERATOR 1 < (int4, int2) ,
469+ OPERATOR 2 <= (int4, int2) ,
470+ OPERATOR 3 = (int4, int2) ,
471+ OPERATOR 4 >= (int4, int2) ,
472+ OPERATOR 5 > (int4, int2) ,
473+ FUNCTION 1 btint42cmp(int4, int2); -- procedure 1 appears first time
474+ ALTER OPERATOR FAMILY alt_opf17 USING btree ADD
475+ OPERATOR 1 < (int4, int2) ,
476+ OPERATOR 2 <= (int4, int2) ,
477+ OPERATOR 3 = (int4, int2) ,
478+ OPERATOR 4 >= (int4, int2) ,
479+ OPERATOR 5 > (int4, int2) ,
480+ FUNCTION 1 btint42cmp(int4, int2); -- procedure 1 requested again in separate statement
481+ ERROR: operator 1(integer,smallint) already exists in operator family "alt_opf17"
482+ DROP OPERATOR FAMILY alt_opf17 USING btree;
483+ -- Should fail. Ensure that DROP requests for missing OPERATOR / FUNCTIONS
484+ -- return appropriate message in ALTER OPERATOR FAMILY ... DROP OPERATOR / FUNCTION
485+ CREATE OPERATOR FAMILY alt_opf18 USING btree;
486+ ALTER OPERATOR FAMILY alt_opf18 USING btree DROP OPERATOR 1 (int4, int4);
487+ ERROR: operator 1(integer,integer) does not exist in operator family "alt_opf18"
488+ ALTER OPERATOR FAMILY alt_opf18 USING btree ADD
489+ OPERATOR 1 < (int4, int2) ,
490+ OPERATOR 2 <= (int4, int2) ,
491+ OPERATOR 3 = (int4, int2) ,
492+ OPERATOR 4 >= (int4, int2) ,
493+ OPERATOR 5 > (int4, int2) ,
494+ FUNCTION 1 btint42cmp(int4, int2);
495+ ALTER OPERATOR FAMILY alt_opf18 USING btree DROP FUNCTION 2 (int4, int4);
496+ ERROR: function 2(integer,integer) does not exist in operator family "alt_opf18"
497+ DROP OPERATOR FAMILY alt_opf18 USING btree;
323498--
324499-- Text Search Dictionary
325500--