For a while I've been wondering about making a type that was really a shell around a base type that tagged the type in some way. For example, associating a currency with a numeric and complaining about additions between mismatches. Well, I did it and it's available here: http://svana.org/kleptog/pgsql/taggedtypes.html Below some examples of it in action. Yes, that's a timestamp that remembers the timezone. Neat huh? Tested on 7.4 and a recent 8.1devel so it should work for most people. Installation reports welcome. Note, this is beta software, don't run it on your production server. Thanks. Have a nice day, test=# select '5.6 USD'::currency + '4.5 USD'::currency;; ?column? ----------- 10.10 USD (1 row) test=# select '5.6 USD'::currency + '4.5 AUD'::currency;; ERROR: Using operator +(currency,currency) with incompatable tags (USD,AUD) test=# select c1, print_currency(c1) from c; c1 | print_currency ------------+---------------- 232.44 USD | US$ 232.44 21.20 EUR | ¤ 21.20 -13.44 AUD | AU$ -13.44 0.01 USD | US$ 0.01 14.00 AUD | AU$ 14.00 (5 rows) test=# select 5.4*c1 from c where tag(c1) = 'AUD'; ?column? ------------ -72.58 AUD 75.60 AUD (2 rows) test=# select t, "timestamp"(t), date_part('hour',t) from c; t | timestamp | date_part -----------------------------------------+---------------------+----------- 2005-08-14 02:00:00+02 Europe/Amsterdam | 2005-08-14 02:00:00 | 2 2005-08-14 02:00:00+02 Australia/Sydney | 2005-08-14 10:00:00 | 10 2005-08-14 02:00:00+02 Asia/Hong_Kong | 2005-08-14 08:00:00 | 8 2005-08-14 02:00:00+02 America/New_York | 2005-08-13 20:00:00 | 20 2005-08-14 02:00:00+02 Asia/Kuwait | 2005-08-14 03:00:00 | 3 (5 rows) -- Martijn van Oosterhout <kleptog@xxxxxxxxx> http://svana.org/kleptog/ > Patent. n. Genius is 5% inspiration and 95% perspiration. A patent is a > tool for doing 5% of the work and then sitting around waiting for someone > else to do the other 95% so you can sue them.
Attachment:
pgpRIuoNUajm2.pgp
Description: PGP signature