On Jun 23, 2009, at 3:02 PM, Dimitri Fontaine wrote:

If we happen to accept the debian policy versioning scheme, then the hard work is already done for us, it seems:
 http://packages.debian.org/fr/sid/postgresql-8.3-debversion

As long as we don't need to implement a new data type, fine.

Replace what? How would pg_extension or INSTALL EXTENSION know to magically schema-qualify the function calls internal to an extension?

It's "just" PostgreSQL reading an SQL file (foo.install.sql) and parsing each statement etc, so we obviously have the machinery to recognize SQL objects names and schema qualification. Replacing the schema on-the-fly should be a SMOP? (*cough*)

Well, no. I might have written a function in PL/Perl. Is PostgreSQL going to parse my Perl function for unqualified function calls? Really? Hell, I don't think that PL/pgSQL is parsed until functions are loaded, either, though I may be wrong about that.

Better is to have some magic so that functions in an extension magically have their schema put onto the front of search_path when they're called. Or when they're compiled. Or something.

Oh, you want EAV already? Or maybe a supplementary hstore column into the pg_extension catalog... but I guess we can't have this dependancy :)

No, but a simple key/value table with an FK constraint should be sufficient for non-core metadata.

The upgrade function stuff is what I understand least about this proposal. Can you provide a real-world type example of how it will be used?

You provide a function upgrade(old, new) where parameters are version numbers. The body of the (typically plpgsql) function should implement the ALTER TABLE or CREATE OR REPLACE FUNCTION stuff you need to do, with some conditions on the version numbers.

Well, CREATE OR REPLACE FUNCTION is probably already in my install.sql file. But I could see dropping deprecated functions and, of course, altering tables.

I expect people would write a upgrade_10_to_11() function then call it from upgrade() when old = 1.0 and new = 1.1, for example.

Okay, that makes sense.

Maybe we should also provide some support functions to run the install and uninstall script, and some more facilities, so that you could implement as follow:
BEGIN
  -- loop over columns storing data from our type
  FOR s, t, c IN SELECT nspname, relname, attname
                   FROM pg_find_columns('mytype'::regclass)
  LOOP
EXECUTE 'ALTER TABLE $1.$2 ALTER COLUMN $3 TYPE text USING mycast($3)'
      USING s, t, c;
  END LOOP;

  PERFORM pg_extension_uninstall('foo', old);
  PERFORM pg_extension_install('foo', new);

  -- ALTER TYPE the other way round
END;

Some other stuff could be needed to check about indexes to, storing a list of them in a temp table then recreating them, but it seems to me you can already hand craft the catalog queries now. But as it becomes common practise, we might want to offer them in a more ready for public consumption way.

Yes, whatever tools we can provide to make things easier for extension authors/maintainers, the better. But I recognize that we might have to wait and see what cow paths develop.

Best,

David


--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to