/* $Id: t_reindexfn.sql,v 1.1 2015/05/17 08:42:31 andreas Exp $ */
\set  ON_ERROR_ROLLBACK ON
\pset pager OFF

\set nrows 100
BEGIN;
  CREATE FUNCTION reindex_function_index() RETURNS event_trigger AS $$
  DECLARE
    obj RECORD;
    idx_name TEXT;
  BEGIN
    FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands() 
                WHERE object_type = 'function' LOOP
-- TODO looking for a generic way to determine what indexes depends on what functions
      IF obj.object_identity = 'test.modix(integer)' THEN
      BEGIN
        idx_name := 'rxftest_modix_idx';
        EXECUTE 'REINDEX INDEX ' || idx_name;
        RAISE NOTICE '% on % rebuild index %', obj.command_tag, obj.object_identity, idx_name;
      EXCEPTION
        WHEN SQLSTATE '42P01' THEN
          RAISE DEBUG 'INDEX % not exists in reindex_function_index().', idx_name;
      END;
      END IF;
    END LOOP;
  END$$ LANGUAGE plPgSQL;

  SET LOCAL ROLE super;
-- /* Begin comment
    CREATE EVENT TRIGGER reindex_function_index ON ddl_command_end
           EXECUTE PROCEDURE reindex_function_index();
-- */ end comment
  RESET ROLE;

  CREATE TABLE rxftest AS
         SELECT nr FROM Generate_Series(1, :nrows) nr;
  -- TABLE rxftest;

  CREATE OR REPLACE FUNCTION modix(INTEGER) RETURNS INTEGER AS
  $$ VALUES($1 % 7)$$ LANGUAGE SQL IMMUTABLE STRICT;

  CREATE INDEX ON rxftest(modix(nr));
  ANALYZE rxftest;

  \d+ rxftest
  \di+ rxftest_modix_idx
  \d+ rxftest_modix_idx

  EXPLAIN SELECT * FROM rxftest WHERE modix(nr) = 0;
  SELECT nr, modix(nr) FROM rxftest WHERE modix(nr) = 0;

  CREATE OR REPLACE FUNCTION modix(INTEGER) RETURNS INTEGER AS
  $$ VALUES($1 % 7 - 3)$$ LANGUAGE SQL IMMUTABLE STRICT;

  EXPLAIN SELECT * FROM rxftest WHERE modix(nr) = 0;
  SELECT nr, modix(nr) FROM rxftest WHERE modix(nr) = 0;

  --SELECT * FROM pg_index;
  --SELECT * FROM pg_indexes;

  DROP FUNCTION modix(INTEGER) CASCADE;
ROLLBACK;
\pset pager ON
\set  ON_ERROR_ROLLBACK interactive
