array_iterator.doc
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:2k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. Array iterator functions, by Massimo Dal Zotto <dz@cs.unitn.it>
  2. This loadable module defines a new class of functions which take
  3. an array and a scalar value, iterate a scalar operator over the
  4. elements of the array and the value, and compute a result as
  5. the logical OR or AND of the iteration results.
  6. For example array_int4eq returns true if some of the elements
  7. of an array of int4 is equal to the given value:
  8. array_int4eq({1,2,3}, 1)  -->  true
  9. array_int4eq({1,2,3}, 4)  -->  false
  10. If we have defined T array types and O scalar operators we can
  11. define T x O x 2 array functions, each of them has a name like
  12. "array_[all_]<basetype><operation>" and takes an array of type T
  13. iterating the operator O over all the elements. Note however
  14. that some of the possible combination are invalid, for example
  15. the array_int4_like because there is no like operator for int4.
  16. We can then define new operators based on these functions and use
  17. them to write queries with qualification clauses based on the
  18. values of some of the elements of an array.
  19. For example to select rows having some or all element of an array
  20. attribute equal to a given value or matching a regular expression:
  21. create table t(id int4[], txt text[]);
  22. -- select tuples with some id element equal to 123
  23. select * from t where t.id *= 123;
  24. -- select tuples with some txt element matching '[a-z]'
  25. select * from t where t.txt *~ '[a-z]';
  26. -- select tuples with all txt elements matching '^[A-Z]'
  27. select * from t where t.txt[1:3] **~ '^[A-Z]';
  28. The scheme is quite general, each operator which operates on a base type
  29. can be iterated over the elements of an array. It seem to work well but
  30. defining each new operators requires writing a different C function.
  31. Furthermore in each function there are two hardcoded OIDs which reference
  32. a base type and a procedure. Not very portable. Can anyone suggest a
  33. better and more portable way to do it ?
  34. See also array_iterator.sql for an example on how to use this module.