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

数据库系统

开发平台:

Unix_Linux

  1. y(char)h(*result;)318 3131 y(if)g((complex)g(==)h(NULL))f
  2. (return(NULL);)318 3190 y(result)g(=)h((char)f(*))h(palloc(60);)
  3. 318 3250 y(sprintf(result,)e("(45g,45g)",)h(complex->x,)f
  4. (complex->y);)318 3310 y(return(result);)258 3370
  5. y(})p eop
  6. %%Page: 38 38
  7. 38 37 bop 270 60 a Ft(38)310 b Fm(CHAPTER)14 b(2.)25
  8. b(POSTGRESQL)13 b(FR)n(OM)f(THE)i(USER'S)e(POINT)g(OF)g(VIEW)270
  9. 234 y Ft(Note)h(that)g(the)g(functions)g(de02ned)g(abo)o(v)o(e)h
  10. (operate)f(on)g(types)g(that)g(require)g Fp(pass)g(by)h(r)n(efer)n
  11. (ence)p Ft(.)20 b(The)270 294 y(functions)c(take)h(a)g(pointer)f(to)h
  12. (the)g(data)g(as)h(ar)o(gument)e(and)h(return)f(a)i(pointer)e(to)h(the)
  13. g(deri)o(v)o(ed)f(data)270 354 y(instead)h(of)g(passing)g(and)g
  14. (returning)e(the)i(data)g(itself.)29 b(That')m(s)18 b(why)e(we)h(ha)o
  15. (v)o(e)g(to)g(reserv)o(e)g(memory)270 413 y(using)f Fr(palloc)f
  16. Ft(within)g(the)h(functions.)26 b((If)14 b(we)i(would)f(just)h
  17. (de02ne)f(a)h(local)g(v)o(ariable)f(and)h(return)270
  18. 473 y(the)e(addresses)h(of)f(these)h(v)o(ariables)f(the)g(system)h
  19. (would)e(fail,)i(because)g(the)f(memory)f(used)i(by)f(local)270
  20. 533 y(v)o(ariables)e(is)h(freed)e(when)i(the)f(function)g(de02ning)f
  21. (these)i(v)o(ariables)f(completes.))345 593 y(The)e(ne)o(xt)g(step)g
  22. (is)g(to)g(compile)f(the)h(C-functions)f(and)h(create)f(the)h(shared)g
  23. (library)f Fr(complex.so)p Ft(.)270 653 y(This)h(is)g(done)f(in)g(the)h
  24. (way)f(described)g(in)h(the)f(pre)o(vious)g(section)g
  25. Fp(Pr)n(ogr)o(amming)h(Language)e(Functions)270 712 y
  26. Ft(and)j(depends)g(on)g(the)g(system)h(you)f(are)g(using.)k(On)c(a)g
  27. (Linux)g(ELF)h(system)g(using)f Fr(gcc)f Ft(it)h(would)f(look)270
  28. 772 y(like)i(this:)330 868 y Fr($)30 b(gcc)f(-I$PGROOT/include)f(-fpic)
  29. h(-c)60 b(complex.c)29 b(-o)h(complex.o)330 928 y($)g(gcc)f(-shared)g
  30. (-o)h(complex.so)f(complex.o)270 1023 y Ft(No)o(w)11
  31. b(we)h(are)f(ready)g(to)g(de02ne)h(the)f(ne)o(w)g(datatype)g(b)o(ut)g
  32. (before)g(that)g(we)h(ha)o(v)o(e)g(to)f(make)g(the)g
  33. Fp(input)g Ft(and)270 1083 y Fp(output)h(function)g Ft(kno)o(wn)f(to)i
  34. (PostgreSQL:)330 1179 y Fr(testdb=>)29 b(create)g(function)g
  35. (complex_in(opaque))330 1238 y(testdb->)g(returns)g(complex)330
  36. 1298 y(testdb->)g(as)g('/<where_ever_you_put_it>/complex.so)o(')330
  37. 1358 y(testdb->)g(language)g('c';)330 1418 y(NOTICE:)59
  38. b(ProcedureCreate:)28 b(type)h('complex')g(is)h(not)599
  39. 1477 y(yet)f(defined)330 1537 y(CREATE)330 1597 y(testdb=>)g(create)g
  40. (function)g(complex_out(opaque))330 1657 y(testdb->)g(returns)g
  41. (opaque)330 1717 y(testdb->)g(as)g
  42. ('/<where_ever_you_put_it>/complex.so)o(')330 1776 y(testdb->)g
  43. (language)g('c';)330 1836 y(CREATE)330 1896 y(testdb=>)g(create)g(type)
  44. g(complex)h(()330 1956 y(testdb->)f(internallength)f(=)i(16,)330
  45. 2015 y(testdb->)f(input)g(=)h(complex_in,)330 2075 y(testdb->)f(output)
  46. g(=)h(complex_out)330 2135 y(testdb->)f();)330 2195
  47. y(CREATE)330 2255 y(testdb=>)270 2350 y Ft(Note)37 b(that)f(the)h(ar)o
  48. (gument)f(type)h(gi)o(v)o(en)f(in)h(the)f(de02nition)g(of)h
  49. Fr(complex)p 1798 2350 15 2 v 17 w(out())f Ft(and)270
  50. 2410 y Fr(complex)p 483 2410 V 17 w(in())28 b Ft(-)g
  51. Fr(opaque)f Ft(-)h(is)h(needed)f(by)g(PostgreSQL)g(to)g(be)g(able)g(to)
  52. g(pro)o(vide)g(an)270 2470 y(uniform)14 b(mechanism)i(for)f(the)h
  53. (de02nition)e(of)i(the)f Fp(input)h Ft(and)f Fp(output)g(functions)h
  54. Ft(needed)g(by)f(a)h(ne)o(w)270 2530 y(data)k(type.)40
  55. b(It)20 b(is)h(not)f(necessary)h(to)f(specify)h(the)f(e)o(xact)h(type)f
  56. (of)g(the)h(ar)o(guments)f(gi)o(v)o(en)g(to)g(the)270
  57. 2589 y(functions.)34 b(The)19 b Fp(input)f(function)g
  58. Ft(is)h(ne)o(v)o(er)f(called)g(e)o(xplicitly)g(and)h(when)g(it)f(is)h
  59. (called)f(implicitly)270 2649 y((e.g.)24 b(by)15 b(a)g(statement)h
  60. (like)e Fr(insert)29 b(into)p Ft())15 b(it)f(is)i(clear)f(that)g(a)g
  61. (character)g(string)f((i.e.)25 b(a)15 b(part)g(of)270
  62. 2709 y(the)h Fp(insert)h Ft(query))e(will)g(be)i(passed)g(to)f(it.)26
  63. b(The)17 b Fp(output)e(function)h Ft(is)g(only)g(called)g(()g(by)g(an)
  64. g(internal)270 2769 y(mechanism)h(of)g(PostgreSQL))g(when)g(data)g(of)
  65. g(the)g(corresponding)g(user)g(de02ned)g(type)g(has)h(to)f(be)270
  66. 2828 y(displayed.)32 b(In)18 b(this)g(case)h(it)e(is)h(also)h(clear)e
  67. (that)h(the)g(input)f(is)i(of)e(the)h(type)g(used)g(for)f(the)h
  68. (internal)270 2888 y(representation)12 b((e.g.)k Fr(complex)p
  69. Ft().)e(The)f(output)f(is)h(of)f(type)g(character)g(string.)270
  70. 3008 y(The)h(ne)o(w)f(type)g(can)h(no)o(w)f(be)g(used)h(as)g(if)f(it)g
  71. (were)g(another)g(base)h(type:)330 3103 y Fr(testdb=>)29
  72. b(create)g(table)g(complex_test)330 3163 y(testdb->)g((val)g
  73. (complex);)330 3223 y(CREATE)330 3283 y(testdb=>)g(insert)g(into)g
  74. (complex_test)330 3342 y(testdb->)g((val))g(values)g(('(1,2)');)
  75. 330 3402 y(INSERT)59 b(155872)29 b(1)p eop
  76. %%Page: 39 39
  77. 39 38 bop 198 60 a Fm(2.5.)29 b(SOME)12 b(OF)h(POSTGRESQL)-5
  78. b('S)12 b(SPECIAL)h(FEA)-6 b(TURES)14 b(IN)e(DET)-5 b(AIL)340
  79. b Ft(39)258 234 y Fr(testdb=>)29 b(insert)g(into)g(complex_test)258
  80. 294 y(testdb->)g((val))g(values)g(('(3,4)');)258
  81. 354 y(INSERT)59 b(155873)29 b(1)258 413 y(testdb=>)g(insert)g(into)g
  82. (complex_test)258 473 y(testdb->)g((val))g(values)g(('(5,6)');)
  83. 258 533 y(INSERT)59 b(155874)29 b(1)258 653 y(testdb=>)g(select)g(*)h
  84. (from)f(complex_test;)318 712 y(val)258 772 y(-----)258
  85. 832 y((1,2))258 892 y((3,4))258 951 y((5,6))258
  86. 1011 y((3)g(rows))258 1131 y(testdb=>)198 1272 y Fh(2.5.4)59
  87. b(Extending)15 b(Operators)198 1365 y Ft(So)i(far)g(we)g(are)h(able)f
  88. (to)h(de02ne)f(a)h(ne)o(w)f(type,)i(create)f(tables)f(that)h(use)g
  89. (the)f(ne)o(w)g(type)h(for)e(one)i((or)198 1425 y(more))13
  90. b(attrib)o(ute(s))g(and)g(populate)h(the)g(ne)o(w)g(tables)g(with)f
  91. (data.)21 b(W)l(e)14 b(are)g(also)g(able)g(to)g(retrie)o(v)o(e)f(data)
  92. 198 1485 y(from)d(those)h(tables)h(as)g(long)e(as)i(we)f(do)g(not)g
  93. (use)h(the)f(ne)o(w)g(data)g(types)h(within)e(the)h(quali02cation)f
  94. (of)h(the)198 1544 y(query)m(.)23 b(If)14 b(we)h(want)f(to)h(use)g(the)
  95. g(ne)o(w)g(data)g(types)g(in)g(the)g Fr(where)f Ft(clause)i(we)f(ha)o
  96. (v)o(e)g(to)g(adapt)g(some)198 1604 y((or)d(all))f(of)h(the)h
  97. (operators.)198 1718 y Fn(Example)g(2.9)25 b Ft(W)l(e)10
  98. b(sho)o(w)h(ho)o(w)f(the)g(operator)g('=')g(can)g(be)h(adapted)f(for)g
  99. (the)g(usage)h(on)f(the)h Fr(complex)198 1778 y Ft(data)17
  100. b(type)g(de02ned)g(in)f(section)i(2.5.3)f Fp(User)h(De02ned)f(T)l
  101. (ypes)p Ft(.)31 b(W)l(e)17 b(need)g(a)g(user)g(de02ned)g(function)198
  102. 1838 y Fr(complex)p 411 1838 15 2 v 17 w(cmp(complex,complex))10
  103. b Ft(that)j(returns)f Fr(true)g Ft(if)g(the)g(comple)o(x)g(numbers)g
  104. (gi)o(v)o(en)198 1898 y(as)g(ar)o(guments)g(are)g(equal)f(and)h
  105. Fr(false)g Ft(otherwise.)j(This)d(function)f(is)h(de02ned)g(as)g
  106. (described)g(in)g(sec-)198 1957 y(tion)h(2.5.2)i Fp(User)f(De02ned)g
  107. (Functions)p Ft(.)20 b(In)13 b(our)g(case)h(there)g(are)f(already)g
  108. (two)g(functions)g(present)h(for)198 2017 y(the)f(usage)h(of)f(type)h
  109. Fr(complex)e Ft(-the)h Fp(input)g Ft(and)h Fp(output)f(function)f
  110. Ft(de02ned)i(in)f(e)o(xample)g(2.8.)20 b(So)13 b(we)198
  111. 2077 y(can)k(add)f(the)h(ne)o(w)f(function)f Fr(complex)p
  112. 943 2077 V 18 w(cmp(complex,complex))f Ft(by)i(simply)g(appending)198
  113. 2137 y(the)c(follo)o(wing)f(lines)i(to)f(the)g(02le)g
  114. Fr(complex.c)g Ft(gi)o(v)o(en)g(in)g(e)o(xample)h(2.8:)258
  115. 2229 y Fr(/*)29 b(Comparison)g(Function)g(*/)258 2289
  116. y(/*)g(returns)h(true)f(if)h(arg1)f(and)h(arg2)f(are)h(equal)f(*/)258
  117. 2348 y(bool)g(complex_cmp(Complex)f(*arg1,)h(Complex)g(*arg2))258
  118. 2408 y({)318 2468 y(if((arg1->x)f(==)i(arg2->x))f(&&)407
  119. 2528 y((arg1->y)g(==)h(arg2->y)))318 2588 y({)377
  120. 2647 y(return)g(true;)318 2707 y(})318 2767 y(else)318
  121. 2827 y({)377 2886 y(return)g(false;)318 2946 y(})258
  122. 3006 y(})198 3098 y Ft(No)o(w)12 b(we)h(create)f(the)g(shared)h
  123. (library)e(again:)258 3190 y Fr($)30 b(gcc)f(-I$PGROOT/include)f(-fpic)
  124. h(-c)60 b(complex.c)29 b(-o)h(complex.o)258 3250 y($)g(gcc)f(-shared)g
  125. (-o)h(complex.so)f(complex.o)198 3342 y Ft(Note)10 b(that)f(all)h(the)f
  126. (functions)h(de02ned)f(in)h Fr(complex.c)e Ft(()p
  127. Fr(complex)p 1428 3342 V 17 w(in(),)29 b(complex)p
  128. 1834 3342 V 18 w(out())198 3402 y Ft(and)12 b Fr(complex)p
  129. 495 3402 V 18 w(cmp())p Ft())f(are)h(no)o(w)g(contained)g(in)h(the)f
  130. (shared)g(library)g Fr(complex.so)p Ft(.)p eop
  131. %%Page: 40 40
  132. 40 39 bop 270 60 a Ft(40)307 b Fm(CHAPTER)14 b(2.)28
  133. b(POSTGRESQL)13 b(FR)n(OM)f(THE)i(USER'S)e(POINT)g(OF)g(VIEW)270
  134. 234 y Ft(No)o(w)k(we)h(make)g(the)f(ne)o(w)h(function)f(kno)o(wn)g(to)h
  135. (PostgreSQL)f(and)h(after)f(that)h(we)g(de02ne)f(the)h(ne)o(w)270
  136. 294 y(operator)11 b('=')h(for)g(the)g Fr(complex)g Ft(type:)330
  137. 394 y Fr(testdb=>)29 b(create)g(function)g
  138. (complex_cmp(complex,complex))330 454 y(testdb->)g(returns)g(complex)
  139. 330 513 y(testdb->)g(as)g('/<where_ever_you_put_it>/complex.so)o(')330
  140. 573 y(testdb->)g(language)g('c';)330 633 y(CREATE)330
  141. 693 y(testdb=>)g(create)g(operator)g(=)h(()330 753 y(testdb->)f
  142. (leftarg)g(=)h(complex,)330 812 y(testdb->)f(rightarg)g(=)h(complex,)
  143. 330 872 y(testdb->)f(procedure)g(=)g(complex_cmp,)330
  144. 932 y(testdb->)g(commutator)g(=)g(=)330 992 y(testdb->)g();)330
  145. 1051 y(CREATE)330 1111 y(testdb=>)270 1211 y Ft(From)12
  146. b(no)o(w)h(on)h(we)f(are)h(able)f(to)g(perform)f(comparisons)i(between)
  147. f(comple)o(x)g(numbers)g(in)h(a)f(query')m(s)270 1271
  148. y(quali02cation)f((W)l(e)g(use)h(the)f(table)g Fr(complex)p
  149. 1100 1271 15 2 v 17 w(test)g Ft(as)h(de02ned)f(in)h(e)o(xample)f
  150. (2.8):)330 1371 y Fr(testdb=>)29 b(select)g(*)h(from)f(complex_test)
  151. 330 1431 y(testdb->)g(where)g(val)h(=)f('(1,2)';)390
  152. 1491 y(val)330 1550 y(-----)330 1610 y((1,2))330 1670
  153. y((1)g(row))330 1789 y(testdb=>)g(select)g(*)h(from)f(complex_test)
  154. 330 1849 y(testdb->)g(where)g(val)h(=)f('(7,8)';)390
  155. 1909 y(val)330 1969 y(-----)330 2029 y((0)g(rows))330
  156. 2148 y(testdb=>)270 2291 y Fh(2.5.5)59 b(Extending)15
  157. b(Aggr)o(egates)270 2385 y Ft(If)e(we)i(want)e(to)h(use)h(aggre)o(gate)
  158. f(functions)f(on)h(attrib)o(utes)g(of)g(a)g(user)g(de02ned)g(type,)h
  159. (we)g(ha)o(v)o(e)f(to)g(add)270 2445 y(aggre)o(gate)19
  160. b(functions)f(designed)h(to)g(work)f(on)h(the)g(ne)o(w)f(type.)36
  161. b(Aggre)o(gates)19 b(in)g(PostgreSQL)f(are)270 2504 y(realized)12
  162. b(using)h(three)f(functions:)345 2604 y Fo(17)25 b
  163. Fr(sfunc1)13 b Ft((state)i(function)e(one):)19 b(is)c(called)g(for)e
  164. (e)o(v)o(ery)i(tuple)f(of)g(the)g(current)g(group)g(and)g(the)395
  165. 2664 y(appropriate)d(attrib)o(ute')m(s)h(v)o(alue)h(of)f(the)h(current)
  166. f(tuple)g(is)h(passed)h(to)e(the)h(function.)j(The)d(gi)o(v)o(en)395
  167. 2724 y(ar)o(gument)f(is)h(used)h(to)e(change)i(the)f(internal)f(state)h
  168. (of)g(the)g(function)f(in)h(the)g(way)f(gi)o(v)o(en)h(by)g(the)395
  169. 2784 y(body)f(of)h(the)g(function.)k(F)o(or)c(e)o(xample)g
  170. Fr(sfunc1)g Ft(of)g(the)g(aggre)o(gate)f(function)h Fr(sum)g
  171. Ft(is)g(called)395 2843 y(for)f(e)o(v)o(ery)h(tuple)g(of)g(the)h
  172. (current)e(group.)19 b(The)14 b(v)o(alue)f(of)g(the)g(attrib)o(ute)g
  173. (the)g(sum)h(is)g(b)o(uilt)e(on)i(is)395 2903 y(taken)d(from)h(the)g
  174. (current)g(tuple)g(and)g(added)g(to)h(the)f(internal)g(sum)g(state)h
  175. (of)f Fr(sfunc1)p Ft(.)345 3003 y Fo(17)25 b Fr(sfunc2)12
  176. b Ft(is)h(also)g(called)g(for)g(e)o(v)o(ery)f(tuple)h(of)f(the)h(group)
  177. g(b)o(ut)f(it)h(does)g(not)g(use)h(an)o(y)f(ar)o(gument)395
  178. 3063 y(from)g(outside)h(to)g(manipulate)g(its)h(state.)22
  179. b(It)13 b(just)i(keeps)f(track)g(of)g(the)g(o)o(wn)g(internal)g(state.)
  180. 22 b(A)395 3123 y(typical)10 b(application)g(for)g Fr(sfunc2)h
  181. Ft(is)g(a)g(counter)f(that)h(is)g(incremented)f(for)g(e)o(v)o(ery)h
  182. (tuple)g(of)f(the)395 3183 y(group)h(that)h(has)h(been)g(processed.)345
  183. 3283 y Fo(17)25 b Fr(finalfunc)14 b Ft(is)i(called)f(after)g(all)g
  184. (tuples)g(of)g(the)g(current)g(group)f(ha)o(v)o(e)i(been)f(processed.)
  185. 26 b(It)395 3342 y(takes)10 b(the)f(internal)h(state)g(of)g
  186. Fr(sfunc1)f Ft(and)h(the)g(state)h(of)e Fr(sfunc2)h Ft(as)g(ar)o
  187. (guments)g(and)g(deri)o(v)o(es)395 3402 y(the)h(result)h(of)f(the)h
  188. (aggre)o(gate)g(function)f(from)f(the)i(two)f(gi)o(v)o(en)h(ar)o
  189. (guments.)j(F)o(or)d(e)o(xample)f(with)p eop
  190. %%Page: 41 41
  191. 41 40 bop 198 60 a Fm(2.5.)29 b(SOME)12 b(OF)h(POSTGRESQL)-5
  192. b('S)12 b(SPECIAL)h(FEA)-6 b(TURES)14 b(IN)e(DET)-5 b(AIL)340
  193. b Ft(41)323 234 y(the)9 b(aggre)o(gate)h(function)f Fr(average)p
  194. Ft(,)h Fr(sfunc1)f Ft(sums)h(up)g(the)f(attrib)o(ute)g(v)o(alues)h(of)f
  195. (each)h(tuple)323 294 y(in)j(the)g(group,)g Fr(sfunc2)f
  196. Ft(counts)i(the)f(tuples)g(in)g(the)g(group.)18 b Fr(finalfunc)12
  197. b Ft(di)o(vides)h(the)g Fp(sum)323 354 y Ft(by)f(the)g
  198. Fp(count)g Ft(to)g(deri)o(v)o(e)g(the)h(a)o(v)o(erage.)198
  199. 462 y(If)e(we)g(de02ne)g(an)g(aggre)o(gate)g(using)h(only)f
  200. Fr(sfunc1)f Ft(we)i(get)f(an)g(aggre)o(gate)g(that)g(computes)h(a)f
  201. (running)198 522 y(function)h(of)h(the)g(attrib)o(ute)f(v)o(alues)h
  202. (from)f(each)i(tuple.)j Fr(sum)c Ft(is)h(an)f(e)o(xample)g(for)f(this)h
  203. (kind)g(of)g(aggre-)198 582 y(gate.)18 b(On)13 b(the)g(other)g(hand,)h
  204. (if)e(we)h(create)h(an)f(aggre)o(gate)g(function)f(using)h(only)g
  205. Fr(sfunc2)g Ft(we)g(get)g(an)198 642 y(aggre)o(gate)i(that)g(is)g
  206. (independent)g(of)g(the)g(attrib)o(ute)f(v)o(alues)h(from)g(each)g
  207. (tuple.)24 b Fr(count)15 b Ft(is)g(a)g(typical)198 702
  208. y(e)o(xample)d(of)g(this)h(kind)f(of)g(aggre)o(gate.)198
  209. 840 y Fn(Example)h(2.10)25 b Ft(Here)h(we)g(want)g(to)g(realize)g(the)g
  210. (aggre)o(gate)g(functions)g Fr(complex)p 1796 840 15
  211. 2 v 17 w(sum)g Ft(and)198 899 y Fr(complex)p 411 899
  212. V 17 w(avg)12 b Ft(for)g(the)g(user)h(de02ned)f(type)g
  213. Fr(complex)g Ft((see)g(e)o(xample)h(2.8).)198 1019
  214. y(First)53 b(we)h(ha)o(v)o(e)g(to)f(create)g(the)h(user)f(de02ned)h
  215. (functions)f Fr(complex)p 1769 1019 V 17 w(add)g Ft(and)198
  216. 1079 y Fr(complex)p 411 1079 V 17 w(scalar)p 608 1079
  217. V 17 w(div)p Ft(.)34 b(W)l(e)19 b(can)g(append)f(these)h(two)f
  218. (functions)g(to)g(the)h(02le)f Fr(complex.c)198 1138
  219. y Ft(from)11 b(e)o(xample)i(2.8)f(again)h((as)f(we)h(did)f(with)g
  220. Fr(complex)p 1214 1138 V 17 w(cmp)p Ft():)258 1250 y
  221. Fr(/*)29 b(Add)h(Complex)f(numbers)g(*/)258 1310 y(Complex)g(*)258
  222. 1370 y(complex_add(Complex)f(*arg1,)h(Complex)g(*arg2))258
  223. 1430 y({)318 1489 y(Complex)g(*result;)318 1609 y(result)g(=)h
  224. ((Complex)f(*)palloc(sizeof(Complex));)318 1669
  225. y(result->x)f(=)i(arg1->x)f(+)h(arg2->x;)318 1729 y(result->y)e(=)i
  226. (arg1->y)f(+)h(arg2->y;)318 1788 y(return(result);)258
  227. 1848 y(})258 1968 y(/*)f(Final)h(function)f(for)g(complex)g(average)h
  228. (*/)258 2027 y(/*)f(Transform)g(arg1)h(to)f(polar)h(coordinate)f(form)
  229. 288 2087 y(*)g(R)h(*)g(e210(j*phi))f(and)g(divide)h(R)f(by)h(arg2.)
  230. 288 2147 y(*)f(Transform)g(the)h(new)f(result)h(back)f(to)h(cartesian)
  231. 288 2207 y(*)f(coordinates)g(*/)258 2267 y(Complex)g(*)258
  232. 2326 y(complex_scalar_div(Complex)e(*sum,)i(int)h(count))258
  233. 2386 y({)318 2446 y(Complex)f(*result;)318 2506 y(double)g(R,)g(phi;)
  234. 318 2625 y(result)g(=)h((Complex)f(*)palloc(sizeof(Complex));)318
  235. 2745 y(/*)g(transform)g(to)h(polar)f(coordinates)g(*/)318
  236. 2804 y(R)g(=)h(hypot(sum->x,sum->y);)318 2864 y(phi)f(=)h
  237. (atan(sum->y)f(/)g(sum->x);)318 2984 y(/*)g(divide)g(by)h(the)g
  238. (scalar)f(count)g(*/)318 3044 y(R)g(=)h(R)g(/)g(count;)318
  239. 3163 y(/*)f(transform)g(back)h(to)f(cartesian)g(coordinates)g(*/)318
  240. 3223 y(result->x)f(=)i(R)g(*)g(cos(phi);)318 3283 y(result->y)e(=)i
  241. (R)g(*)g(sin(phi);)318 3342 y(return(result);)258
  242. 3402 y(})p eop
  243. %%Page: 42 42
  244. 42 41 bop 270 60 a Ft(42)307 b Fm(CHAPTER)14 b(2.)28
  245. b(POSTGRESQL)13 b(FR)n(OM)f(THE)i(USER'S)e(POINT)g(OF)g(VIEW)270
  246. 234 y Ft(Ne)o(xt)23 b(we)h(create)f(the)h(shared)f(library)f
  247. Fr(complex.so)g Ft(again,)27 b(which)c(will)g(contain)g(all)g(func-)270
  248. 294 y(tions)16 b(de02ned)g(in)h(the)f(pre)o(vious)g(e)o(xamples)g(as)
  249. h(well)g(as)g(the)f(ne)o(w)g(functions)g Fr(complex)p
  250. 1878 294 15 2 v 17 w(add)g Ft(and)270 354 y Fr(complex)p
  251. 483 354 V 17 w(scalar)p 680 354 V 17 w(div)p Ft(:)330
  252. 538 y Fr($)30 b(gcc)f(-I$PGROOT/include)f(-fpic)h(-c)60
  253. b(complex.c)29 b(-o)h(complex.o)330 598 y($)g(gcc)f(-shared)g(-o)h
  254. (complex.so)f(complex.o)270 761 y Ft(No)o(w)13 b(we)g(ha)o(v)o(e)h(to)f
  255. (make)g(the)g(functions)g(needed)g(by)h(the)f(ne)o(w)g(aggre)o(gates)g
  256. (kno)o(wn)g(to)g(PostgreSQL.)270 821 y(After)f(that)g(we)h(de02ne)g
  257. (the)f(two)g(ne)o(w)h(aggre)o(gate)f(functions)g Fr(complex)p
  258. 1552 821 V 17 w(sum)h Ft(and)f Fr(complex)p 1966 821
  259. V 17 w(avg)270 881 y Ft(that)g(make)g(use)h(of)f(the)g(functions)g
  260. Fr(complex)p 1094 881 V 17 w(add)g Ft(and)h Fr(complex)p
  261. 1508 881 V 17 w(scalar)p 1705 881 V 17 w(div)p Ft(:)330
  262. 1066 y Fr(testdb=>)29 b(create)g(function)g
  263. (complex_add(complex,complex))330 1125 y(testdb->)g(returns)g
  264. (complex)330 1185 y(testdb->)g(as)g
  265. ('/<where_ever_you_put_it>/complex.so)o(')330 1245 y(testdb->)g
  266. (language)g('c';)330 1305 y(CREATE)330 1365 y(testdb=>)g(create)g
  267. (function)g(complex_scalar_div(complex,int))330 1424
  268. y(testdb->)g(returns)g(complex)330 1484 y(testdb->)g(as)g
  269. ('/<where_ever_you_put_it>/complex.so)o(')330 1544 y(testdb->)g
  270. (language)g('c';)330 1604 y(CREATE)330 1663 y(testdb=>)g(create)g
  271. (aggregate)g(complex_sum)g(()330 1723 y(testdb->)g(sfunc1)g(=)h
  272. (complex_add,)330 1783 y(testdb->)f(basetype)g(=)h(complex,)330
  273. 1843 y(testdb->)f(stype1)g(=)h(complex,)330 1903 y(testdb->)f
  274. (initcond1)g(=)g('(0,0)')330 1962 y(testdb->)g();)330
  275. 2022 y(CREATE)330 2082 y(testdb=>)g(create)g(aggregate)g(complex_avg)g
  276. (()330 2142 y(testdb->)g(sfunc1)g(=)h(complex_add,)330
  277. 2201 y(testdb->)f(basetype)g(=)h(complex,)330 2261 y(testdb->)f(stype1)
  278. g(=)h(complex,)330 2321 y(testdb->)f(sfunc2)g(=)h(int4inc,)330
  279. 2381 y(testdb->)f(stype2)g(=)h(int4,)330 2441 y(testdb->)f(finalfunc)g
  280. (=)g(complex_scalar_div,)330 2500 y(testdb->)g(initcond1)g(=)g
  281. ('(0,0)',)330 2560 y(testdb->)g(initcond2)g(=)g('0')330
  282. 2620 y(testdb->)g();)330 2680 y(CREATE)270 2843 y Ft(The)20
  283. b(aggre)o(gate)e(function)g Fr(complex)p 976 2843 V 17
  284. w(sum)h Ft(is)g(de02ned)g(using)g(only)g Fr(sfunc1)p
  285. Ft(.)35 b Fr(basetype)18 b Ft(is)270 2903 y(the)e(type)g(of)g(the)h
  286. (result)f(of)g(the)g(aggre)o(gate)g(function.)27 b(The)17
  287. b(function)e Fr(complex)p 1751 2903 V 17 w(add)h Ft(is)h(used)g(as)270
  288. 2963 y Fr(sfunc1)d Ft(and)h Fr(stype1)e Ft(de02nes)i(the)g(type)f
  289. Fr(sfunc1)g Ft(will)g(operate)g(on.)23 b Fr(initcond1)13
  290. b Ft(gi)o(v)o(es)i(the)270 3022 y(initial)d(v)o(alue)g(of)g(the)g
  291. (internal)g(state)g(of)g Fr(sfunc1)p Ft(.)270 3103 y(If)20
  292. b(we)h(look)f(at)g(the)h(de02nition)e(of)i(the)f(aggre)o(gate)g
  293. (function)g Fr(complex)p 1618 3103 V 17 w(avg)h Ft(we)f(can)h(see)g
  294. (that)270 3163 y(the)k(part)f(concerning)h Fr(sfunc1)f
  295. Ft(is)i(identical)e(to)h(the)g(corresponding)f(part)h(of)f(the)h
  296. (de02nition)270 3223 y(of)e Fr(complex)p 548 3223 V
  297. 17 w(sum)p Ft(.)49 b(The)25 b(only)e(dif)o(ference)f(is)i(the)f
  298. (additional)g(de02nition)g(of)g Fr(sfunc2)g Ft(and)270
  299. 3283 y Fr(finalfunc)p Ft(.)34 b(The)19 b(b)o(uilt)f(in)g(function)g
  300. Fr(int4inc)g Ft(is)h(used)g(as)g Fr(sfunc2)f Ft(and)h(increments)f(the)
  301. 270 3342 y(internal)c(state)i(of)e Fr(sfunc2)g Ft(for)h(e)o(v)o(ery)f
  302. (tuple)h(processed.)24 b(After)14 b(all)h(tuples)g(ha)o(v)o(e)g(been)h
  303. (processed)270 3402 y Fr(complex)p 483 3402 V 17 w(scalar)p
  304. 680 3402 V 17 w(div)d Ft(is)f(used)h(as)g Fr(finalfunc)e
  305. Ft(to)i(create)f(the)g(a)o(v)o(erage.)p eop
  306. %%Page: 43 43
  307. 43 42 bop 198 60 a Fm(2.5.)29 b(SOME)12 b(OF)h(POSTGRESQL)-5
  308. b('S)12 b(SPECIAL)h(FEA)-6 b(TURES)14 b(IN)e(DET)-5 b(AIL)340
  309. b Ft(43)198 234 y(From)11 b(no)o(w)h(on)h(we)f(can)h(use)g(the)f(ne)o
  310. (w)g(aggre)o(gate)g(functions:)258 334 y Fr(testdb=>)29
  311. b(select)g(*)h(from)f(complex_test;)318 394 y(val)258
  312. 454 y(-----)258 514 y((1,2))258 573 y((3,4))258 633
  313. y((5,6))258 693 y((3)g(rows))258 813 y(testdb=>)g(select)g
  314. (complex_sum(val))f(from)i(complex_test;)347 872 y(val)258
  315. 932 y(------)258 992 y((9,12))258 1052 y((1)f(row))258
  316. 1171 y(testdb=>)g(select)g(complex_avg(val))f(from)i(complex_test;)
  317. 318 1231 y(val)258 1291 y(-----)258 1351 y((3,4))258
  318. 1410 y((1)f(row))258 1530 y(testdb=>)198 1673 y Fh(2.5.6)59
  319. b(T)l(riggers)198 1767 y Ft(PostgreSQL)14 b(supports)h(the)f(calling)g
  320. (of)g(C)h(functions)f(as)h(trigger)f(actions.)22 b(T)n(riggers)15
  321. b(are)g(not)f(a)h(fea-)198 1827 y(ture)d(that)h(is)g(only)f(present)h
  322. (in)f(PostgreSQL.)h(In)f(fact)g(most)h(modern)f(RDMSs)h(support)g
  323. (triggers.)j(W)l(e)198 1887 y(describe)g(them)g(here)g(because)i(the)e
  324. (pre)o(vious)f(sections)i(are)g(necessary)g(to)f(understand)g(the)g
  325. (imple-)198 1946 y(mentation)c(chosen.)273 2006 y(At)g(the)h(moment)f
  326. (it)g(is)h(possible)g(to)f(de02ne)h(trigger)e(actions)i(that)f(are)h
  327. (e)o(x)o(ecuted)g Fp(befor)n(e)g Ft(and)g Fp(after)198
  328. 2066 y Ft(the)k(SQL)h(commands)f Fr(insert,)29 b(update)17
  329. b Ft(or)g Fr(delete)g Ft(for)g(a)g(tuple.)31 b(T)n(riggers)18
  330. b(can)f(be)h(used)198 2126 y(to)e(ensure)g(data)g(inte)o(grity)m(.)26
  331. b(F)o(or)15 b(e)o(xample)h(we)h(can)f(de02ne)g(a)g(trigger)f(action)h
  332. (that)g(returns)f(an)h(error)198 2186 y(whene)o(v)o(er)11
  333. b(somebody)g(wants)f(to)h(insert)g((or)f(update))h(a)g(tuple)g(with)f
  334. (a)h(ne)o(gati)o(v)o(e)g(supplier)g(id)g Fr(sno)f Ft(into)198
  335. 2245 y(table)i Fr(supplier)g Ft(de02ned)g(in)g(02gure)g(1.1.)273
  336. 2305 y(The)36 b(system)g(stores)h(information)d(about)h(when)h(a)g
  337. (trigger)f(action)h(has)g(to)g(be)g(per)o(-)198 2365
  338. y(formed.)75 b(Whene)o(v)o(er)33 b(a)g(command)f(triggering)f(an)i
  339. (action)f(is)h(detected,)38 b(the)33 b Fr(trigger)198
  340. 2425 y(manager)g Ft(is)h(called)f(within)g(PostgreSQL,)h(which)f
  341. (initializes)g(a)h(global)f(data)h(structure)198 2485
  342. y Fr(TriggerData)29 b(*CurrentTriggerData)10 b Ft(and)i(calls)h(the)f
  343. (appropriate)g(trigger)f(function.)198 2604 y(A)44 b(central)f(role)h
  344. (in)f(the)h(de02nition)f(of)h(trigger)e(functions)i(plays)g(the)g
  345. (global)f(data)198 2664 y(structure)84 b Fr(TriggerData)29
  346. b(*CurrentTriggerData)83 b Ft((The)h(global)h(pointer)198
  347. 2724 y Fr(CurrentTriggerData)10 b Ft(can)j(be)g(accessed)g(from)e
  348. (within)h(e)o(v)o(ery)g(trigger)g(function):)258 2824
  349. y Fr(typedef)29 b(struct)g(TriggerData)258 2884 y({)318
  350. 2944 y(TriggerEvent)118 b(tg_event;)318 3003 y(Relation)238
  351. b(tg_relation;)318 3063 y(HeapTuple)208 b(tg_trigtuple;)318
  352. 3123 y(HeapTuple)g(tg_newtuple;)318 3183 y(Trigger)268
  353. b(*tg_trigger;)258 3242 y(})30 b(TriggerData;)198 3342
  354. y Ft(No)o(w)12 b(we)g(gi)o(v)o(e)g(a)g(short)g(description)f(of)h(the)f
  355. (structure')m(s)h(contents)g(rele)o(v)o(ant)f(for)g(the)h(e)o(xample)g
  356. (belo)o(w)m(.)198 3402 y(F)o(or)g(a)g(detailed)h(description)e(of)h
  357. (this)h(and)f(other)g(structures)g(and)h(functions)e(refer)h(to)g
  358. ([LOCK98]:)p eop
  359. %%Page: 44 44
  360. 44 43 bop 270 60 a Ft(44)307 b Fm(CHAPTER)14 b(2.)28
  361. b(POSTGRESQL)13 b(FR)n(OM)f(THE)i(USER'S)e(POINT)g(OF)g(VIEW)345
  362. 234 y Fo(17)25 b Fr(tg)p 458 234 15 2 v 17 w(event)p
  363. Ft(:)j(Describes)19 b(the)f(e)o(v)o(ent)h(the)f(function)g(is)h(called)
  364. g(for)m(.)34 b(Contains)19 b(information)395 294 y(about)11
  365. b(when)g(the)g(function)g(was)g(called)h(()p Fp(befor)n(e)f
  366. Ft(or)g Fp(after)23 b Ft(the)11 b(command)g(e)o(x)o(ecution))h(and)f
  367. (for)395 354 y(which)h(command)g(it)g(was)g(called)h(()p
  368. Fr(insert,)28 b(update)12 b Ft(or)g Fr(delete)p Ft().)345
  369. 450 y Fo(17)25 b Fr(tg)p 458 450 V 17 w(relation)p
  370. Ft(:)87 b(Is)49 b(a)g(pointer)e(to)i(a)g(structure)f(describing)g(the)g
  371. (relation.)395 510 y Fr(tg)p 458 510 V 17 w(relation-)p
  372. Fk(>)p Fr(rd)p 844 510 V 17 w(att)12 b Ft(is)g(of)g(special)h(interest)
  373. f(for)g(us)h(because)g(it)f(can)g(be)h(gi)o(v)o(en)f(as)h(an)395
  374. 570 y(ar)o(gument)e(to)h(the)h(function)e Fr(SPI)p 990
  375. 570 V 18 w(getbinval())g Ft(described)h(later)m(.)345
  376. 667 y Fo(17)25 b Fr(tg)p 458 667 V 17 w(trigtuple)p
  377. Ft(:)16 b(Is)e(a)f(pointer)g(to)g(the)g(tuple)g(for)g(which)g(the)g
  378. (trigger)f(is)i(02red.)k(If)12 b(the)i(com-)395 726
  379. y(mand)e(is)g Fr(insert)g Ft(or)g Fr(delete)g Ft(this)g(is)h(the)f
  380. (tuple)g(to)h(be)f(returned)f(by)i(the)f(trigger)f(function.)345
  381. 823 y Fo(17)25 b Fr(tg)p 458 823 V 17 w(newtuple)p
  382. Ft(:)18 b(If)c(the)g(command)g(is)g Fr(update)g Ft(this)g(is)g(a)h
  383. (pointer)e(to)h(the)g(ne)o(w)g(v)o(ersion)h(of)395 883
  384. y(tuple)d(and)g(NULL)h(otherwise.)i(This)e(is)g(what)f(has)h(to)f(be)g
  385. (returned)g(by)g(the)g(trigger)f(function)h(if)395 942
  386. y(the)g(command)g(is)g Fr(update)p Ft(.)270 1058 y Fn(Example)h(2.11)25
  387. b Ft(W)l(e)16 b(de02ne)g(a)h(trigger)e(function)g(called)i
  388. Fr(trigf())e Ft(that)h(is)h(designed)f(to)h(pre)o(v)o(ent)270
  389. 1117 y(inserting)12 b((updating))f(tuples)h(with)g(a)h(ne)o(gati)o(v)
  390. o(e)f(supplier)g(id)g Fr(sno)g Ft(into)g(table)h Fr(supplier)p
  391. Ft(.)270 1237 y(First)26 b(we)g(ha)o(v)o(e)h(to)f(de02ne)g(the)h
  392. (function)e Fr(trigf())h Ft(using)g(C)h(and)f(therefore)f(we)i
  393. (create)f(a)270 1297 y(ne)o(w)14 b(02le)g Fr(trigger.c)p
  394. Ft(.)20 b(The)15 b(function)e(de02nition)h(is)g(done)g(in)g(e)o
  395. (xactly)h(the)f(same)g(way)g(as)h(for)e(the)270 1356
  396. y(de02nition)e(of)h(user)h(de02ned)f(functions)g((see)g(section)h
  397. (2.5.2).)270 1476 y(Here)f(are)h(the)f(contents)g(of)g
  398. Fr(trigger.c)p Ft(:)270 1570 y Fr(#include)29 b(<executor/spi.h>)270
  399. 1629 y(#include)g(<commands/trigger.h>)270 1749 y(HeapTuple)270
  400. 1809 y(trigf())270 1868 y({)h(TupleDesc)208 b(tupdesc;)330
  401. 1928 y(HeapTuple)g(rettuple;)330 1988 y(bool)358 b(isnull;)330
  402. 2048 y(int)388 b(val;)330 2167 y(if)29 b((!CurrentTriggerData))390
  403. 2227 y(elog(ERROR,)f("trigf:)h(triggers)g(are)h(not)f(initialized");)
  404. 330 2347 y(/*)g(tuple)h(to)f(return)h(to)f(Executor)g(*/)330
  405. 2406 y(if)g((TRIGGER_FIRED_BY_UPDATE(CurrentTrig)o(gerData->)o
  406. (tg_event)o()))390 2466 y(rettuple)g(=)g
  407. (CurrentTriggerData->tg_newtuple;)330 2526 y(else)390
  408. 2586 y(rettuple)g(=)g(CurrentTriggerData->tg_trigtuple;)330
  409. 2705 y(tupdesc)g(=)h(CurrentTriggerData->tg_relati)o(on->rd_at)o(t;)330
  410. 2765 y(CurrentTriggerData)e(=)h(NULL;)330 2885 y(/*)g(get)h(the)g
  411. (value)f(of)h(attribute)e(1)i(of)g(the)f(current)h(tuple)f(*/)330
  412. 2944 y(val)g(=)h(SPI_getbinval(rettuple,)d(tupdesc,)i(1,)h(&isnull);)
  413. 330 3064 y(/*)f(if)h(the)g(value)f(is)h(NULL)f(or)h(<)g(0)f(return)h
  414. (an)f(error)h(*/)330 3124 y(if)f((isnull)h(||)f(val)h(<)g(0))f({)419
  415. 3184 y(elog(ERROR,"insert/update:)e(sno)j(must)f(be)h(a)g(value)f(>)h
  416. (0");)330 3243 y(})330 3303 y(return)f((rettuple);)270
  417. 3363 y(})p eop
  418. %%Page: 45 45
  419. 45 44 bop 198 60 a Fm(2.5.)29 b(SOME)12 b(OF)h(POSTGRESQL)-5
  420. b('S)12 b(SPECIAL)h(FEA)-6 b(TURES)14 b(IN)e(DET)-5 b(AIL)340
  421. b Ft(45)198 234 y(The)20 b(function)e Fr(SPI)p 573 234
  422. 15 2 v 18 w(getbinval)g Ft(is)i(part)e(of)h(the)g Fp(Server)i(Pr)n(ogr)
  423. o(amming)e(Interface)g((SPI))f Ft(de-)198 294 y(scribed)13
  424. b(in)g(section)g(2.5.7.)19 b(It)13 b(takes)g(the)g(current)f(tuple,)h
  425. (the)g(description)g(of)g(the)g(relation,)g(the)g(num-)198
  426. 354 y(ber)k(of)g(the)h(attrib)o(ute)f(and)g(the)h(address)g(of)f(a)h(v)
  427. o(ariable)f Fr(isnull)g Ft(as)h(ar)o(guments)f(and)h(returns)f(the)198
  428. 413 y(binary)c(v)o(alue)h(of)f(the)h(gi)o(v)o(en)f(attrib)o(ute)g(from)
  429. g(the)h(current)f(tuple.)20 b(If)13 b(the)g(attrib)o(ute')m(s)h(v)o
  430. (alue)f(is)h(NULL)198 473 y Fr(isnull)e Ft(is)g(set)h(to)f
  431. Fr(true)g Ft(otherwise)h(to)f Fr(false)p Ft(.)273 533
  432. y Fr(trigf())23 b Ft(02rst)g(checks)h(whether)f(it)h(was)f(called)h
  433. (by)f(an)h Fr(update)f Ft(command)g(or)g(by)h(an)198
  434. 593 y Fr(insert)19 b Ft(and)g(sets)h Fr(rettuple)e Ft(accordingly)m(.)
  435. 36 b(Then)19 b(it)g(gets)h(the)f(v)o(alue)g(of)g(the)g(02rst)g
  436. (attrib)o(ute)198 653 y(of)e(the)g(current)g(tuple)g((remember)f
  437. Fr(sno)i Ft(is)f(the)h(02rst)f(attrib)o(ute)f(in)i(the)f(relation)g
  438. Fr(supplier)p Ft().)30 b(If)198 712 y(the)14 b(v)o(alue)h(is)f
  439. (greater)g(than)g(zero)h(the)f(current)g(tuple)g(is)h(returned)e((and)
  440. h(inserted)h(or)f(updated)g(by)g(the)198 772 y(e)o(x)o(ecutor)e(of)f
  441. (PostgreSQL))g(otherwise)h(an)g(error)f(is)h(returned)f(()p
  442. Fr(elog(ERROR,)p Fk(:)d(:)g(:)n Fr())k Ft(logs)g(an)g(error)198
  443. 832 y(and)g(aborts)h(processing))f(and)g(the)g(table)h
  444. Fr(supplier)e Ft(won')o(t)g(be)i(af)o(fected.)198 951
  445. y(T)l(o)g(create)f(a)h(shared)f(library)f(out)i(of)f
  446. Fr(trigger.c)f Ft(we)h(use)h(the)g(commands:)258 1035
  447. y Fr($)30 b(gcc)f(-I$PGROOT/include)f(-I$PGSRC/include/)g(-fpic)h(\)
  448. 258 1095 y(>)h(-c)f(trigger.c)g(-o)h(trigger.o)258 1155
  449. y($)g(gcc)f(-shared)g(-o)h(trigger.so)f(trigger.o)198
  450. 1238 y Ft(Note)24 b(that)f(for)g(the)g(compilation)g(of)g(trigger)g
  451. (functions)g(the)h(source)f(code)h(of)g(PostgreSQL)f(is)198
  452. 1298 y(necessary)m(.)16 b Fr($PGSRC)c Ft(points)g(to)h(the)f(place)g
  453. (where)h(the)f(sources)h(are)f(installed.)198 1418 y(Ne)o(xt)20
  454. b(we)h(ha)o(v)o(e)g(to)f(make)f(the)i(function)e Fr(trigf())h
  455. Ft(kno)o(wn)f(to)h(PostgreSQL)g(by)g(the)h Fr(create)198
  456. 1477 y(function)13 b Ft(command)h(in)f(the)h(same)h(way)e(we)h(did)g
  457. (for)f(the)h(functions)g(in)f(the)h(pre)o(vious)g(e)o(xamples)198
  458. 1537 y((e.g.)19 b(e)o(xample)14 b(2.8).)k(After)13
  459. b(that)g(we)h(can)f(de02ne)g(the)h(trigger)e Fr(tbefore)p
  460. Ft(.)18 b(The)c(de02nition)f(ensures)198 1597 y(that)e(function)g
  461. Fr(trigf())g Ft(gi)o(v)o(en)g(as)i(the)e(trigger)g(action)g(will)g
  462. (be)h(e)o(x)o(ecuted)g Fr(before)f Ft(the)h(e)o(x)o(ecution)198
  463. 1657 y(of)24 b(the)g(commands)g Fr(insert)g Ft(and)g
  464. Fr(update)g Ft(af)o(fecting)f(the)h(table)g Fr(supplier)p
  465. Ft(.)51 b(Note)24 b(that)198 1717 y Fr(insert)17 b Ft(and)h
  466. Fr(update)f Ft(commands)h(e)o(x)o(ecuted)g(against)g(tables)g(other)g
  467. (than)f Fr(supplier)g Ft(won')o(t)198 1776 y(cause)c(the)f(e)o(x)o
  468. (ecution)h(of)f(function)f Fr(trigf())p Ft(.)258 1860
  469. y Fr(testdb=>)29 b(create)g(function)g(trigf())g(returns)g(opaque)258
  470. 1920 y(testdb->)g(as)g('/<where_ever_you_put_it/trigger.so')258
  471. 1980 y(testdb->)g(language)g('c';)258 2039 y(CREATE)258
  472. 2099 y(testdb=>)g(create)g(trigger)g(tbefore)258 2159
  473. y(testdb->)g(before)g(insert)g(or)h(update)f(on)h(supplier)258
  474. 2219 y(testdb->)f(for)g(each)h(row)f(execute)g(procedure)g(trigf();)
  475. 258 2278 y(CREATE)258 2338 y(testdb=>)198 2422 y Ft(No)o(w)14
  476. b(we)g(can)g(check)g(if)g(the)g(trigger)f(is)h(working)f(correctly)m(.)
  477. 20 b(If)13 b(the)h(v)o(alue)g(for)f Fr(sno)g Ft(is)i(greater)e(than)198
  478. 2482 y(zero)f(the)h Fr(insert)e Ft(and)i Fr(update)e
  479. Ft(commands)i(against)f(table)g Fr(supplier)g Ft(are)g(not)g(af)o
  480. (fected.)258 2565 y Fr(testdb=>)29 b(insert)g(into)g(supplier)258
  481. 2625 y(testdb->)g((sno,)g(sname,)g(city))258 2685 y(testdb->)g
  482. (values(5,)g('Miles',)g('Berlin');)258 2745 y(INSERT)g(156064)g(1)258
  483. 2864 y(testdb=>)g(insert)g(into)g(supplier)258 2924 y(testdb->)g
  484. ((sno,)g(sname,)g(city))258 2984 y(testdb->)g(values(-2,)g('Huber',)
  485. g('Munich');)258 3044 y(ERROR:)59 b(insert/update:)28
  486. b(sno)i(must)f(be)h(a)g(value)f(>)h(0)258 3163 y(testdb=>)f(update)g
  487. (supplier)258 3223 y(testdb->)g(set)g(sno)h(=)g(-2)258
  488. 3283 y(testdb->)f(where)g(sname)g(=)h('Adams';)258 3342
  489. y(ERROR:)59 b(insert/update:)28 b(sno)i(must)f(be)h(a)g(value)f(>)h(0)
  490. 258 3402 y(testdb=>)p eop
  491. %%Page: 46 46
  492. 46 45 bop 270 60 a Ft(46)307 b Fm(CHAPTER)14 b(2.)28
  493. b(POSTGRESQL)13 b(FR)n(OM)f(THE)i(USER'S)e(POINT)g(OF)g(VIEW)270
  494. 234 y Fh(2.5.7)59 b(Ser)o(v)o(er)14 b(Pr)o(ogramming)f(Interface)g
  495. ((SPI))270 328 y Ft(The)20 b Fp(Server)g(Pr)n(ogr)o(amming)g
  496. (Interface)f((SPI))g Ft(gi)o(v)o(es)g(the)h(user)f(the)h(ability)e
  497. (to)i(run)f(SQL)g(queries)270 387 y(from)10 b(inside)i(user)f
  498. (de02ned)h(functions.)j(SPI)10 b(is)i(just)f(a)h(set)g(of)f(nati)o(v)
  499. o(e)g(interface)g(functions)g(to)g(simplify)270 447 y(the)29
  500. b(access)h(to)f(the)g Fr(query)g(parser,)g(planner,)g(optimizer)f
  501. Ft(and)h Fr(executor)g Ft(of)270 507 y(PostgreSQL)12
  502. b((refer)f(to)h(chapter)g(3)h Fp(P)l(ostgr)n(eSQL)g(fr)n(om)f(the)g
  503. (Pr)n(ogr)o(ammer')n(s)i(P)l(oint)e(of)g(V)l(ie)o(w)p
  504. Ft().)270 626 y(The)h(set)g(of)f(functions)g(of)f(SPI)h(can)g(be)h(di)
  505. o(vided)f(into)g(the)g(follo)o(wing)f(parts:)345 724
  506. y Fo(17)25 b Ft(Interface)11 b(Functions:)17 b(These)d(functions)e
  507. (are)h(used)h(to)f(establish)h(a)f(connection)g(to)g(a)g(running)395
  508. 784 y(backend.)i(Whene)o(v)o(er)c(you)h(want)g(to)f(e)o(x)o(ecute)i(a)f
  509. (SQL)g(query)g(within)f(a)h(user)g(de02ned)g(function)395
  510. 844 y(you)g(will)g(ha)o(v)o(e)g(to)h(connect)f(to)g(a)h(backend)f(by)g
  511. Fr(SPI)p 1314 844 15 2 v 18 w(connect())p Ft(.)454
  512. 943 y Fn(226)25 b Fr(SPI)p 597 943 V 18 w(connect())11
  513. b Ft(opens)i(a)f(connection)g(to)h(the)f(PostgreSQL)g(backend.)454
  514. 1022 y Fn(226)25 b Fr(SPI)p 597 1022 V 18 w(finish())11
  515. b Ft(closes)i(a)g(connection)f(to)g(the)h(PostgreSQL)f(backend.)454
  516. 1101 y Fn(226)25 b Fr(SPI)p 597 1101 V 18 w(exec())15
  517. b Ft(takes)g(a)h(character)f(string)h(containing)f(a)g(SQL)h(query)f
  518. (and)h(a)g(number)504 1160 y Fr(tcount)11 b Ft(as)h(ar)o(guments)f(and)
  519. g(e)o(x)o(ecutes)h(the)g(query)m(.)i(The)e(result)f(can)h(be)f
  520. (obtained)g(from)504 1220 y(the)17 b(global)g(data)g(structure)f
  521. Fr(SPI)p 1108 1220 V 18 w(tuptable)g Ft(which)h(is)g(set)h(by)f
  522. Fr(SPI)p 1801 1220 V 18 w(exec())p Ft(.)29 b(If)504
  523. 1280 y Fr(tcount)12 b Ft(is)i(zero)e(then)h(the)g(query)f(is)i(e)o(x)o
  524. (ecuted)f(for)f(all)h(tuples)g(returned)f(by)h(the)g(query)504
  525. 1340 y(scan.)27 b(Using)16 b Fr(tcount)f Fk(>)h Ft(0)g(restricts)g(the)
  526. f(number)h(of)f(tuples)h(for)f(which)h(the)g(query)504
  527. 1399 y(will)d(be)h(e)o(x)o(ecuted.)21 b(This)14 b(function)f(should)g
  528. (only)h(be)g(called)f(after)g Fr(SPI)p 1786 1399 V 18
  529. w(connect())504 1459 y Ft(has)g(been)f(processed)h(and)g(a)f
  530. (connection)g(has)h(been)g(established.)454 1538 y Fn(226)25
  531. b Fr(SPI)p 597 1538 V 18 w(prepare())85 b Ft(creates)h(and)g(returns)
  532. f(an)h(e)o(x)o(ecution)g(plan)504 1598 y((parser+planner+optimizer))
  533. 23 b(b)o(ut)j(doesn')o(t)g(e)o(x)o(ecute)g(the)g(query)m(.)56
  534. b((The)26 b(function)504 1658 y(performs)15 b(the)i(same)f(steps)h(as)
  535. g Fr(SPI)p 1163 1658 V 18 w(exec())f Ft(e)o(xcept)g(that)g(it)g(does)
  536. h(not)f(e)o(x)o(ecute)h(the)504 1717 y(plan.)f(Should)11
  537. b(only)h(be)h(called)f(after)g(a)h(connection)f(has)g(been)h
  538. (established.)454 1796 y Fn(226)25 b Fr(SPI)p 597 1796
  539. V 18 w(saveplan())10 b Ft(stores)h(a)g(plan)g(prepared)f(by)h
  540. Fr(SPI)p 1518 1796 V 18 w(prepare())f Ft(in)h(safe)g(mem-)504
  541. 1856 y(ory)h(protected)g(from)f(freeing)h(by)g Fr(SPI)p
  542. 1199 1856 V 17 w(finish())p Ft(.)454 1935 y Fn(226)25
  543. b Fr(SPI)p 597 1935 V 18 w(execp())12 b Ft(e)o(x)o(ecutes)h(a)g(plan)
  544. f(prepared)g(by)g Fr(SPI)p 1491 1935 V 18 w(prepare())g
  545. Ft(or)g(returned)f(by)504 1995 y Fr(SPI)p 597 1995 V
  546. 18 w(saveplan())p Ft(.)345 2094 y Fo(17)25 b Ft(Interface)8
  547. b(Support)i(Functions:)j(These)f(functions)e(can)g(be)h(used)g(from)e
  548. (within)h(a)g(connected)h(or)395 2153 y(within)g(an)g(unconnected)h
  549. (user)f(de02ned)h(function.)j(An)c(e)o(xample)h(for)f(the)g(use)h
  550. (from)f(within)g(an)395 2213 y(unconnected)k(function)g(was)h(gi)o(v)o
  551. (en)g(in)f(e)o(xample)h(2.11)g(where)g Fr(SPI)p 1634
  552. 2213 V 17 w(getbinval())f Ft(was)395 2273 y(used)h(to)g(deli)o(v)o
  553. (er)g(the)g(v)o(alue)g(of)g(attrib)o(ute)g Fr(sno)g Ft(from)f(the)h(ne)
  554. o(w)g((to)g(be)g(inserted))g(tuple.)27 b(An)395 2333
  555. y(e)o(xample)12 b(for)f(the)h(use)g(from)f(within)g(a)h(connected)g
  556. (function)f(will)h(be)g(gi)o(v)o(en)g(in)f(e)o(xample)h(2.12.)454
  557. 2432 y Fn(226)25 b Fr(SPI)p 597 2432 V 18 w(copytuple())11
  558. b Ft(makes)h(a)h(copy)f(of)f(the)i(tuple)f(gi)o(v)o(en)g(as)h(ar)o
  559. (gument.)454 2510 y Fn(226)25 b Fr(SPI)p 597 2510 V
  560. 18 w(modifytuple())j Ft(modi02es)i(one)g(or)f(more)h(attrib)o(utes)
  561. f(of)h(a)g(gi)o(v)o(en)g(tu-)504 2570 y(ple.)73 b(The)32
  562. b(ne)o(w)g(v)o(alues)f(for)g(the)g(attrib)o(utes)g(to)g(be)h(changed)g
  563. (are)f(passed)h(to)504 2630 y Fr(SPI)p 597 2630 V 18
  564. w(modifytuple())11 b Ft(as)i(ar)o(guments.)454 2709
  565. y Fn(226)25 b Fr(SPI)p 597 2709 V 18 w(fnumber())11
  566. b Ft(takes)h(the)g(description)g(of)g(a)g(tuple)g(and)g(the)h
  567. Fp(name)f Ft(of)g(an)g(attrib)o(ute)504 2769 y(as)h(ar)o(guments)f(and)
  568. h(returns)e(the)i Fp(number)f Ft(of)g(the)h(attrib)o(ute.)454
  569. 2848 y Fn(226)25 b Fr(SPI)p 597 2848 V 18 w(fname())13
  570. b Ft(takes)g(the)g(description)g(of)h(a)f(tuple)g(and)h(the)f
  571. Fp(number)h Ft(of)f(an)h(attrib)o(ute)504 2907 y(as)f(ar)o(guments)f
  572. (and)h(returns)e(the)i Fp(name)f Ft(of)g(the)g(attrib)o(ute.)454
  573. 2986 y Fn(226)25 b Fr(SPI)p 597 2986 V 18 w(getvalue())13
  574. b Ft(takes)g(the)h(description)g(of)f(a)h(tuple,)h(the)e(tuple)h(and)g
  575. (the)g(number)504 3046 y(of)k(an)g(attrib)o(ute)f(as)i(ar)o(guments)e
  576. (and)i(returns)e(a)h Fp(string)h(r)n(epr)n(esentation)g
  577. Ft(of)e(the)h(gi)o(v)o(en)504 3106 y(attrib)o(ute')m(s)12
  578. b(v)o(alue.)454 3185 y Fn(226)25 b Fr(SPI)p 597 3185
  579. V 18 w(getbinval())10 b Ft(takes)h(the)g(description)g(of)f(a)i
  580. (tuple,)f(the)h(tuple)e(and)i(the)f(number)504 3244 y(of)h(an)h(attrib)
  581. o(ute)e(as)i(ar)o(guments)f(and)g(returns)g(the)h(binary)e(v)o(alue)h
  582. (of)g(the)h(gi)o(v)o(en)f(attrib)o(ute.)454 3323 y Fn(226)25
  583. b Fr(SPI)p 597 3323 V 18 w(gettype())11 b Ft(returns)h(a)h(copy)e(of)
  584. h(the)h(type)f(name)g(for)g(the)g(speci02ed)h(attrib)o(ute.)454
  585. 3402 y Fn(226)25 b Fr(SPI)p 597 3402 V 18 w(gettypeid())11
  586. b Ft(returns)h(the)g(type)g(OID)g(for)g(the)g(speci02ed)h(attrib)o
  587. (ute.)p eop
  588. %%Page: 47 47
  589. 47 46 bop 198 60 a Fm(2.5.)26 b(SOME)12 b(OF)h(POSTGRESQL)-5
  590. b('S)12 b(SPECIAL)h(FEA)-6 b(TURES)14 b(IN)e(DET)-5 b(AIL)343
  591. b Ft(47)382 234 y Fn(226)25 b Fr(SPI)p 525 234 15 2
  592. v 18 w(getrelname())11 b Ft(returns)h(the)g(name)g(of)g(the)h
  593. (speci02ed)f(relation.)382 315 y Fn(226)25 b Fr(SPI)p
  594. 525 315 V 18 w(palloc())e Ft(allocates)i(memory)m(.)50
  595. b(In)23 b(contrast)h(to)g Fr(malloc())g Ft((normally)432
  596. 375 y(used))15 b(it)g(allocates)h(memory)e(in)h(such)h(a)f(way)g(that)
  597. g(it)g(can)g(be)g(freed)g(automatically)f(by)432 434
  598. y Fr(SPI)p 525 434 V 18 w(finish())p Ft(.)382 515 y
  599. Fn(226)25 b Fr(SPI)p 525 515 V 18 w(repalloc())12
  600. b Ft(reallocates)i(memory)f(that)h(has)g(originally)f(been)g(allocated)
  601. h(us-)432 575 y(ing)e Fr(SPI)p 601 575 V 18 w(palloc())p
  602. Ft(.)382 656 y Fn(226)25 b Fr(SPI)p 525 656 V 18 w(pfree())11
  603. b Ft(frees)i(memory)e(allocated)h(by)h Fr(SPI)p 1397
  604. 656 V 17 w(palloc())p Ft(.)198 778 y Fn(Example)g(2.12)25
  605. b Ft(W)l(e)14 b(want)g(PostgreSQL)f(to)h(automatically)g(generate)g(a)g
  606. (v)o(alue)g(for)f(the)i(supplier)e(id)198 838 y Fr(sno)e
  607. Ft(whene)o(v)o(er)g(a)g(ne)o(w)h(tuple)f(is)g(inserted)g(into)g(table)g
  608. Fr(supplier)p Ft(.)k(Therefore)c(we)g(de02ne)g(a)h
  609. Fp(trigger)198 898 y(function)k Fr(trigf)p 531 898 V
  610. 17 w(sno())g Ft(that)g(is)g(called)h(before)e(the)i(e)o(x)o(ecution)f
  611. (of)g(e)o(v)o(ery)g Fr(insert)g Ft(statement.)198 958
  612. y Fr(trigf)p 351 958 V 17 w(sno())c Ft(has)h(to)f(perform)f(the)i
  613. (follo)o(wing)d(steps:)273 1059 y Fo(17)25 b Ft(establish)12
  614. b(a)h(connection)f(to)g(the)g(PostgreSQL)g(backend)g(using)h
  615. Fr(SPI)p 1547 1059 V 17 w(connect())273 1161 y Fo(17)25
  616. b Ft(get)12 b(the)g(greatest)h(supplier)f(id)g Fr(sno)g
  617. Ft(contained)g(in)g(table)g Fr(supplier)g Ft(using)g
  618. Fr(SPI)p 1794 1161 V 18 w(exec())273 1262 y Fo(17)25
  619. b Ft(modify)13 b(attrib)o(ute)h Fr(sno)h Ft(of)g(the)f(tuple)h(to)g(be)
  620. g(inserted)f(to)h(contain)g(the)g(ne)o(xt)g(greater)f(number)323
  621. 1322 y(using)e Fr(SPI)p 536 1322 V 18 w(modifytuple())273
  622. 1424 y Fo(17)25 b Ft(disconnect)12 b(from)f(the)i(backend)f(using)g
  623. Fr(SPI)p 1122 1424 V 18 w(finish())273 1526 y Fo(17)25
  624. b Ft(return)11 b(the)h(modi02ed)g(tuple)198 1627 y(Here)26
  625. b(are)h(the)f(contents)h(of)f(function)g Fr(trigf)p 1103
  626. 1627 V 17 w(sno())g Ft(that)h(can)f(be)h(appended)f(to)h(the)f
  627. (02le)198 1687 y Fr(trigger.c)11 b Ft(from)h(e)o(xample)g(2.11:)258
  628. 1788 y Fr(HeapTuple)258 1848 y(trigf_sno())258 1908
  629. y({)30 b(HeapTuple)208 b(rettuple;)318 1968 y(bool)358
  630. b(isnull;)318 2027 y(int)388 b(ret,)29 b(max;)318 2087
  631. y(int)388 b(atts_to_be_changed[1];)318 2147 y(Datum)328
  632. b(new_value[1];)318 2207 y(char)358 b(nulls;)318 2326
  633. y(if)29 b((!CurrentTriggerData))377 2386 y(elog(ERROR,)527
  634. 2446 y("trigf:)g(triggers)g(are)g(not)h(initialized");)318
  635. 2565 y(/*)f(This)h(is)f(the)h(tuple)f(to)h(be)g(inserted)f(*/)318
  636. 2625 y(rettuple)g(=)g(CurrentTriggerData->tg_trigtuple;)318
  637. 2745 y(/*)g(Connect)g(to)h(backend)f(*/)318 2804 y(if)g(((ret)h(=)f
  638. (SPI_connect()))g(<)g(0))377 2864 y(elog(ERROR,)527
  639. 2924 y("trigf_sno:)f(SPI_connect)h(returned)g(45d",ret);)318
  640. 3044 y(/*)g(Get)h(greatest)f(sno)g(in)h(relation)f(supplier)g(*/)318
  641. 3103 y(/*)g(Execute)g(the)h(query)f(*/)318 3163 y(ret)g(=)h
  642. (SPI_exec("select)e(max(sno))h(from)g(supplier",0);)318
  643. 3223 y(if)g((ret)h(<)f(0))407 3283 y(elog(ERROR,)557
  644. 3342 y("trigf_sno:)f(SPI_exec)h(returned)g(45d",ret);)p
  645. eop
  646. %%Page: 48 48
  647. 48 47 bop 270 60 a Ft(48)307 b Fm(CHAPTER)14 b(2.)28
  648. b(POSTGRESQL)13 b(FR)n(OM)f(THE)i(USER'S)e(POINT)g(OF)g(VIEW)390
  649. 234 y Fr(/*)29 b(extract)g(the)h(number)f(from)h(the)f(result)419
  650. 294 y(*)h(returned)f(by)h(the)f(query.)h(SPI_exec())e(puts)419
  651. 354 y(*)i(the)g(result)f(into)g(the)h(global)f(structure)419
  652. 413 y(*)h(SPI_tuptable)f(*/)390 473 y(max)g(=)h
  653. (SPI_getbinval(SPI_tuptable->val)o(s[0],)987 533 y
  654. (SPI_tuptable->tupdesc,)e(1,)987 593 y(&isnull);)390
  655. 712 y(/*)h(disconnect)g(from)g(backend)h(*/)390 772 y(SPI_finish();)
  656. 390 892 y(/*)f(array)h(containing)e(the)i(numbers)f(of)h(attributes)419
  657. 951 y(*)g(to)g(be)g(changed:)f(sno)g(has)h(attno)f(1)h(*/)390
  658. 1011 y(atts_to_be_changed[0])d(=)j(1;)390 1131 y(/*)f(new)h(values)f
  659. (for)h(attributes)e(to)i(be)g(changed:)419 1191 y(*)g(the)g(next)f
  660. (number)g(for)h(sno)g(is)f(max+1)h(*/)390 1250 y(new_value[0])e(=)i
  661. ((max+1);)390 1370 y(/*)f(modify)g(the)h(tuple)f(to)h(be)g(inserted)f
  662. (to)g(contain)419 1430 y(*)h(max+1)g(as)f(sno)h(*/)390
  663. 1489 y(rettuple)f(=)449 1549 y(SPI_modifytuple(CurrentTriggerData-)o
  664. (>tg_relat)o(ion,)928 1609 y(rettuple,)928 1669 y(1,)928
  665. 1729 y(atts_to_be_changed,)928 1788 y(new_value,)928
  666. 1848 y(&nulls);)390 1968 y(if)g((rettuple)g(==)h(NULL))479
  667. 2027 y(elog(ERROR,)629 2087 y("trigf_sno:)e(SPI_modifytuple)h
  668. (failed");)390 2207 y(CurrentTriggerData)e(=)j(NULL;)390
  669. 2267 y(return)f((rettuple);)330 2326 y(})270 2456 y
  670. Ft(W)l(e)13 b(again)f(create)g(the)g(shared)h(library)e
  671. Fr(trigger.so)g Ft(out)i(of)e Fr(trigger.c)p Ft(:)330
  672. 2595 y Fr($)30 b(gcc)f(-I$PGROOT/include)f(-I$PGSRC/include/)g(-fpic)h
  673. (\)330 2655 y(>)h(-c)f(trigger.c)g(-o)h(trigger.o)330
  674. 2714 y($)g(gcc)f(-shared)g(-o)h(trigger.so)f(trigger.o)270
  675. 2844 y Ft(Ne)o(xt)16 b(we)g(ha)o(v)o(e)h(to)f(make)f(the)h(function)f
  676. Fr(trigf)p 1155 2844 15 2 v 18 w(sno())g Ft(kno)o(wn)g(to)h
  677. (PostgreSQL)g(and)g(after)f(that)270 2904 y(we)j(can)f(de02ne)h(the)f
  678. (trigger)g Fr(sno)p 894 2904 V 17 w(before)g Ft(which)h(is)f(called)h
  679. (before)f(an)g Fr(insert)g Ft(to)h(the)f(table)270 2963
  680. y Fr(supplier)p Ft(.)30 b(The)18 b(trigger)e(function)g(ensures)i(that)
  681. f(the)h(ne)o(xt)f(greater)g(number)f(for)h Fr(sno)g Ft(will)g(be)270
  682. 3023 y(used.)330 3162 y Fr(testdb=>)29 b(create)g(function)g
  683. (trigf_sno())g(returns)g(opaque)330 3222 y(testdb->)g(as)g
  684. ('/<where_ever_you_put_it>/trigger.so)o(')330 3282 y(testdb->)g
  685. (language)g('c';)330 3342 y(CREATE)p eop
  686. %%Page: 49 49
  687. 49 48 bop 198 60 a Fm(2.5.)29 b(SOME)12 b(OF)h(POSTGRESQL)-5
  688. b('S)12 b(SPECIAL)h(FEA)-6 b(TURES)14 b(IN)e(DET)-5 b(AIL)340
  689. b Ft(49)258 234 y Fr(testdb=>)29 b(create)g(trigger)g(sno_before)258
  690. 294 y(testdb->)g(before)g(insert)g(on)h(supplier)258
  691. 354 y(testdb->)f(for)g(each)h(row)f(execute)g(procedure)g
  692. (trigf_sno();)258 413 y(CREATE)258 473 y(testdb=>)198
  693. 585 y Ft(Ev)o(ery)12 b(time)f(a)h(ne)o(w)g(tuple)f(is)h(inserted)f(to)h
  694. (the)f(table)h Fr(supplier)f Ft(a)h(ne)o(w)f Fr(sno)h
  695. Ft(is)g(assigned)g(automat-)198 645 y(ically)g(re)o(gardless)h(of)e
  696. (the)i(v)o(alue)f(gi)o(v)o(en)g(in)g(the)h Fr(insert)e
  697. Ft(statement:)258 747 y Fr(testdb=>)29 b(select)g(*)h(from)f(supplier;)
  698. 258 806 y(sno|sname)g(|city)258 866 y(---+------+------)318
  699. 926 y(1|Smith)g(|London)318 986 y(2|Jones)g(|Paris)318
  700. 1046 y(3|Adams)g(|Vienna)318 1105 y(4|Blake)g(|Rome)258
  701. 1165 y((4)g(rows))258 1285 y(testdb=>)g(insert)g(into)g(supplier)258
  702. 1344 y(testdb->)g((sno,)g(sname,)g(city))258 1404 y(testdb->)g
  703. (values)g((200,'Cook',)g('Boston');)258 1464 y(INSERT)g(15606)g(1)258
  704. 1584 y(testdb=>)g(select)g(*)h(from)f(supplier;)258 1643
  705. y(sno|sname)g(|city)258 1703 y(---+------+------)318
  706. 1763 y(1|Smith)g(|London)318 1823 y(2|Jones)g(|Paris)318
  707. 1882 y(3|Adams)g(|Vienna)318 1942 y(4|Blake)g(|Rome)318
  708. 2002 y(5|Cook)59 b(|Boston)258 2062 y((5)29 b(rows))258
  709. 2181 y(testdb=>)198 2327 y Fh(2.5.8)59 b(Rules)15 b(in)g(P)o(ostgr)o
  710. (eSQL)198 2421 y Ft(PostgreSQL)f(supports)f(a)i(po)o(werful)d
  711. Fp(rule)j(system)p Ft(.)21 b(The)15 b(user)f(can)g(de02ne)g(a)g(rule)
  712. f(and)h(connect)g(it)g(to)198 2481 y(an)g(e)o(v)o(ent.)19
  713. b(Whene)o(v)o(er)13 b(the)h(e)o(v)o(ent)f(occurs)h(the)g(rule)f(body)g
  714. (is)h(e)o(x)o(ecuted)g(in)f(addition)g(to)h(or)f(instead)h(of)198
  715. 2541 y(the)e(commands)h(of)f(the)g(e)o(v)o(ent.)198 2661
  716. y(A)g(rule)g(is)h(created)f(using)h(the)f(follo)o(wing)f(SQL)h
  717. (statement:)258 2762 y Fr(create)29 b(rule)g(rule_name)258
  718. 2822 y(as)g(on)h(event)258 2882 y(to)f(object)h([where)f(clause])258
  719. 2942 y(do)g([instead])258 3002 y([action)g(|)h(nothing)f(|)h
  720. ([actions...]])198 3103 y Ft(where)20 b Fr(event)f Ft(is)h(one)g(of)f
  721. Fr(select,)29 b(update,)g(delete)19 b Ft(or)h Fr(insert)p
  722. Ft(.)39 b Fr(object)19 b Ft(is)h(the)198 3163 y(name)14
  723. b(of)g(a)h Fp(table)f Ft(or)f Fp(table)o(.column)p Ft(.)22
  724. b(The)15 b Fr(where)f Ft(clause,)i(and)e(the)g Fr(action)g
  725. Ft(are)g(a)g(normal)g(SQL)198 3222 y Fr(where)e Ft(clause)h(and)f
  726. (collection)g(of)g(SQL)h(commands.)273 3283 y(One)k(application)g(of)h
  727. (rules)f(is)h(the)g(implementation)e(of)h Fp(vie)o(ws)i
  728. Ft(in)e(PostgreSQL.)h(A)g Fp(vie)o(w)g Ft(is)g(a)198
  729. 3342 y Fp(virtual)e Ft(table)g(that)g(does)g(not)g(physically)g(e)o
  730. (xist)g(within)g(the)g(database)g(b)o(ut)g(looks)g(to)g(the)g(user)g
  731. (as)h(if)198 3402 y(it)f(did.)28 b(T)l(o)17 b(realize)f(a)h
  732. Fp(vie)o(w)g Ft(we)g(can)f(create)h(an)f(empty)g(table)h(with)f(the)g
  733. (name)h(of)f(the)g Fp(vie)o(w)p Ft(.)29 b(Then)p eop
  734. %%Page: 50 50
  735. 50 49 bop 270 60 a Ft(50)307 b Fm(CHAPTER)14 b(2.)28
  736. b(POSTGRESQL)13 b(FR)n(OM)f(THE)i(USER'S)e(POINT)g(OF)g(VIEW)270
  737. 234 y Ft(we)h(de02ne)g(a)g(rule)g(that)f(is)i(02red)e(e)o(v)o(ery)h
  738. (time)f(the)h(ne)o(w)g(table)g(is)g(accessed.)19 b(Instead)13
  739. b(of)g(retrie)o(ving)e(the)270 294 y(data)k(from)e(the)i
  740. Fp(virtual)f Ft(table)h(the)f(rule)g(body)g(is)h(e)o(x)o(ecuted)g
  741. (retrie)o(ving)e(the)i(data)g(from)e(one)i(or)f(more)270
  742. 354 y(physically)e(stored)g(tables.)270 473 y Fn(Example)h(2.13)25
  743. b Ft(W)l(e)15 b(want)g(to)g(sho)o(w)g(ho)o(w)g(a)g(vie)o(w)g(could)g
  744. (be)h(realized)f(in)g(PostgreSQL.)g(Note)g(that)270 533
  745. y(there)d(is)i(of)e(course)h(an)g(o)o(wn)f(command)g(to)h(create)g
  746. Fp(vie)o(ws)h Fr(create)29 b(view)12 b Ft(in)h(PostgreSQL)f(which)270
  747. 593 y(performs)f(the)i(steps)g(of)f(our)f(e)o(xample)i(internally)m(.)
  748. 270 712 y(First)f(we)g(create)h(a)f(ne)o(w)m(,)h(empty)f(table)g
  749. Fr(my)p 1023 712 15 2 v 18 w(view)p Ft(:)330 812 y Fr(testdb=>)29
  750. b(create)g(table)g(my_view)g(()330 872 y(testdb->)g(sname)g
  751. (varchar(20),)330 932 y(testdb->)g(pname)g(varchar(20))330
  752. 991 y(testdb->)g();)270 1091 y Ft(Ne)o(xt)14 b(we)g(create)g(the)g
  753. (rule)f(that)h(will)f(be)h(02red)f(whene)o(v)o(er)h(a)g
  754. Fr(select)f Ft(against)h(the)g(table)g Fr(my)p 1936 1091
  755. V 17 w(view)270 1151 y Ft(sho)o(ws)f(up:)330 1250 y Fr(testdb=>)29
  756. b(create)g(rule)g(my_view_rule)330 1310 y(testdb->)g(as)g(on)h(select)f
  757. (to)h(my_view)330 1370 y(testdb->)f(do)g(instead)h(select)f(s.sname,)g
  758. (p.pname)330 1430 y(testdb->)g(from)g(supplier)g(s,)h(part)f(p,)h
  759. (sells)f(se)330 1489 y(testdb->)g(where)g(s.sno=se.sno)g(and)g
  760. (p.pno=se.pno;)330 1549 y(CREATE)330 1609 y(testdb=>)270
  761. 1709 y Ft(No)o(w)12 b(we)h(can)f(use)h(the)f(table)h
  762. Fr(my)p 855 1709 V 17 w(view)f Ft(as)h(if)f(it)g(were)h(populated)e
  763. (with)i(tuples:)330 1808 y Fr(testdb=>)29 b(select)g(*)h(from)f
  764. (my_view;)330 1868 y(sname)g(|pname)330 1928 y(------+-----)330
  765. 1988 y(Smith)g(|Screw)330 2047 y(Smith)g(|Nut)330 2107
  766. y(Jones)g(|Cam)330 2167 y(Adams)g(|Screw)330 2227 y(Adams)g(|Bolt)330
  767. 2286 y(Blake)g(|Nut)330 2346 y(Blake)g(|Bolt)330 2406
  768. y(Blake)g(|Cam)330 2466 y((8)g(rows))330 2585 y(testdb=>)g(select)g
  769. (*)h(from)f(my_view)330 2645 y(testdb->)g(where)g(sname)g(=)h('Blake';)
  770. 330 2705 y(sname)f(|pname)330 2765 y(------+-----)330
  771. 2824 y(Blake)g(|Nut)330 2884 y(Blake)g(|Bolt)330 2944
  772. y(Blake)g(|Cam)330 3004 y((3)g(rows))330 3123 y(testdb=>)p
  773. eop
  774. %%Page: 51 51
  775. 51 50 bop 198 608 a Fj(Chapter)26 b(3)198 857 y Fq(P)n(ostgr)n(eSQL)k
  776. (fr)n(om)i(the)198 1006 y(Pr)n(ogrammer')-5 b(s)32 b(P)n(oint)f(of)g(V)
  777. -5 b(iew)198 1265 y Ft(This)10 b(chapter)f(gi)o(v)o(es)h(an)f(o)o(v)o
  778. (ervie)o(w)g(of)g(the)h(internal)e(structure)h(of)g(the)g(backend)g(of)
  779. g(PostgreSQL.)h(After)198 1325 y(ha)o(ving)15 b(read)g(the)h(follo)o
  780. (wing)e(sections)i(you)f(should)g(ha)o(v)o(e)h(an)f(idea)h(of)f(ho)o(w)
  781. g(a)h(query)e(is)i(processed.)198 1385 y(Don')o(t)g(e)o(xpect)g(a)h
  782. (detailed)f(description)g(here)g((I)g(think)g(such)g(a)h(description)f
  783. (dealing)g(with)g(all)g(data)198 1445 y(structures)11
  784. b(and)h(functions)f(used)h(within)f(PostgreSQL)g(would)g(e)o(xceed)h
  785. (1000)f(pages!).)k(This)d(chapter)198 1504 y(is)f(intended)f(to)g
  786. (help)g(understanding)g(the)g(general)h(control)e(and)i(data)f(03o)o
  787. (w)g(within)g(the)g(backend)g(from)198 1564 y(recei)o(ving)i(a)g(query)
  788. g(to)g(sending)h(the)f(results.)198 1729 y Fi(3.1)71
  789. b(The)18 b(W)-5 b(ay)18 b(of)f(a)h(Query)198 1841 y Ft(Here)12
  790. b(we)h(gi)o(v)o(e)f(a)h(short)f(o)o(v)o(ervie)o(w)g(of)g(the)g(stages)h
  791. (a)g(query)f(has)g(to)h(pass)g(in)f(order)g(to)g(obtain)g(a)g(result:)
  792. 273 1927 y Fo(17)25 b Ft(First)14 b(a)h(connection)f(from)g(an)h
  793. (application)f(program)g(to)g(the)h(PostgreSQL)f(serv)o(er)h(has)g(to)g
  794. (be)323 1987 y(established.)g(The)d(application)f(program)f(transmits)i
  795. (a)f(query)g(to)g(the)h(serv)o(er)f(and)g(recei)o(v)o(es)h(the)323
  796. 2047 y(results)g(sent)h(back)f(by)h(the)f(serv)o(er)m(.)273
  797. 2140 y Fo(17)25 b Ft(The)17 b Fp(parser)g(stage)f Ft(checks)i(the)e
  798. (query)h(transmitted)f(by)h(the)f(application)h(program)e((client))
  799. 323 2200 y(for)c(correct)h(syntax)g(and)h(creates)f(a)h
  800. Fp(query)g(tr)n(ee)p Ft(.)273 2293 y Fo(17)25 b Ft(The)18
  801. b Fp(r)n(e)o(write)h(system)f Ft(takes)f(the)h Fp(query)g(tr)n(ee)g
  802. Ft(created)g(by)f(the)h Fp(parser)g(stage)f Ft(looks)g(for)g(an)o(y)323
  803. 2352 y Fp(rules)11 b Ft((stored)g(in)g(the)g Fp(system)h(catalogs)p
  804. Ft())e(to)h(apply)f(to)h(the)g Fp(querytr)n(ee)i Ft(and)e(performs)f
  805. (the)h(trans-)323 2412 y(formations)j(gi)o(v)o(en)g(in)h(the)g
  806. Fp(rule)h(bodies)p Ft(.)24 b(One)15 b(application)g(of)f(the)h
  807. Fp(r)n(e)o(write)i(system)f Ft(is)f(gi)o(v)o(en)323 2472
  808. y(in)f(the)g(realization)f(of)h Fp(vie)o(ws)p Ft(.)23
  809. b(Whene)o(v)o(er)14 b(a)g(query)g(against)g(a)g Fp(vie)o(w)h
  810. Ft((i.e.)22 b(a)14 b Fp(virtual)g(table)p Ft())g(is)323
  811. 2532 y(made,)h(the)f Fp(r)n(e)o(write)h(system)g Ft(re)o(writes)f(the)g
  812. (user')m(s)h(query)e(to)h(a)h(query)f(that)g(accesses)i(the)e
  813. Fp(base)323 2592 y(tables)e Ft(gi)o(v)o(en)g(in)g(the)h
  814. Fp(vie)o(w)g(de02nition)e Ft(instead.)273 2685 y Fo(17)25
  815. b Ft(The)17 b Fp(planner/optimizer)f Ft(takes)h(the)g(()p
  816. Fp(r)n(e)o(written)p Ft())f Fp(querytr)n(ee)i Ft(and)f(creates)g(a)g
  817. Fp(queryplan)f Ft(that)323 2744 y(will)10 b(be)i(the)f(input)f(to)h
  818. (the)g Fp(e)o(xecutor)p Ft(.)16 b(It)11 b(does)h(so)f(by)g(02rst)g
  819. (creating)g(all)g(possible)g Fp(paths)g Ft(leading)323
  820. 2804 y(to)16 b(the)g(same)h(result.)29 b(()16 b(F)o(or)g(e)o(xample)h
  821. (if)f(there)g(is)h(an)f(inde)o(x)h(on)f(a)h(relation)f(to)g(be)h
  822. (scanned,)323 2864 y(there)c(are)g(two)g Fp(paths)h Ft(for)f(the)g
  823. (scan.)20 b(One)14 b(possibility)f(is)h(a)g(simple)g(sequential)f(scan)
  824. i(and)e(the)323 2924 y(other)g(possibility)g(is)h(to)f(use)h(the)g
  825. (inde)o(x.))19 b(Ne)o(xt)14 b(the)f(cost)h(for)f(the)h(e)o(x)o
  826. (ecution)f(of)h(each)g Fp(plan)f Ft(is)323 2984 y(estimated)f(and)g
  827. (the)h(cheapest)g Fp(plan)f Ft(is)g(chosen)h(and)f(handed)h(back.)273
  828. 3077 y Fo(17)25 b Ft(The)14 b Fp(e)o(xecutor)h Ft(recursi)o(v)o(ely)f
  829. (steps)h(through)e(the)h Fp(plan)g(tr)n(ee)h Ft(and)f(retrie)o(v)o(es)g
  830. (tuples)g(in)g(the)h(way)323 3136 y(represented)f(by)g(the)g
  831. Fp(plan)p Ft(.)21 b(The)15 b Fp(e)o(xecutor)g Ft(makes)f(use)h(of)f
  832. (the)g Fp(stor)o(age)h(system)g Ft(while)f(scan-)323
  833. 3196 y(ning)i(relations,)j(performs)d Fp(sorts)i Ft(and)f
  834. Fp(joins)p Ft(,)i(e)o(v)o(aluates)e Fp(quali02cations)g
  835. Ft(and)g(02nally)g(hands)323 3256 y(back)12 b(the)g(tuples)h(deri)o
  836. (v)o(ed.)198 3342 y(In)j(the)g(follo)o(wing)g(sections)h(we)f(will)g
  837. (co)o(v)o(er)h(e)o(v)o(ery)f(of)g(the)h(abo)o(v)o(e)g(listed)f(items)h
  838. (in)f(more)g(detail)g(to)198 3402 y(gi)o(v)o(e)c(a)h(better)f
  839. (understanding)f(on)i(PostgreSQL)-5 b(')m(s)12 b(internal)g(control)f
  840. (and)i(data)f(structures.)1073 3552 y(51)p eop
  841. %%Page: 52 52
  842. 52 51 bop 270 60 a Ft(52)82 b Fm(CHAPTER)14 b(3.)28 b(POSTGRESQL)13
  843. b(FR)n(OM)f(THE)i(PR)n(OGRAMMER'S)f(POINT)f(OF)g(VIEW)270
  844. 234 y Fi(3.2)71 b(Ho)o(w)18 b(Connections)f(ar)o(e)g(Established)270
  845. 370 y Ft(PostgreSQL)c(is)g(implemented)f(using)h(a)g(simple)g
  846. (224process)h(per)o(-user224)e(client/serv)o(er)h(model.)k(In)c(this)
  847. 270 430 y(model)k(there)f(is)h(one)g Fp(client)g(pr)n(ocess)h
  848. Ft(connected)f(to)f(e)o(xactly)i(one)e Fp(server)j(pr)n(ocess)p
  849. Ft(.)30 b(As)18 b(we)f(don')o(t)270 490 y(kno)o(w)f Fp(per)h(se)g
  850. Ft(ho)o(w)f(man)o(y)h(connections)g(will)f(be)g(made,)j(we)d(ha)o(v)o
  851. (e)h(to)g(use)g(a)f Fp(master)i(pr)n(ocess)f Ft(that)270
  852. 549 y(spa)o(wns)h(a)e(ne)o(w)h Fp(server)h(pr)n(ocess)f
  853. Ft(e)o(v)o(ery)f(time)h(a)f(connection)h(is)f(requested.)29
  854. b(This)17 b Fp(master)g(pr)n(ocess)270 609 y Ft(is)f(called)g
  855. Fr(postmaster)e Ft(and)i(listens)g(at)f(a)h(speci02ed)g(TCP/IP)f
  856. (port)g(for)g(incoming)g(connections.)270 669 y(Whene)o(v)o(er)e(a)h
  857. (request)f(for)f(a)i(connection)f(is)h(detected)f(the)g
  858. Fr(postmaster)g Ft(process)g(spa)o(wns)i(a)e(ne)o(w)270
  859. 729 y Fp(server)i(pr)n(ocess)f Ft(called)g Fr(postgres)p
  860. Ft(.)j(The)d(serv)o(er)g(tasks)g(()p Fr(postgres)e Ft(processes))i
  861. (communicate)270 788 y(with)k(each)g(other)f(using)h
  862. Fp(semaphor)n(es)h Ft(and)f Fp(shar)n(ed)h(memory)g Ft(to)e(ensure)h
  863. (data)g(inte)o(grity)f(through-)270 848 y(out)j(concurrent)e(data)i
  864. (access.)40 b(Figure)19 b(3.1)h(illustrates)f(the)h(interaction)f(of)g
  865. (the)h(master)g(process)270 908 y Fr(postmaster)11 b
  866. Ft(the)i(serv)o(er)f(process)h Fr(postgres)e Ft(and)i(a)f(client)h
  867. (application.)345 981 y(The)e(client)g(process)g(can)h(either)e(be)h
  868. (the)g Fr(psql)g Ft(frontend)f((for)f Fp(inter)o(active)j
  869. Ft(SQL)f(queries))f(or)h(an)o(y)270 1041 y(user)f(application)f
  870. (implemented)g(using)h(the)f Fr(libpg)h Ft(library)m(.)j(Note)d(that)f
  871. (applications)h(implemented)270 1100 y(using)i Fr(ecpq)g
  872. Ft((i.e.)k(the)d(postgres)f(embedded)g(C)h(compiler))e(also)i(use)g
  873. (this)f(library)m(.)345 1173 y(Once)e(a)g(connection)f(is)i
  874. (established)f(the)g(client)f(process)i(can)f(send)g(a)g(query)f(to)h
  875. (the)g Fp(bac)o(kend)p Ft(.)15 b(The)270 1233 y(query)f(is)h
  876. (transmitted)e(using)i Fp(plain)f(te)o(xt)p Ft(,)h(i.e.)23
  877. b(there)14 b(is)h(no)f(parsing)g(done)h(in)f(the)h Fp(fr)n(ontend)f
  878. Ft((client).)270 1293 y(The)i(serv)o(er)g Fp(parses)g
  879. Ft(the)g(query)m(,)g(creates)g(an)g Fp(e)o(xecution)f(plan)p
  880. Ft(,)i(e)o(x)o(ecutes)g(the)e Fp(plan)g Ft(and)h(returns)f(the)270
  881. 1352 y(retrie)o(v)o(ed)c(tuples)i(to)f(the)g(client)h(by)f
  882. (transmitting)f(them)h(o)o(v)o(er)h(the)f(established)h(connection.)543
  883. 2309 y @beginspecial 180 @llx 310 @lly 431 @urx 482 @ury
  884. 2510 @rwi @setspecial
  885. %%BeginDocument: figures/connection.ps
  886. %Magnification: 1.05
  887. /$F2psDict 200 dict def
  888. $F2psDict begin
  889. $F2psDict /mtrx matrix put
  890. /col-1 {0 setgray} bind def
  891. /col0 {0.000 0.000 0.000 srgb} bind def
  892. /col1 {0.000 0.000 1.000 srgb} bind def
  893. /col2 {0.000 1.000 0.000 srgb} bind def
  894. /col3 {0.000 1.000 1.000 srgb} bind def
  895. /col4 {1.000 0.000 0.000 srgb} bind def
  896. /col5 {1.000 0.000 1.000 srgb} bind def
  897. /col6 {1.000 1.000 0.000 srgb} bind def
  898. /col7 {1.000 1.000 1.000 srgb} bind def
  899. /col8 {0.000 0.000 0.560 srgb} bind def
  900. /col9 {0.000 0.000 0.690 srgb} bind def
  901. /col10 {0.000 0.000 0.820 srgb} bind def
  902. /col11 {0.530 0.810 1.000 srgb} bind def
  903. /col12 {0.000 0.560 0.000 srgb} bind def
  904. /col13 {0.000 0.690 0.000 srgb} bind def
  905. /col14 {0.000 0.820 0.000 srgb} bind def
  906. /col15 {0.000 0.560 0.560 srgb} bind def
  907. /col16 {0.000 0.690 0.690 srgb} bind def
  908. /col17 {0.000 0.820 0.820 srgb} bind def
  909. /col18 {0.560 0.000 0.000 srgb} bind def
  910. /col19 {0.690 0.000 0.000 srgb} bind def
  911. /col20 {0.820 0.000 0.000 srgb} bind def
  912. /col21 {0.560 0.000 0.560 srgb} bind def
  913. /col22 {0.690 0.000 0.690 srgb} bind def
  914. /col23 {0.820 0.000 0.820 srgb} bind def
  915. /col24 {0.500 0.190 0.000 srgb} bind def
  916. /col25 {0.630 0.250 0.000 srgb} bind def
  917. /col26 {0.750 0.380 0.000 srgb} bind def
  918. /col27 {1.000 0.500 0.500 srgb} bind def
  919. /col28 {1.000 0.630 0.630 srgb} bind def
  920. /col29 {1.000 0.750 0.750 srgb} bind def
  921. /col30 {1.000 0.880 0.880 srgb} bind def
  922. /col31 {1.000 0.840 0.000 srgb} bind def
  923. end
  924. save
  925. 175.5 498.0 translate
  926. 1 -1 scale
  927. /cp {closepath} bind def
  928. /ef {eofill} bind def
  929. /gr {grestore} bind def
  930. /gs {gsave} bind def
  931. /sa {save} bind def
  932. /rs {restore} bind def
  933. /l {lineto} bind def
  934. /m {moveto} bind def
  935. /rm {rmoveto} bind def
  936. /n {newpath} bind def
  937. /s {stroke} bind def
  938. /sh {show} bind def
  939. /slc {setlinecap} bind def
  940. /slj {setlinejoin} bind def
  941. /slw {setlinewidth} bind def
  942. /srgb {setrgbcolor} bind def
  943. /rot {rotate} bind def
  944. /sc {scale} bind def
  945. /sd {setdash} bind def
  946. /ff {findfont} bind def
  947. /sf {setfont} bind def
  948. /scf {scalefont} bind def
  949. /sw {stringwidth} bind def
  950. /tr {translate} bind def
  951. /tnt {dup dup currentrgbcolor
  952.   4 -2 roll dup 1 exch sub 3 -1 roll mul add
  953.   4 -2 roll dup 1 exch sub 3 -1 roll mul add
  954.   4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
  955.   bind def
  956. /shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
  957.   4 -2 roll mul srgb} bind def
  958.  /DrawEllipse {
  959. /endangle exch def
  960. /startangle exch def
  961. /yrad exch def
  962. /xrad exch def
  963. /y exch def
  964. /x exch def
  965. /savematrix mtrx currentmatrix def
  966. x y tr xrad yrad sc 0 0 1 startangle endangle arc
  967. closepath
  968. savematrix setmatrix
  969. } def
  970. /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
  971. /$F2psEnd {$F2psEnteredState restore end} def
  972. $F2psBegin
  973. 10 setmiterlimit
  974. n 0 792 m 0 0 l 612 0 l 612 792 l cp clip
  975.  0.06299 0.06299 sc
  976. 7.500 slw
  977. % Polyline
  978. n 2835 1980 m 3645 1980 l 3645 2250 l 2835 2250 l cp gs col-1 s gr 
  979. /Times-Roman ff 150.00 scf sf
  980. 2925 2160 m
  981. gs 1 -1 sc (Postmaster) col-1 sh gr
  982. % Polyline
  983. n 2790 540 m 3600 540 l 3600 810 l 2790 810 l cp gs col-1 s gr 
  984. /Times-Roman ff 150.00 scf sf
  985. 2880 720 m
  986. gs 1 -1 sc (Postmaster) col-1 sh gr
  987. % Ellipse
  988. n 3240 2385 810 585 0 360 DrawEllipse gs col-1 s gr
  989. % Ellipse
  990. n 2520 2115 45 45 0 360 DrawEllipse gs col-1 s gr
  991. % Ellipse
  992. n 900 2206 765 495 0 360 DrawEllipse gs col-1 s gr
  993. % Ellipse
  994. n 3195 945 810 585 0 360 DrawEllipse gs col-1 s gr
  995. % Ellipse
  996. n 2475 675 45 45 0 360 DrawEllipse gs col-1 s gr
  997. % Ellipse
  998. n 855 766 765 495 0 360 DrawEllipse gs col-1 s gr
  999. % Polyline
  1000. gs  clippath
  1001. 2704 2493 m 2809 2556 l 2686 2550 l 2840 2598 l 2858 2541 l  cp clip
  1002. n 1395 2115 m 2835 2565 l gs col-1 s gr gr
  1003. % arrowhead
  1004. n 2704 2493 m 2809 2556 l 2686 2550 l 2695 2521 l 2704 2493 l  cp gs 0.00 setgray ef gr  col-1 s
  1005. % Polyline
  1006. n 2565 2115 m 2835 2115 l gs col-1 s gr 
  1007. % Polyline
  1008. n 855 1890 m 855 2340 l gs col-1 s gr 
  1009. % Polyline
  1010. n 405 1890 m 1395 1890 l 1395 2340 l 405 2340 l cp gs col-1 s gr 
  1011. % Polyline
  1012. n 2835 2430 m 3645 2430 l 3645 2700 l 2835 2700 l cp gs col-1 s gr 
  1013. % Polyline
  1014. gs  clippath
  1015. 2283 645 m 2403 675 l 2283 705 l 2445 705 l 2445 645 l  cp clip
  1016. n 1350 675 m 2430 675 l gs col-1 s gr gr
  1017. % arrowhead
  1018. n 2283 645 m 2403 675 l 2283 705 l 2283 675 l 2283 645 l  cp gs 0.00 setgray ef gr  col-1 s
  1019. % Polyline
  1020. n 2520 675 m 2790 675 l gs col-1 s gr 
  1021. % Polyline
  1022. n 810 450 m 810 900 l gs col-1 s gr 
  1023. % Polyline
  1024. n 360 450 m 1350 450 l 1350 900 l 360 900 l cp gs col-1 s gr 
  1025. /Times-Roman ff 150.00 scf sf
  1026. 2880 2880 m
  1027. gs 1 -1 sc (Server Host) col-1 sh gr
  1028. /Times-Roman ff 150.00 scf sf
  1029. 495 2070 m
  1030. gs 1 -1 sc (User ) col-1 sh gr
  1031. /Times-Roman ff 150.00 scf sf
  1032. 495 2265 m
  1033. gs 1 -1 sc (App) col-1 sh gr
  1034. /Times-Roman ff 150.00 scf sf
  1035. 900 2160 m
  1036. gs 1 -1 sc (LIBPQ) col-1 sh gr
  1037. /Times-Roman ff 150.00 scf sf
  1038. 585 2610 m
  1039. gs 1 -1 sc (Client Host) col-1 sh gr
  1040. /Times-Roman ff 150.00 scf sf
  1041. 3015 2610 m
  1042. gs 1 -1 sc (Postgres) col-1 sh gr
  1043. /Times-Roman ff 150.00 scf sf
  1044. 2835 1440 m
  1045. gs 1 -1 sc (Server Host) col-1 sh gr
  1046. /Times-Roman ff 150.00 scf sf
  1047. 450 630 m
  1048. gs 1 -1 sc (User ) col-1 sh gr
  1049. /Times-Roman ff 150.00 scf sf
  1050. 450 825 m
  1051. gs 1 -1 sc (App) col-1 sh gr
  1052. /Times-Roman ff 150.00 scf sf
  1053. 855 720 m
  1054. gs 1 -1 sc (LIBPQ) col-1 sh gr
  1055. /Times-Roman ff 150.00 scf sf
  1056. 540 1170 m
  1057. gs 1 -1 sc (Client Host) col-1 sh gr
  1058. showpage
  1059. $F2psEnd
  1060. rs
  1061. %%EndDocument
  1062.  @endspecial 733 2418 a(Figure)e(3.1:)16 b(Ho)o(w)c(a)g(connection)g
  1063. (is)h(established)270 2780 y Fi(3.3)71 b(The)18 b(P)o(arser)f(Stage)270
  1064. 2916 y Ft(The)c Fp(parser)g(stage)f Ft(consists)h(of)f(two)f(parts:)345
  1065. 3055 y Fo(17)25 b Ft(The)17 b Fp(parser)g Ft(de02ned)g(in)f
  1066. Fr(gram.y)h Ft(and)f Fr(scan.l)h Ft(is)g(b)o(uilt)f(using)h(the)f(UNIX)
  1067. h(tools)f Fr(yacc)395 3115 y Ft(and)c Fr(lex)p Ft(.)345
  1068. 3266 y Fo(17)25 b Ft(The)11 b Fp(tr)o(ansformation)g(pr)n(ocess)h
  1069. Ft(does)f(some)g(necessary)h(transformation)d(to)i(the)g(data)g
  1070. (structure)395 3326 y(returned)g(by)h(the)h Fp(parser)p
  1071. Ft(.)p eop
  1072. %%Page: 53 53
  1073. 53 52 bop 198 60 a Fm(3.3.)29 b(THE)13 b(P)-5 b(ARSER)13
  1074. b(ST)-5 b(A)n(GE)1189 b Ft(53)198 234 y Fh(3.3.1)59 b(P)o(arser)198
  1075. 328 y Ft(The)14 b Fp(parser)g Ft(has)g(to)f(check)h(the)f(query)g
  1076. (string)g((which)g(arri)o(v)o(es)g(as)h Fp(plain)f(ASCII)h(te)o(xt)p
  1077. Ft())f(for)f(v)o(alid)h(syn-)198 388 y(tax.)22 b(If)14
  1078. b(the)g(syntax)h(is)g(correct)e(a)i Fp(parse)g(tr)n(ee)g
  1079. Ft(is)g(b)o(uilt)f(up)g(and)h(handed)f(back)h(otherwise)f(an)g(error)g
  1080. (is)198 448 y(returned.)h(F)o(or)d(the)g(implementation)f(the)i(well)f
  1081. (kno)o(wn)g(UNIX)g(tools)g Fr(lex)g Ft(and)g Fr(yacc)g
  1082. Ft(are)h(used.)273 508 y(The)i Fp(le)o(xer)g Ft(is)g(de02ned)f(in)h
  1083. (the)f(02le)g Fr(scan.l)g Ft(and)h(is)g(responsible)f(for)g
  1084. (recognizing)g Fp(identi02ers)p Ft(,)198 567 y(the)h
  1085. Fp(SQL)g(ke)o(ywor)n(ds)h Ft(etc.)24 b(F)o(or)15 b(e)o(v)o(ery)g
  1086. Fp(ke)o(ywor)n(d)g Ft(or)g Fp(identi02er)g Ft(that)g(is)h(found,)g(a)
  1087. f Fp(token)g Ft(is)g(generated)198 627 y(and)d(handed)h(to)f(the)g
  1088. Fp(parser)p Ft(.)273 687 y(The)k Fp(parser)g Ft(is)g(de02ned)f(in)g
  1089. (the)h(02le)f Fr(gram.y)g Ft(and)g(consists)i(of)e(a)h(set)g(of)f
  1090. Fp(gr)o(ammar)h(rules)g Ft(and)198 747 y Fp(actions)10
  1091. b Ft(that)g(are)g(e)o(x)o(ecuted)h(whene)o(v)o(er)f(a)h(rule)f(is)g
  1092. (02red.)15 b(The)10 b(code)h(of)f(the)g Fp(actions)g
  1093. Ft((which)g(is)g(actually)198 807 y(C-code))i(is)h(used)f(to)h(b)o
  1094. (uild)e(up)i(the)f Fp(parse)h(tr)n(ee)p Ft(.)273 867
  1095. y(The)h(02le)g Fr(scan.l)f Ft(is)h(transformed)f(to)g(the)h(C-source)
  1096. g(02le)g Fr(scan.c)f Ft(using)h(the)g(program)e Fr(lex)198
  1097. 927 y Ft(and)17 b Fr(gram.y)g Ft(is)h(transformed)e(to)h
  1098. Fr(gram.c)g Ft(using)g Fr(yacc)p Ft(.)30 b(After)17 b(these)h
  1099. (transformations)e(ha)o(v)o(e)198 987 y(taken)11 b(place)g(a)g(normal)f
  1100. (C-compiler)g(can)h(be)h(used)f(to)g(create)g(the)g Fp(parser)p
  1101. Ft(.)16 b(Ne)o(v)o(er)11 b(make)f(an)o(y)i(changes)198
  1102. 1046 y(to)j(the)g(generated)g(C-02les)g(as)h(the)o(y)f(will)g(be)h(o)
  1103. o(v)o(erwritten)e(the)h(ne)o(xt)h(time)e Fr(lex)h Ft(or)g
  1104. Fr(yacc)g Ft(is)h(called.)198 1106 y((Note)g(that)h(the)g(mentioned)f
  1105. (transformations)g(and)h(compilations)f(are)h(normally)f(done)h
  1106. (automati-)198 1166 y(cally)12 b(using)h(the)f Fr(makefiles)f
  1107. Ft(shipped)i(with)f(the)g(PostgreSQL)g(source)h(distrib)o(ution.))273
  1108. 1226 y(A)20 b(detailed)g(description)g(of)g Fr(yacc)g
  1109. Ft(or)f(the)i Fp(gr)o(ammar)g(rules)g Ft(gi)o(v)o(en)f(in)g
  1110. Fr(gram.y)g Ft(would)f(be)198 1286 y(be)o(yond)c(the)h(scope)g(of)f
  1111. (this)h(paper)m(.)25 b(There)16 b(are)f(man)o(y)g(books)h(and)g
  1112. (documents)f(dealing)g(with)g Fr(lex)198 1345 y Ft(and)c
  1113. Fr(yacc)p Ft(.)k(Y)-5 b(ou)11 b(should)g(be)h(familiar)d(with)i
  1114. Fr(yacc)p Ft(,)h(before)e(you)h(start)g(to)h(study)f(the)g(grammar)f
  1115. (gi)o(v)o(en)198 1405 y(in)i Fr(gram.y)g Ft(otherwise)g(you)g(won')o(t)
  1116. g(understand)g(what)g(happens)h(there.)198 1525 y(F)o(or)27
  1117. b(a)h(better)f(understanding)g(of)g(the)g(data)h(structures)f(used)h
  1118. (in)g(PostgreSQL)f(for)g(the)g(pro-)198 1585 y(cessing)12
  1119. b(of)e(a)h(query)g(we)g(use)g(an)g(e)o(xample)h(to)e(illustrate)h(the)g
  1120. (changes)g(made)g(to)g(these)g(data)g(structures)198
  1121. 1644 y(in)h(e)o(v)o(ery)g(stage.)198 1766 y Fn(Example)h(3.1)25
  1122. b Ft(This)10 b(e)o(xample)g(contains)f(the)h(follo)o(wing)e(simple)h
  1123. (query)g(that)h(will)f(be)g(used)h(in)g(v)o(arious)198
  1124. 1825 y(descriptions)18 b(and)g(02gures)g(throughout)f(the)h(follo)o
  1125. (wing)e(sections.)34 b(The)18 b(query)g(assumes)h(that)f(the)198
  1126. 1885 y(tables)13 b(gi)o(v)o(en)f(in)g(e)o(xample)g(1.1)h(ha)o(v)o(e)g
  1127. (already)f(been)h(de02ned.)258 1986 y Fr(select)29
  1128. b(s.sname,)g(se.pno)258 2046 y(from)g(supplier)g(s,)h(sells)f(se)258
  1129. 2106 y(where)g(s.sno)g(>)h(2)g(and)437 2165 y(s.sno)f(=)h(se.sno;)198
  1130. 2266 y Ft(Figure)13 b(3.2)h(sho)o(ws)h(the)e Fp(parse)i(tr)n(ee)f
  1131. Ft(b)o(uilt)g(by)f(the)h Fp(gr)o(ammar)h(rules)f Ft(and)g
  1132. Fp(actions)g Ft(gi)o(v)o(en)g(in)g Fr(gram.y)198 2326
  1133. y Ft(for)g(the)h(query)f(gi)o(v)o(en)h(in)f(e)o(xample)h(3.1)g
  1134. ((without)f(the)h Fp(oper)o(ator)g(tr)n(ee)h Ft(for)e(the)g
  1135. Fp(wher)n(e)i(clause)f Ft(which)198 2385 y(is)f(sho)o(wn)f(in)h
  1136. (02gure)f(3.3)h(because)g(there)f(was)h(not)f(enough)h(space)g(to)f
  1137. (sho)o(w)h(both)f(data)h(structures)f(in)198 2445 y(one)f(02gure).)
  1138. 273 2505 y(The)f(top)g(node)g(of)f(the)h(tree)g(is)g(a)g
  1139. Fr(SelectStmt)f Ft(node.)15 b(F)o(or)10 b(e)o(v)o(ery)h(entry)f
  1140. (appearing)h(in)f(the)h Fp(fr)n(om)198 2565 y(clause)k
  1141. Ft(of)f(the)h(SQL)g(query)f(a)h Fr(RangeVar)e Ft(node)i(is)g(created)f
  1142. (holding)g(the)h(name)g(of)f(the)g Fp(alias)h Ft(and)198
  1143. 2625 y(a)e(pointer)f(to)h(a)g Fr(RelExpr)f Ft(node)h(holding)f(the)h
  1144. (name)g(of)f(the)h Fp(r)n(elation)p Ft(.)k(All)c Fr(RangeVar)f
  1145. Ft(nodes)h(are)198 2685 y(collected)f(in)g(a)h(list)f(which)h(is)f
  1146. (attached)h(to)f(the)g(02eld)g Fr(fromClause)g Ft(of)g(the)g
  1147. Fr(SelectStmt)f Ft(node.)273 2745 y(F)o(or)19 b(e)o(v)o(ery)g(entry)h
  1148. (appearing)f(in)g(the)h Fp(select)g(list)g Ft(of)g(the)f(SQL)h(query)f
  1149. (a)h Fr(ResTarget)f Ft(node)198 2804 y(is)e(created)g(holding)f(a)h
  1150. (pointer)f(to)h(an)g Fr(Attr)g Ft(node.)29 b(The)17 b
  1151. Fr(Attr)g Ft(node)f(holds)h(the)g Fp(r)n(elation)g(name)198
  1152. 2864 y Ft(of)22 b(the)g(entry)g(and)h(a)f(pointer)g(to)g(a)h
  1153. Fr(Value)f Ft(node)g(holding)g(the)g(name)g(of)g(the)h
  1154. Fp(attrib)o(ute)p Ft(.)45 b(All)198 2924 y Fr(ResTarget)11
  1155. b Ft(nodes)h(are)g(collected)g(to)f(a)h(list)g(which)g(is)g(connected)g
  1156. (to)f(the)h(02eld)g Fr(targetList)f Ft(of)198 2984
  1157. y(the)h Fr(SelectStmt)g Ft(node.)198 3103 y(Figure)28
  1158. b(3.3)i(sho)o(ws)f(the)g Fp(oper)o(ator)h(tr)n(ee)g Ft(b)o(uilt)e(for)g
  1159. (the)h Fp(wher)n(e)h(clause)g Ft(of)e(the)h(SQL)h(query)198
  1160. 3163 y(gi)o(v)o(en)13 b(in)g(e)o(xample)h(3.1)f(which)g(is)h(attached)f
  1161. (to)g(the)h(02eld)f Fr(qual)g Ft(of)g(the)g Fr(SelectStmt)f
  1162. Ft(node.)19 b(The)198 3223 y(top)f(node)g(of)g(the)g
  1163. Fp(oper)o(ator)h(tr)n(ee)g Ft(is)g(an)f Fr(A)p 970 3223
  1164. 15 2 v 18 w(Expr)g Ft(node)g(representing)f(an)i Fr(AND)f
  1165. Ft(operation.)32 b(This)198 3283 y(node)14 b(has)g(two)f(successors)i
  1166. (called)e Fr(lexpr)h Ft(and)f Fr(rexpr)h Ft(pointing)e(to)i(two)f
  1167. Fp(subtr)n(ees)p Ft(.)21 b(The)14 b Fp(subtr)n(ee)198
  1168. 3342 y Ft(attached)g(to)f Fr(lexpr)g Ft(represents)h(the)g
  1169. (quali02cation)e Fk(s:sno)17 b(>)f Fl(2)e Ft(and)f(the)h(one)f
  1170. (attached)h(to)g Fr(rexpr)198 3402 y Ft(represents)f
  1171. Fk(s:sno)i Fl(=)f Fk(se:sno)p Ft(.)j(F)o(or)c(e)o(v)o(ery)f
  1172. Fp(attrib)o(ute)g Ft(an)h Fr(Attr)f Ft(node)h(is)g(created)g(holding)e
  1173. (the)i(name)p eop
  1174. %%Page: 54 54
  1175. 54 53 bop 270 60 a Ft(54)82 b Fm(CHAPTER)14 b(3.)28 b(POSTGRESQL)13
  1176. b(FR)n(OM)f(THE)i(PR)n(OGRAMMER'S)f(POINT)f(OF)g(VIEW)270
  1177. 234 y Ft(of)j(the)f Fp(r)n(elation)h Ft(and)g(a)g(pointer)g(to)f(a)i
  1178. Fr(Value)e Ft(node)h(holding)f(the)h(name)g(of)g(the)f
  1179. Fp(attrib)o(ute)p Ft(.)24 b(F)o(or)14 b(the)270 294 y
  1180. Fp(constant)e Ft(appearing)g(in)g(the)h(query)f(a)g Fr(Const)g
  1181. Ft(node)g(is)h(created)f(holding)g(the)g(v)o(alue.)363
  1182. 2301 y @beginspecial 144 @llx 201 @lly 467 @urx 590 @ury
  1183. 3230 @rwi @setspecial
  1184. %%BeginDocument: figures/parsetree.ps
  1185. %Magnification: 1.05
  1186. /$F2psDict 200 dict def
  1187. $F2psDict begin
  1188. $F2psDict /mtrx matrix put
  1189. /col-1 {0 setgray} bind def
  1190. /col0 {0.000 0.000 0.000 srgb} bind def
  1191. /col1 {0.000 0.000 1.000 srgb} bind def
  1192. /col2 {0.000 1.000 0.000 srgb} bind def
  1193. /col3 {0.000 1.000 1.000 srgb} bind def
  1194. /col4 {1.000 0.000 0.000 srgb} bind def
  1195. /col5 {1.000 0.000 1.000 srgb} bind def
  1196. /col6 {1.000 1.000 0.000 srgb} bind def
  1197. /col7 {1.000 1.000 1.000 srgb} bind def
  1198. /col8 {0.000 0.000 0.560 srgb} bind def
  1199. /col9 {0.000 0.000 0.690 srgb} bind def
  1200. /col10 {0.000 0.000 0.820 srgb} bind def
  1201. /col11 {0.530 0.810 1.000 srgb} bind def
  1202. /col12 {0.000 0.560 0.000 srgb} bind def
  1203. /col13 {0.000 0.690 0.000 srgb} bind def
  1204. /col14 {0.000 0.820 0.000 srgb} bind def
  1205. /col15 {0.000 0.560 0.560 srgb} bind def
  1206. /col16 {0.000 0.690 0.690 srgb} bind def
  1207. /col17 {0.000 0.820 0.820 srgb} bind def
  1208. /col18 {0.560 0.000 0.000 srgb} bind def
  1209. /col19 {0.690 0.000 0.000 srgb} bind def
  1210. /col20 {0.820 0.000 0.000 srgb} bind def
  1211. /col21 {0.560 0.000 0.560 srgb} bind def
  1212. /col22 {0.690 0.000 0.690 srgb} bind def
  1213. /col23 {0.820 0.000 0.820 srgb} bind def
  1214. /col24 {0.500 0.190 0.000 srgb} bind def
  1215. /col25 {0.630 0.250 0.000 srgb} bind def
  1216. /col26 {0.750 0.380 0.000 srgb} bind def
  1217. /col27 {1.000 0.500 0.500 srgb} bind def
  1218. /col28 {1.000 0.630 0.630 srgb} bind def
  1219. /col29 {1.000 0.750 0.750 srgb} bind def
  1220. /col30 {1.000 0.880 0.880 srgb} bind def
  1221. /col31 {1.000 0.840 0.000 srgb} bind def
  1222. end
  1223. save
  1224. 131.5 603.5 translate
  1225. 1 -1 scale
  1226. /cp {closepath} bind def
  1227. /ef {eofill} bind def
  1228. /gr {grestore} bind def
  1229. /gs {gsave} bind def
  1230. /sa {save} bind def
  1231. /rs {restore} bind def
  1232. /l {lineto} bind def
  1233. /m {moveto} bind def
  1234. /rm {rmoveto} bind def
  1235. /n {newpath} bind def
  1236. /s {stroke} bind def
  1237. /sh {show} bind def
  1238. /slc {setlinecap} bind def
  1239. /slj {setlinejoin} bind def
  1240. /slw {setlinewidth} bind def
  1241. /srgb {setrgbcolor} bind def
  1242. /rot {rotate} bind def
  1243. /sc {scale} bind def
  1244. /sd {setdash} bind def
  1245. /ff {findfont} bind def
  1246. /sf {setfont} bind def
  1247. /scf {scalefont} bind def
  1248. /sw {stringwidth} bind def
  1249. /tr {translate} bind def
  1250. /tnt {dup dup currentrgbcolor
  1251.   4 -2 roll dup 1 exch sub 3 -1 roll mul add
  1252.   4 -2 roll dup 1 exch sub 3 -1 roll mul add
  1253.   4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
  1254.   bind def
  1255. /shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
  1256.   4 -2 roll mul srgb} bind def
  1257.  /DrawSplineSection {
  1258. /y3 exch def
  1259. /x3 exch def
  1260. /y2 exch def
  1261. /x2 exch def
  1262. /y1 exch def
  1263. /x1 exch def
  1264. /xa x1 x2 x1 sub 0.666667 mul add def
  1265. /ya y1 y2 y1 sub 0.666667 mul add def
  1266. /xb x3 x2 x3 sub 0.666667 mul add def
  1267. /yb y3 y2 y3 sub 0.666667 mul add def
  1268. x1 y1 lineto
  1269. xa ya xb yb x3 y3 curveto
  1270. } def
  1271. /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
  1272. /$F2psEnd {$F2psEnteredState restore end} def
  1273. $F2psBegin
  1274. 10 setmiterlimit
  1275. n 0 792 m 0 0 l 612 0 l 612 792 l cp clip
  1276.  0.06299 0.06299 sc
  1277. 7.500 slw
  1278. % Polyline
  1279. n 1215 450 m 1485 720 l gs col-1 s gr 
  1280. % Polyline
  1281. n 1485 450 m 1215 720 l gs col-1 s gr 
  1282. % Polyline
  1283. n 1215 1800 m 1485 2070 l gs col-1 s gr 
  1284. % Polyline
  1285. n 1485 1800 m 1215 2070 l gs col-1 s gr 
  1286. % Polyline
  1287. n 1215 2070 m 1485 2340 l gs col-1 s gr 
  1288. % Polyline
  1289. n 1485 2070 m 1215 2340 l gs col-1 s gr 
  1290. % Polyline
  1291. n 1215 2340 m 1485 2610 l gs col-1 s gr 
  1292. % Polyline
  1293. n 1485 2340 m 1215 2610 l gs col-1 s gr 
  1294. % Polyline
  1295. n 2430 450 m 3240 450 l gs col-1 s gr 
  1296. % Polyline
  1297. n 2430 225 m 3240 225 l 3240 720 l 2430 720 l cp gs col-1 s gr 
  1298. % Polyline
  1299. n 2970 450 m 2970 720 l gs col-1 s gr 
  1300. /Times-Roman ff 150.00 scf sf
  1301. 2520 630 m
  1302. gs 1 -1 sc (val) col-1 sh gr
  1303. /Times-Roman ff 150.00 scf sf
  1304. 2520 405 m
  1305. gs 1 -1 sc (ResTarget) col-1 sh gr
  1306. % Polyline
  1307. n 3510 450 m 4410 450 l gs col-1 s gr 
  1308. % Polyline
  1309. n 3510 720 m 4410 720 l gs col-1 s gr 
  1310. % Polyline
  1311. n 3510 225 m 4410 225 l 4410 990 l 3510 990 l cp gs col-1 s gr 
  1312. % Polyline
  1313. n 4140 450 m 4140 990 l gs col-1 s gr 
  1314. /Times-Roman ff 150.00 scf sf
  1315. 3825 405 m
  1316. gs 1 -1 sc (Attr) col-1 sh gr
  1317. /Times-Roman ff 150.00 scf sf
  1318. 3600 900 m
  1319. gs 1 -1 sc (attrs) col-1 sh gr
  1320. /Times-Roman ff 150.00 scf sf
  1321. 3600 630 m
  1322. gs 1 -1 sc (relname) col-1 sh gr
  1323. % Polyline
  1324. n 4635 720 m 5175 720 l 5175 990 l 4635 990 l cp gs col-1 s gr 
  1325. % Polyline
  1326. n 4905 720 m 4905 990 l gs col-1 s gr 
  1327. % Polyline
  1328. n 4905 720 m 5175 990 l gs col-1 s gr 
  1329. % Polyline
  1330. n 5175 720 m 4905 990 l gs col-1 s gr 
  1331. % Polyline
  1332. n 4365 1215 m 5175 1215 l 5175 1710 l 4365 1710 l cp gs col-1 s gr 
  1333. % Polyline
  1334. n 4365 1440 m 5175 1440 l gs col-1 s gr 
  1335. % Polyline
  1336. n 4905 1440 m 4905 1710 l gs col-1 s gr 
  1337. /Times-Roman ff 150.00 scf sf
  1338. 4590 1395 m
  1339. gs 1 -1 sc (Value) col-1 sh gr
  1340. /Times-Roman ff 150.00 scf sf
  1341. 4455 1620 m
  1342. gs 1 -1 sc (val.str) col-1 sh gr
  1343. % Polyline
  1344. n 2430 5265 m 3330 5265 l gs col-1 s gr 
  1345. % Polyline
  1346. n 2430 5535 m 3330 5535 l gs col-1 s gr 
  1347. % Polyline
  1348. n 2430 5040 m 3330 5040 l 3330 5805 l 2430 5805 l cp gs col-1 s gr 
  1349. % Polyline
  1350. n 3060 5265 m 3060 5805 l gs col-1 s gr 
  1351. /Times-Roman ff 150.00 scf sf
  1352. 2520 5715 m
  1353. gs 1 -1 sc (relExpr) col-1 sh gr
  1354. /Times-Roman ff 150.00 scf sf
  1355. 2520 5445 m
  1356. gs 1 -1 sc (name) col-1 sh gr
  1357. /Times-Roman ff 150.00 scf sf
  1358. 2565 5220 m
  1359. gs 1 -1 sc (RangeVar) col-1 sh gr
  1360. % Polyline
  1361. n 3600 5670 m 4500 5670 l gs col-1 s gr 
  1362. % Polyline
  1363. n 3600 5445 m 4500 5445 l 4500 5940 l 3600 5940 l cp gs col-1 s gr 
  1364. % Polyline
  1365. n 4230 5670 m 4230 5940 l gs col-1 s gr 
  1366. /Times-Roman ff 150.00 scf sf
  1367. 3690 5850 m
  1368. gs 1 -1 sc (relname) col-1 sh gr
  1369. /Times-Roman ff 150.00 scf sf
  1370. 3690 5625 m
  1371. gs 1 -1 sc (RelExpr) col-1 sh gr
  1372. % Polyline
  1373. gs  clippath
  1374. 3453 5640 m 3573 5670 l 3453 5700 l 3615 5700 l 3615 5640 l  cp clip
  1375. n 3195 5670 m 3600 5670 l gs col-1 s gr gr
  1376. % arrowhead
  1377. n 3453 5640 m 3573 5670 l 3453 5700 l 3453 5670 l 3453 5640 l  cp gs 0.00 setgray ef gr  col-1 s
  1378. % Polyline
  1379. gs  clippath
  1380. 4395 6018 m 4365 6138 l 4335 6018 l 4335 6180 l 4395 6180 l  cp clip
  1381. n 4365 5805 m 4365 6165 l gs col-1 s gr gr
  1382. % arrowhead
  1383. n 4395 6018 m 4365 6138 l 4335 6018 l 4365 6018 l 4395 6018 l  cp gs 0.00 setgray ef gr  col-1 s
  1384. % Open spline
  1385. gs  clippath
  1386. 3588 5190 m 3708 5220 l 3588 5250 l 3750 5250 l 3750 5190 l  cp clip
  1387. n 3240.0 5400.0 m 3375.0 5400.0 l
  1388. 3375.0 5400.0 3510.0 5400.0 3510.0 5310.0 DrawSplineSection
  1389. 3510.0 5310.0 3510.0 5220.0 3622.5 5220.0 DrawSplineSection
  1390. 3735.0 5220.0 l  gs col-1 s gr
  1391.  gr
  1392. % arrowhead
  1393. n 3588 5190 m 3708 5220 l 3588 5250 l 3588 5220 l 3588 5190 l  cp gs 0.00 setgray ef gr  col-1 s
  1394. /Times-Roman ff 150.00 scf sf
  1395. 3825 5265 m
  1396. gs 1 -1 sc ("se") col-1 sh gr
  1397. /Times-Roman ff 150.00 scf sf
  1398. 4185 6345 m
  1399. gs 1 -1 sc ("sells") col-1 sh gr
  1400. % Polyline
  1401. n 1935 855 m 1935 315 l 2205 315 l 2205 855 l cp gs col-1 s gr 
  1402. % Polyline
  1403. n 1935 585 m 2205 585 l gs col-1 s gr 
  1404. % Polyline
  1405. n 2205 2115 m 2205 2655 l 1935 2655 l 1935 2115 l cp gs col-1 s gr 
  1406. % Polyline
  1407. n 2205 2385 m 1935 2385 l gs col-1 s gr 
  1408. % Polyline
  1409. n 2205 2385 m 1935 2655 l gs col-1 s gr 
  1410. % Polyline
  1411. n 2205 2655 m 1935 2385 l gs col-1 s gr 
  1412. % Polyline
  1413. gs  clippath
  1414. 2283 420 m 2403 450 l 2283 480 l 2445 480 l 2445 420 l  cp clip
  1415. n 2070 450 m 2430 450 l gs col-1 s gr gr
  1416. % arrowhead
  1417. n 2283 420 m 2403 450 l 2283 480 l 2283 450 l 2283 420 l  cp gs 0.00 setgray ef gr  col-1 s
  1418. % Polyline
  1419. gs  clippath
  1420. 2283 2220 m 2403 2250 l 2283 2280 l 2445 2280 l 2445 2220 l  cp clip
  1421. n 2070 2250 m 2430 2250 l gs col-1 s gr gr
  1422. % arrowhead
  1423. n 2283 2220 m 2403 2250 l 2283 2280 l 2283 2250 l 2283 2220 l  cp gs 0.00 setgray ef gr  col-1 s
  1424. % Polyline
  1425. gs  clippath
  1426. 2100 1968 m 2070 2088 l 2040 1968 l 2040 2130 l 2100 2130 l  cp clip
  1427. n 2070 720 m 2070 2115 l gs col-1 s gr gr
  1428. % arrowhead
  1429. n 2100 1968 m 2070 2088 l 2040 1968 l 2070 1968 l 2100 1968 l  cp gs 0.00 setgray ef gr  col-1 s
  1430. % Polyline
  1431. n 1935 4455 m 1935 3915 l 2205 3915 l 2205 4455 l cp gs col-1 s gr 
  1432. % Polyline
  1433. n 1935 4185 m 2205 4185 l gs col-1 s gr 
  1434. % Polyline
  1435. n 2205 5265 m 2205 5805 l 1935 5805 l 1935 5265 l cp gs col-1 s gr 
  1436. % Polyline
  1437. n 2205 5535 m 1935 5535 l gs col-1 s gr 
  1438. % Polyline
  1439. n 2205 5535 m 1935 5805 l gs col-1 s gr 
  1440. % Polyline
  1441. n 2205 5805 m 1935 5535 l gs col-1 s gr 
  1442. % Polyline
  1443. n 2430 3915 m 3330 3915 l gs col-1 s gr 
  1444. % Polyline
  1445. n 2430 4185 m 3330 4185 l gs col-1 s gr 
  1446. % Polyline
  1447. n 2430 3690 m 3330 3690 l 3330 4455 l 2430 4455 l cp gs col-1 s gr 
  1448. % Polyline
  1449. n 3060 3915 m 3060 4455 l gs col-1 s gr 
  1450. /Times-Roman ff 150.00 scf sf
  1451. 2520 4365 m
  1452. gs 1 -1 sc (relExpr) col-1 sh gr
  1453. /Times-Roman ff 150.00 scf sf
  1454. 2520 4095 m
  1455. gs 1 -1 sc (name) col-1 sh gr
  1456. /Times-Roman ff 150.00 scf sf
  1457. 2565 3870 m
  1458. gs 1 -1 sc (RangeVar) col-1 sh gr
  1459. % Polyline
  1460. n 3600 4320 m 4500 4320 l gs col-1 s gr 
  1461. % Polyline
  1462. n 3600 4095 m 4500 4095 l 4500 4590 l 3600 4590 l cp gs col-1 s gr 
  1463. % Polyline
  1464. n 4230 4320 m 4230 4590 l gs col-1 s gr 
  1465. /Times-Roman ff 150.00 scf sf
  1466. 3690 4500 m
  1467. gs 1 -1 sc (relname) col-1 sh gr
  1468. /Times-Roman ff 150.00 scf sf
  1469. 3690 4275 m
  1470. gs 1 -1 sc (RelExpr) col-1 sh gr
  1471. % Polyline
  1472. n 2430 2250 m 3240 2250 l gs col-1 s gr 
  1473. % Polyline
  1474. n 2430 2025 m 3240 2025 l 3240 2520 l 2430 2520 l cp gs col-1 s gr 
  1475. % Polyline
  1476. n 2970 2250 m 2970 2520 l gs col-1 s gr 
  1477. /Times-Roman ff 150.00 scf sf
  1478. 2520 2430 m
  1479. gs 1 -1 sc (val) col-1 sh gr
  1480. /Times-Roman ff 150.00 scf sf
  1481. 2520 2205 m
  1482. gs 1 -1 sc (ResTarget) col-1 sh gr
  1483. % Polyline
  1484. n 3510 2250 m 4410 2250 l gs col-1 s gr 
  1485. % Polyline
  1486. n 3510 2520 m 4410 2520 l gs col-1 s gr 
  1487. % Polyline
  1488. n 3510 2025 m 4410 2025 l 4410 2790 l 3510 2790 l cp gs col-1 s gr 
  1489. % Polyline
  1490. n 4140 2250 m 4140 2790 l gs col-1 s gr 
  1491. /Times-Roman ff 150.00 scf sf
  1492. 3825 2205 m
  1493. gs 1 -1 sc (Attr) col-1 sh gr
  1494. /Times-Roman ff 150.00 scf sf
  1495. 3600 2700 m
  1496. gs 1 -1 sc (attrs) col-1 sh gr
  1497. /Times-Roman ff 150.00 scf sf
  1498. 3600 2430 m
  1499. gs 1 -1 sc (relname) col-1 sh gr
  1500. % Polyline
  1501. n 4635 2520 m 5175 2520 l 5175 2790 l 4635 2790 l cp gs col-1 s gr 
  1502. % Polyline
  1503. n 4905 2520 m 4905 2790 l gs col-1 s gr 
  1504. % Polyline
  1505. n 4905 2520 m 5175 2790 l gs col-1 s gr 
  1506. % Polyline
  1507. n 5175 2520 m 4905 2790 l gs col-1 s gr 
  1508. % Polyline
  1509. n 4365 3015 m 5175 3015 l 5175 3510 l 4365 3510 l cp gs col-1 s gr 
  1510. % Polyline
  1511. n 4365 3240 m 5175 3240 l gs col-1 s gr 
  1512. % Polyline
  1513. n 4905 3240 m 4905 3510 l gs col-1 s gr 
  1514. /Times-Roman ff 150.00 scf sf
  1515. 4590 3195 m
  1516. gs 1 -1 sc (Value) col-1 sh gr
  1517. /Times-Roman ff 150.00 scf sf
  1518. 4455 3420 m
  1519. gs 1 -1 sc (val.str) col-1 sh gr
  1520. % Polyline
  1521. n 225 450 m 1485 450 l gs col-1 s gr 
  1522. % Polyline
  1523. n 1215 990 m 1215 2610 l gs col-1 s gr 
  1524. % Polyline
  1525. n 225 720 m 1485 720 l gs col-1 s gr 
  1526. % Polyline
  1527. n 225 990 m 1485 990 l gs col-1 s gr 
  1528. % Polyline
  1529. n 225 1260 m 1485 1260 l gs col-1 s gr 
  1530. % Polyline
  1531. n 225 1530 m 1485 1530 l gs col-1 s gr 
  1532. % Polyline
  1533. n 225 1800 m 1485 1800 l gs col-1 s gr 
  1534. % Polyline
  1535. n 225 2070 m 1485 2070 l gs col-1 s gr 
  1536. % Polyline
  1537. n 225 225 m 1485 225 l 1485 2610 l 225 2610 l cp gs col-1 s gr 
  1538. % Polyline
  1539. n 225 2340 m 1485 2340 l gs col-1 s gr 
  1540. % Polyline
  1541. n 1215 450 m 1215 720 l gs col-1 s gr 
  1542. % Polyline
  1543. gs  clippath
  1544. 3363 555 m 3483 585 l 3363 615 l 3525 615 l 3525 555 l  cp clip
  1545. n 3105 585 m 3510 585 l gs col-1 s gr gr
  1546. % arrowhead
  1547. n 3363 555 m 3483 585 l 3363 615 l 3363 585 l 3363 555 l  cp gs 0.00 setgray ef gr  col-1 s
  1548. % Polyline
  1549. gs  clippath
  1550. 4488 555 m 4608 585 l 4488 615 l 4650 615 l 4650 555 l  cp clip
  1551. n 4275 585 m 4635 585 l gs col-1 s gr gr
  1552. % arrowhead
  1553. n 4488 555 m 4608 585 l 4488 615 l 4488 585 l 4488 555 l  cp gs 0.00 setgray ef gr  col-1 s
  1554. % Polyline
  1555. gs  clippath
  1556. 4488 825 m 4608 855 l 4488 885 l 4650 885 l 4650 825 l  cp clip
  1557. n 4275 855 m 4635 855 l gs col-1 s gr gr
  1558. % arrowhead
  1559. n 4488 825 m 4608 855 l 4488 885 l 4488 855 l 4488 825 l  cp gs 0.00 setgray ef gr  col-1 s
  1560. % Polyline
  1561. gs  clippath
  1562. 4800 1068 m 4770 1188 l 4740 1068 l 4740 1230 l 4800 1230 l  cp clip
  1563. n 4770 855 m 4770 1215 l gs col-1 s gr gr
  1564. % arrowhead
  1565. n 4800 1068 m 4770 1188 l 4740 1068 l 4770 1068 l 4800 1068 l  cp gs 0.00 setgray ef gr  col-1 s
  1566. % Polyline
  1567. gs  clippath
  1568. 5070 1788 m 5040 1908 l 5010 1788 l 5010 1950 l 5070 1950 l  cp clip
  1569. n 5040 1575 m 5040 1935 l gs col-1 s gr gr
  1570. % arrowhead
  1571. n 5070 1788 m 5040 1908 l 5010 1788 l 5040 1788 l 5070 1788 l  cp gs 0.00 setgray ef gr  col-1 s
  1572. % Polyline
  1573. gs  clippath
  1574. 2283 4020 m 2403 4050 l 2283 4080 l 2445 4080 l 2445 4020 l  cp clip
  1575. n 2070 4050 m 2430 4050 l gs col-1 s gr gr
  1576. % arrowhead
  1577. n 2283 4020 m 2403 4050 l 2283 4080 l 2283 4050 l 2283 4020 l  cp gs 0.00 setgray ef gr  col-1 s
  1578. % Polyline
  1579. gs  clippath
  1580. 2100 5118 m 2070 5238 l 2040 5118 l 2040 5280 l 2100 5280 l  cp clip
  1581. n 2070 4320 m 2070 5265 l gs col-1 s gr gr
  1582. % arrowhead
  1583. n 2100 5118 m 2070 5238 l 2040 5118 l 2070 5118 l 2100 5118 l  cp gs 0.00 setgray ef gr  col-1 s
  1584. % Polyline
  1585. gs  clippath
  1586. 2283 5370 m 2403 5400 l 2283 5430 l 2445 5430 l 2445 5370 l  cp clip
  1587. n 2070 5400 m 2430 5400 l gs col-1 s gr gr
  1588. % arrowhead
  1589. n 2283 5370 m 2403 5400 l 2283 5430 l 2283 5400 l 2283 5370 l  cp gs 0.00 setgray ef gr  col-1 s
  1590. % Polyline
  1591. gs  clippath
  1592. 3453 4290 m 3573 4320 l 3453 4350 l 3615 4350 l 3615 4290 l  cp clip
  1593. n 3195 4320 m 3600 4320 l gs col-1 s gr gr
  1594. % arrowhead
  1595. n 3453 4290 m 3573 4320 l 3453 4350 l 3453 4320 l 3453 4290 l  cp gs 0.00 setgray ef gr  col-1 s
  1596. % Polyline
  1597. gs  clippath
  1598. 4395 4668 m 4365 4788 l 4335 4668 l 4335 4830 l 4395 4830 l  cp clip
  1599. n 4365 4455 m 4365 4815 l gs col-1 s gr gr
  1600. % arrowhead
  1601. n 4395 4668 m 4365 4788 l 4335 4668 l 4365 4668 l 4395 4668 l  cp gs 0.00 setgray ef gr  col-1 s
  1602. % Polyline
  1603. gs  clippath
  1604. 3363 2355 m 3483 2385 l 3363 2415 l 3525 2415 l 3525 2355 l  cp clip
  1605. n 3105 2385 m 3510 2385 l gs col-1 s gr gr
  1606. % arrowhead
  1607. n 3363 2355 m 3483 2385 l 3363 2415 l 3363 2385 l 3363 2355 l  cp gs 0.00 setgray ef gr  col-1 s
  1608. % Polyline
  1609. gs  clippath
  1610. 4488 2355 m 4608 2385 l 4488 2415 l 4650 2415 l 4650 2355 l  cp clip
  1611. n 4275 2385 m 4635 2385 l gs col-1 s gr gr
  1612. % arrowhead
  1613. n 4488 2355 m 4608 2385 l 4488 2415 l 4488 2385 l 4488 2355 l  cp gs 0.00 setgray ef gr  col-1 s
  1614. % Polyline
  1615. gs  clippath
  1616. 4488 2625 m 4608 2655 l 4488 2685 l 4650 2685 l 4650 2625 l  cp clip
  1617. n 4275 2655 m 4635 2655 l gs col-1 s gr gr
  1618. % arrowhead
  1619. n 4488 2625 m 4608 2655 l 4488 2685 l 4488 2655 l 4488 2625 l  cp gs 0.00 setgray ef gr  col-1 s
  1620. % Polyline
  1621. gs  clippath
  1622. 4800 2868 m 4770 2988 l 4740 2868 l 4740 3030 l 4800 3030 l  cp clip
  1623. n 4770 2655 m 4770 3015 l gs col-1 s gr gr
  1624. % arrowhead
  1625. n 4800 2868 m 4770 2988 l 4740 2868 l 4770 2868 l 4800 2868 l  cp gs 0.00 setgray ef gr  col-1 s
  1626. % Polyline
  1627. gs  clippath
  1628. 5070 3588 m 5040 3708 l 5010 3588 l 5010 3750 l 5070 3750 l  cp clip
  1629. n 5040 3375 m 5040 3735 l gs col-1 s gr gr
  1630. % arrowhead
  1631. n 5070 3588 m 5040 3708 l 5010 3588 l 5040 3588 l 5070 3588 l  cp gs 0.00 setgray ef gr  col-1 s
  1632. % Open spline
  1633. gs  clippath
  1634. 1788 555 m 1908 585 l 1788 615 l 1950 615 l 1950 555 l  cp clip
  1635. n 1350.0 1125.0 m 1530.0 1125.0 l
  1636. 1530.0 1125.0 1710.0 1125.0 1687.5 855.0 DrawSplineSection
  1637. 1687.5 855.0 1665.0 585.0 1800.0 585.0 DrawSplineSection
  1638. 1935.0 585.0 l  gs col-1 s gr
  1639.  gr
  1640. % arrowhead
  1641. n 1788 555 m 1908 585 l 1788 615 l 1788 585 l 1788 555 l  cp gs 0.00 setgray ef gr  col-1 s
  1642. % Open spline
  1643. gs  clippath
  1644. 2100 3768 m 2070 3888 l 2040 3768 l 2040 3930 l 2100 3930 l  cp clip
  1645. n 1350.0 1395.0 m 1620.0 1395.0 l
  1646. 1620.0 1395.0 1890.0 1395.0 1845.0 2272.5 DrawSplineSection
  1647. 1845.0 2272.5 1800.0 3150.0 1935.0 3285.0 DrawSplineSection
  1648. 1935.0 3285.0 2070.0 3420.0 2070.0 3667.5 DrawSplineSection
  1649. 2070.0 3915.0 l  gs col-1 s gr
  1650.  gr
  1651. % arrowhead
  1652. n 2100 3768 m 2070 3888 l 2040 3768 l 2070 3768 l 2100 3768 l  cp gs 0.00 setgray ef gr  col-1 s
  1653. % Open spline
  1654. gs  clippath
  1655. 1155 3228 m 1125 3348 l 1095 3228 l 1095 3390 l 1155 3390 l  cp clip
  1656. n 1350.0 1665.0 m 1507.5 1665.0 l
  1657. 1507.5 1665.0 1665.0 1665.0 1665.0 2340.0 DrawSplineSection
  1658. 1665.0 2340.0 1665.0 3015.0 1395.0 3015.0 DrawSplineSection
  1659. 1395.0 3015.0 1125.0 3015.0 1125.0 3195.0 DrawSplineSection
  1660. 1125.0 3375.0 l  gs col-1 s gr
  1661.  gr
  1662. % arrowhead
  1663. n 1155 3228 m 1125 3348 l 1095 3228 l 1125 3228 l 1155 3228 l  cp gs 0.00 setgray ef gr  col-1 s
  1664. % Open spline
  1665. gs  clippath
  1666. 3543 3840 m 3663 3870 l 3543 3900 l 3705 3900 l 3705 3840 l  cp clip
  1667. n 3195.0 4050.0 m 3330.0 4050.0 l
  1668. 3330.0 4050.0 3465.0 4050.0 3465.0 3960.0 DrawSplineSection
  1669. 3465.0 3960.0 3465.0 3870.0 3577.5 3870.0 DrawSplineSection
  1670. 3690.0 3870.0 l  gs col-1 s gr
  1671.  gr
  1672. % arrowhead
  1673. n 3543 3840 m 3663 3870 l 3543 3900 l 3543 3870 l 3543 3840 l  cp gs 0.00 setgray ef gr  col-1 s
  1674. /Times-Roman ff 150.00 scf sf
  1675. 315 900 m
  1676. gs 1 -1 sc (unionall:      false) col-1 sh gr
  1677. /Times-Roman ff 150.00 scf sf
  1678. 540 405 m
  1679. gs 1 -1 sc (SelectStmt) col-1 sh gr
  1680. /Times-Roman ff 150.00 scf sf
  1681. 315 630 m
  1682. gs 1 -1 sc (unique) col-1 sh gr
  1683. /Times-Roman ff 150.00 scf sf
  1684. 315 1170 m
  1685. gs 1 -1 sc (targetList) col-1 sh gr
  1686. /Times-Roman ff 150.00 scf sf
  1687. 315 1440 m
  1688. gs 1 -1 sc (fromClause) col-1 sh gr
  1689. /Times-Roman ff 150.00 scf sf
  1690. 315 1710 m
  1691. gs 1 -1 sc (whereClause) col-1 sh gr
  1692. /Times-Roman ff 150.00 scf sf
  1693. 315 1980 m
  1694. gs 1 -1 sc (groupClause) col-1 sh gr
  1695. /Times-Roman ff 150.00 scf sf
  1696. 315 2250 m
  1697. gs 1 -1 sc (havingClause) col-1 sh gr
  1698. /Times-Roman ff 150.00 scf sf
  1699. 315 2520 m
  1700. gs 1 -1 sc (sortClause) col-1 sh gr
  1701. /Times-Roman ff 150.00 scf sf
  1702. 4815 2115 m
  1703. gs 1 -1 sc ("sname") col-1 sh gr
  1704. /Times-Roman ff 150.00 scf sf
  1705. 4725 630 m
  1706. gs 1 -1 sc ("s") col-1 sh gr
  1707. /Times-Roman ff 150.00 scf sf
  1708. 720 3600 m
  1709. gs 1 -1 sc (Operator Tree) col-1 sh gr
  1710. /Times-Roman ff 150.00 scf sf
  1711. 765 3795 m
  1712. gs 1 -1 sc (representing ) col-1 sh gr
  1713. /Times-Roman ff 150.00 scf sf
  1714. 630 3990 m
  1715. gs 1 -1 sc (the qualifications) col-1 sh gr
  1716. /Times-Roman ff 150.00 scf sf
  1717. 3780 3915 m
  1718. gs 1 -1 sc ("s") col-1 sh gr
  1719. /Times-Roman ff 150.00 scf sf
  1720. 4095 4995 m
  1721. gs 1 -1 sc ("supplier") col-1 sh gr
  1722. /Times-Roman ff 150.00 scf sf
  1723. 4725 2430 m
  1724. gs 1 -1 sc ("se") col-1 sh gr
  1725. /Times-Roman ff 150.00 scf sf
  1726. 4905 3915 m
  1727. gs 1 -1 sc ("sno") col-1 sh gr
  1728. showpage
  1729. $F2psEnd
  1730. rs
  1731. %%EndDocument
  1732.  @endspecial 561 2411 a(Figure)g(3.2:)j Fp(T)-5 b(ar)n(getList)12
  1733. b Ft(and)h Fp(F)m(r)n(omList)g Ft(for)e(query)h(of)g(e)o(xample)h(3.1)
  1734. 270 2651 y Fh(3.3.2)59 b(T)l(ransf)o(ormation)13 b(Pr)o(ocess)270
  1735. 2745 y Ft(The)18 b Fp(tr)o(ansformation)f(pr)n(ocess)i
  1736. Ft(takes)e(the)g Fp(tr)n(ee)h Ft(handed)f(back)g(by)h(the)f
  1737. Fp(parser)h Ft(as)f(input)g(and)g(steps)270 2804 y(recursi)o(v)o(ely)g
  1738. (through)f(it.)31 b(If)17 b(a)h Fr(SelectStmt)e Ft(node)i(is)g(found,)g
  1739. (it)f(is)h(transformed)f(to)g(a)h Fr(Query)270 2864 y
  1740. Ft(node)g(which)g(will)g(be)g(the)h(top)f(most)g(node)g(of)g(the)g(ne)o
  1741. (w)g(data)h(structure.)32 b(Figure)18 b(3.4)g(sho)o(ws)h(the)270
  1742. 2924 y(transformed)12 b(data)h(structure)f((the)g(part)h(for)f(the)g
  1743. (transformed)g Fp(wher)n(e)i(clause)f Ft(is)g(gi)o(v)o(en)g(in)g
  1744. (02gure)f(3.5)270 2984 y(because)h(there)f(was)h(not)f(enough)g
  1745. (space)h(to)f(sho)o(w)g(all)h(parts)f(in)g(one)h(02gure).)345
  1746. 3044 y(No)o(w)i(a)i(check)f(is)g(made,)i(if)d(the)h Fp(r)n(elation)g
  1747. (names)g Ft(in)g(the)g Fp(fr)n(omClause)h Ft(are)e(kno)o(wn)h(to)g(the)
  1748. g(sys-)270 3103 y(tem.)21 b(F)o(or)14 b(e)o(v)o(ery)f
  1749. Fp(r)n(elation)h(name)h Ft(that)e(is)i(present)f(in)g(the)g
  1750. Fp(system)h(catalogs)f Ft(a)g Fr(RTE)g Ft(node)g(is)g(created)270
  1751. 3163 y(containing)e(the)g Fp(r)n(elation)g(name)p Ft(,)h(the)f
  1752. Fp(alias)g(name)g Ft(and)h(the)f Fp(r)n(elation)g(id)p
  1753. Ft(.)k(From)11 b(no)o(w)h(on)g(the)g Fp(r)n(elation)270
  1754. 3223 y(ids)h Ft(are)g(used)h(to)f(refer)f(to)h(the)g
  1755. Fp(r)n(elations)g Ft(gi)o(v)o(en)g(in)g(the)g(query)m(.)k(All)c
  1756. Fr(RTE)g Ft(nodes)g(are)g(collected)g(in)g(the)270 3283
  1757. y Fp(r)o(ange)k(table)f(entry)h(list)g Ft(which)g(is)g(connected)g(to)f
  1758. (the)h(02eld)f Fr(rtable)h Ft(of)f(the)h Fr(Query)f
  1759. Ft(node.)29 b(If)16 b(a)270 3342 y(name)d(of)f(a)i Fp(r)n(elation)f
  1760. Ft(that)f(is)i(not)e(kno)o(wn)h(to)g(the)g(system)g(is)g(detected)g(in)
  1761. g(the)g(query)f(an)i(error)d(will)i(be)270 3402 y(returned)e(and)i(the)
  1762. f Fp(query)h(pr)n(ocessing)g Ft(will)f(be)h(aborted.)p
  1763. eop
  1764. %%Page: 55 55
  1765. 55 54 bop 198 60 a Fm(3.3.)29 b(THE)13 b(P)-5 b(ARSER)13
  1766. b(ST)-5 b(A)n(GE)1189 b Ft(55)276 2863 y @beginspecial
  1767. 141 @llx 165 @lly 470 @urx 627 @ury 3290 @rwi @setspecial
  1768. %%BeginDocument: figures/where_clause.ps
  1769. %Magnification: 1.05
  1770. /$F2psDict 200 dict def
  1771. $F2psDict begin
  1772. $F2psDict /mtrx matrix put
  1773. /col-1 {0 setgray} bind def
  1774. /col0 {0.000 0.000 0.000 srgb} bind def
  1775. /col1 {0.000 0.000 1.000 srgb} bind def
  1776. /col2 {0.000 1.000 0.000 srgb} bind def
  1777. /col3 {0.000 1.000 1.000 srgb} bind def
  1778. /col4 {1.000 0.000 0.000 srgb} bind def
  1779. /col5 {1.000 0.000 1.000 srgb} bind def
  1780. /col6 {1.000 1.000 0.000 srgb} bind def
  1781. /col7 {1.000 1.000 1.000 srgb} bind def
  1782. /col8 {0.000 0.000 0.560 srgb} bind def
  1783. /col9 {0.000 0.000 0.690 srgb} bind def
  1784. /col10 {0.000 0.000 0.820 srgb} bind def
  1785. /col11 {0.530 0.810 1.000 srgb} bind def
  1786. /col12 {0.000 0.560 0.000 srgb} bind def
  1787. /col13 {0.000 0.690 0.000 srgb} bind def
  1788. /col14 {0.000 0.820 0.000 srgb} bind def
  1789. /col15 {0.000 0.560 0.560 srgb} bind def
  1790. /col16 {0.000 0.690 0.690 srgb} bind def
  1791. /col17 {0.000 0.820 0.820 srgb} bind def
  1792. /col18 {0.560 0.000 0.000 srgb} bind def
  1793. /col19 {0.690 0.000 0.000 srgb} bind def
  1794. /col20 {0.820 0.000 0.000 srgb} bind def
  1795. /col21 {0.560 0.000 0.560 srgb} bind def
  1796. /col22 {0.690 0.000 0.690 srgb} bind def
  1797. /col23 {0.820 0.000 0.820 srgb} bind def
  1798. /col24 {0.500 0.190 0.000 srgb} bind def
  1799. /col25 {0.630 0.250 0.000 srgb} bind def
  1800. /col26 {0.750 0.380 0.000 srgb} bind def
  1801. /col27 {1.000 0.500 0.500 srgb} bind def
  1802. /col28 {1.000 0.630 0.630 srgb} bind def
  1803. /col29 {1.000 0.750 0.750 srgb} bind def
  1804. /col30 {1.000 0.880 0.880 srgb} bind def
  1805. /col31 {1.000 0.840 0.000 srgb} bind def
  1806. end
  1807. save
  1808. 128.5 640.0 translate
  1809. 1 -1 scale
  1810. /cp {closepath} bind def
  1811. /ef {eofill} bind def
  1812. /gr {grestore} bind def
  1813. /gs {gsave} bind def
  1814. /sa {save} bind def
  1815. /rs {restore} bind def
  1816. /l {lineto} bind def
  1817. /m {moveto} bind def
  1818. /rm {rmoveto} bind def
  1819. /n {newpath} bind def
  1820. /s {stroke} bind def
  1821. /sh {show} bind def
  1822. /slc {setlinecap} bind def
  1823. /slj {setlinejoin} bind def
  1824. /slw {setlinewidth} bind def
  1825. /srgb {setrgbcolor} bind def
  1826. /rot {rotate} bind def
  1827. /sc {scale} bind def
  1828. /sd {setdash} bind def
  1829. /ff {findfont} bind def
  1830. /sf {setfont} bind def
  1831. /scf {scalefont} bind def
  1832. /sw {stringwidth} bind def
  1833. /tr {translate} bind def
  1834. /tnt {dup dup currentrgbcolor
  1835.   4 -2 roll dup 1 exch sub 3 -1 roll mul add
  1836.   4 -2 roll dup 1 exch sub 3 -1 roll mul add
  1837.   4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
  1838.   bind def
  1839. /shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
  1840.   4 -2 roll mul srgb} bind def
  1841.  /DrawSplineSection {
  1842. /y3 exch def
  1843. /x3 exch def
  1844. /y2 exch def
  1845. /x2 exch def
  1846. /y1 exch def
  1847. /x1 exch def
  1848. /xa x1 x2 x1 sub 0.666667 mul add def
  1849. /ya y1 y2 y1 sub 0.666667 mul add def
  1850. /xb x3 x2 x3 sub 0.666667 mul add def
  1851. /yb y3 y2 y3 sub 0.666667 mul add def
  1852. x1 y1 lineto
  1853. xa ya xb yb x3 y3 curveto
  1854. } def
  1855. /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
  1856. /$F2psEnd {$F2psEnteredState restore end} def
  1857. $F2psBegin
  1858. 10 setmiterlimit
  1859. n 0 792 m 0 0 l 612 0 l 612 792 l cp clip
  1860.  0.06299 0.06299 sc
  1861. 7.500 slw
  1862. % Polyline
  1863. n 1215 450 m 1485 720 l gs col-1 s gr 
  1864. % Polyline
  1865. n 1485 450 m 1215 720 l gs col-1 s gr 
  1866. % Polyline
  1867. n 1215 1800 m 1485 2070 l gs col-1 s gr 
  1868. % Polyline
  1869. n 1485 1800 m 1215 2070 l gs col-1 s gr 
  1870. % Polyline
  1871. n 1215 2070 m 1485 2340 l gs col-1 s gr 
  1872. % Polyline
  1873. n 1485 2070 m 1215 2340 l gs col-1 s gr 
  1874. % Polyline
  1875. n 1215 2340 m 1485 2610 l gs col-1 s gr 
  1876. % Polyline
  1877. n 1485 2340 m 1215 2610 l gs col-1 s gr 
  1878. % Polyline
  1879. n 2790 1260 m 1800 1260 l gs col-1 s gr 
  1880. % Polyline
  1881. n 1800 1530 m 2790 1530 l gs col-1 s gr 
  1882. % Polyline
  1883. n 1800 1800 m 2790 1800 l gs col-1 s gr 
  1884. % Polyline
  1885. n 1800 2070 m 2790 2070 l gs col-1 s gr 
  1886. % Polyline
  1887. n 1800 1035 m 2790 1035 l 2790 2340 l 1800 2340 l cp gs col-1 s gr 
  1888. % Polyline
  1889. n 2520 1800 m 2520 2340 l gs col-1 s gr 
  1890. % Polyline
  1891. n 2520 1260 m 2520 1530 l gs col-1 s gr 
  1892. /Times-Roman ff 150.00 scf sf
  1893. 2070 1215 m
  1894. gs 1 -1 sc (A_Expr) col-1 sh gr
  1895. /Times-Roman ff 150.00 scf sf
  1896. 1890 1710 m
  1897. gs 1 -1 sc (oper) col-1 sh gr
  1898. /Times-Roman ff 150.00 scf sf
  1899. 1890 1440 m
  1900. gs 1 -1 sc (opname) col-1 sh gr
  1901. /Times-Roman ff 150.00 scf sf
  1902. 1890 1980 m
  1903. gs 1 -1 sc (rexpr) col-1 sh gr
  1904. /Times-Roman ff 150.00 scf sf
  1905. 1890 2250 m
  1906. gs 1 -1 sc (lexpr) col-1 sh gr
  1907. % Polyline
  1908. n 2520 1260 m 2790 1530 l gs col-1 s gr 
  1909. % Polyline
  1910. n 2790 1260 m 2520 1530 l gs col-1 s gr 
  1911. /Times-Roman ff 150.00 scf sf
  1912. 2385 1710 m
  1913. gs 1 -1 sc (AND) col-1 sh gr
  1914. % Polyline
  1915. n 1350 6120 m 1890 6120 l 1890 6390 l 1350 6390 l cp gs col-1 s gr 
  1916. % Polyline
  1917. n 1620 6120 m 1620 6390 l gs col-1 s gr 
  1918. % Polyline
  1919. n 1620 6120 m 1890 6390 l gs col-1 s gr 
  1920. % Polyline
  1921. n 1890 6120 m 1620 6390 l gs col-1 s gr 
  1922. % Polyline
  1923. n 1080 6615 m 1890 6615 l 1890 7110 l 1080 7110 l cp gs col-1 s gr 
  1924. % Polyline
  1925. n 1080 6840 m 1890 6840 l gs col-1 s gr 
  1926. % Polyline
  1927. n 1620 6840 m 1620 7110 l gs col-1 s gr 
  1928. /Times-Roman ff 150.00 scf sf
  1929. 1305 6795 m
  1930. gs 1 -1 sc (Value) col-1 sh gr
  1931. /Times-Roman ff 150.00 scf sf
  1932. 1170 7020 m
  1933. gs 1 -1 sc (val.str) col-1 sh gr
  1934. % Polyline
  1935. n 225 5850 m 1125 5850 l gs col-1 s gr 
  1936. % Polyline
  1937. n 225 6120 m 1125 6120 l gs col-1 s gr 
  1938. % Polyline
  1939. n 225 5625 m 1125 5625 l 1125 6390 l 225 6390 l cp gs col-1 s gr 
  1940. % Polyline
  1941. n 855 5850 m 855 6390 l gs col-1 s gr 
  1942. /Times-Roman ff 150.00 scf sf
  1943. 540 5805 m
  1944. gs 1 -1 sc (Attr) col-1 sh gr
  1945. /Times-Roman ff 150.00 scf sf
  1946. 315 6300 m
  1947. gs 1 -1 sc (attrs) col-1 sh gr
  1948. /Times-Roman ff 150.00 scf sf
  1949. 315 6030 m
  1950. gs 1 -1 sc (relname) col-1 sh gr
  1951. % Polyline
  1952. gs  clippath
  1953. 1785 7188 m 1755 7308 l 1725 7188 l 1725 7350 l 1785 7350 l  cp clip
  1954. n 1755 6975 m 1755 7335 l gs col-1 s gr gr
  1955. % arrowhead
  1956. n 1785 7188 m 1755 7308 l 1725 7188 l 1755 7188 l 1785 7188 l  cp gs 0.00 setgray ef gr  col-1 s
  1957. % Polyline
  1958. gs  clippath
  1959. 1203 5955 m 1323 5985 l 1203 6015 l 1365 6015 l 1365 5955 l  cp clip
  1960. n 990 5985 m 1350 5985 l gs col-1 s gr gr
  1961. % arrowhead
  1962. n 1203 5955 m 1323 5985 l 1203 6015 l 1203 5985 l 1203 5955 l  cp gs 0.00 setgray ef gr  col-1 s
  1963. % Polyline
  1964. gs  clippath
  1965. 1203 6225 m 1323 6255 l 1203 6285 l 1365 6285 l 1365 6225 l  cp clip
  1966. n 990 6255 m 1350 6255 l gs col-1 s gr gr
  1967. % arrowhead
  1968. n 1203 6225 m 1323 6255 l 1203 6285 l 1203 6255 l 1203 6225 l  cp gs 0.00 setgray ef gr  col-1 s
  1969. % Polyline
  1970. gs  clippath
  1971. 1515 6468 m 1485 6588 l 1455 6468 l 1455 6630 l 1515 6630 l  cp clip
  1972. n 1485 6255 m 1485 6615 l gs col-1 s gr gr
  1973. % arrowhead
  1974. n 1515 6468 m 1485 6588 l 1455 6468 l 1485 6468 l 1515 6468 l  cp gs 0.00 setgray ef gr  col-1 s
  1975. /Times-Roman ff 150.00 scf sf
  1976. 1620 7515 m
  1977. gs 1 -1 sc ("sno") col-1 sh gr
  1978. /Times-Roman ff 150.00 scf sf
  1979. 1440 6030 m
  1980. gs 1 -1 sc ("s") col-1 sh gr
  1981. % Polyline
  1982. n 1350 5130 m 2340 5130 l gs col-1 s gr 
  1983. % Polyline
  1984. n 1350 4905 m 2340 4905 l 2340 5400 l 1350 5400 l cp gs col-1 s gr 
  1985. /Times-Roman ff 150.00 scf sf
  1986. 1440 5310 m
  1987. gs 1 -1 sc (val.val.ival:  2) col-1 sh gr
  1988. /Times-Roman ff 150.00 scf sf
  1989. 1575 5085 m
  1990. gs 1 -1 sc (A_Const) col-1 sh gr
  1991. % Polyline
  1992. n 2475 5850 m 3375 5850 l gs col-1 s gr 
  1993. % Polyline
  1994. n 2475 6120 m 3375 6120 l gs col-1 s gr 
  1995. % Polyline
  1996. n 2475 5625 m 3375 5625 l 3375 6390 l 2475 6390 l cp gs col-1 s gr 
  1997. % Polyline
  1998. n 3105 5850 m 3105 6390 l gs col-1 s gr 
  1999. /Times-Roman ff 150.00 scf sf
  2000. 2790 5805 m
  2001. gs 1 -1 sc (Attr) col-1 sh gr
  2002. /Times-Roman ff 150.00 scf sf
  2003. 2565 6300 m
  2004. gs 1 -1 sc (attrs) col-1 sh gr
  2005. /Times-Roman ff 150.00 scf sf
  2006. 2565 6030 m
  2007. gs 1 -1 sc (relname) col-1 sh gr
  2008. % Polyline
  2009. n 3600 6120 m 4140 6120 l 4140 6390 l 3600 6390 l cp gs col-1 s gr 
  2010. % Polyline
  2011. n 3870 6120 m 3870 6390 l gs col-1 s gr 
  2012. % Polyline
  2013. n 3870 6120 m 4140 6390 l gs col-1 s gr 
  2014. % Polyline
  2015. n 4140 6120 m 3870 6390 l gs col-1 s gr 
  2016. % Polyline
  2017. n 3330 6615 m 4140 6615 l 4140 7110 l 3330 7110 l cp gs col-1 s gr 
  2018. % Polyline
  2019. n 3330 6840 m 4140 6840 l gs col-1 s gr 
  2020. % Polyline
  2021. n 3870 6840 m 3870 7110 l gs col-1 s gr 
  2022. /Times-Roman ff 150.00 scf sf
  2023. 3555 6795 m
  2024. gs 1 -1 sc (Value) col-1 sh gr
  2025. /Times-Roman ff 150.00 scf sf
  2026. 3420 7020 m
  2027. gs 1 -1 sc (val.str) col-1 sh gr
  2028. % Polyline
  2029. gs  clippath
  2030. 3453 5955 m 3573 5985 l 3453 6015 l 3615 6015 l 3615 5955 l  cp clip
  2031. n 3240 5985 m 3600 5985 l gs col-1 s gr gr
  2032. % arrowhead
  2033. n 3453 5955 m 3573 5985 l 3453 6015 l 3453 5985 l 3453 5955 l  cp gs 0.00 setgray ef gr  col-1 s
  2034. % Polyline
  2035. gs  clippath
  2036. 3453 6225 m 3573 6255 l 3453 6285 l 3615 6285 l 3615 6225 l  cp clip
  2037. n 3240 6255 m 3600 6255 l gs col-1 s gr gr
  2038. % arrowhead
  2039. n 3453 6225 m 3573 6255 l 3453 6285 l 3453 6255 l 3453 6225 l  cp gs 0.00 setgray ef gr  col-1 s
  2040. % Polyline
  2041. gs  clippath
  2042. 3765 6468 m 3735 6588 l 3705 6468 l 3705 6630 l 3765 6630 l  cp clip
  2043. n 3735 6255 m 3735 6615 l gs col-1 s gr gr
  2044. % arrowhead
  2045. n 3765 6468 m 3735 6588 l 3705 6468 l 3735 6468 l 3765 6468 l  cp gs 0.00 setgray ef gr  col-1 s
  2046. % Polyline
  2047. gs  clippath
  2048. 4035 7188 m 4005 7308 l 3975 7188 l 3975 7350 l 4035 7350 l  cp clip
  2049. n 4005 6975 m 4005 7335 l gs col-1 s gr gr
  2050. % arrowhead
  2051. n 4035 7188 m 4005 7308 l 3975 7188 l 4005 7188 l 4035 7188 l  cp gs 0.00 setgray ef gr  col-1 s
  2052. /Times-Roman ff 150.00 scf sf
  2053. 3690 6030 m
  2054. gs 1 -1 sc ("s") col-1 sh gr
  2055. /Times-Roman ff 150.00 scf sf
  2056. 3870 7515 m
  2057. gs 1 -1 sc ("sno") col-1 sh gr
  2058. % Polyline
  2059. n 3690 5130 m 4590 5130 l gs col-1 s gr 
  2060. % Polyline
  2061. n 3690 5400 m 4590 5400 l gs col-1 s gr 
  2062. % Polyline
  2063. n 3690 4905 m 4590 4905 l 4590 5670 l 3690 5670 l cp gs col-1 s gr 
  2064. % Polyline
  2065. n 4320 5130 m 4320 5670 l gs col-1 s gr 
  2066. /Times-Roman ff 150.00 scf sf
  2067. 4005 5085 m
  2068. gs 1 -1 sc (Attr) col-1 sh gr
  2069. /Times-Roman ff 150.00 scf sf
  2070. 3780 5580 m
  2071. gs 1 -1 sc (attrs) col-1 sh gr
  2072. /Times-Roman ff 150.00 scf sf
  2073. 3780 5310 m
  2074. gs 1 -1 sc (relname) col-1 sh gr
  2075. % Polyline
  2076. n 4815 5400 m 5355 5400 l 5355 5670 l 4815 5670 l cp gs col-1 s gr 
  2077. % Polyline
  2078. n 5085 5400 m 5085 5670 l gs col-1 s gr 
  2079. % Polyline
  2080. n 5085 5400 m 5355 5670 l gs col-1 s gr 
  2081. % Polyline
  2082. n 5355 5400 m 5085 5670 l gs col-1 s gr 
  2083. % Polyline
  2084. n 4545 5895 m 5355 5895 l 5355 6390 l 4545 6390 l cp gs col-1 s gr 
  2085. % Polyline
  2086. n 4545 6120 m 5355 6120 l gs col-1 s gr 
  2087. % Polyline
  2088. n 5085 6120 m 5085 6390 l gs col-1 s gr 
  2089. /Times-Roman ff 150.00 scf sf
  2090. 4770 6075 m
  2091. gs 1 -1 sc (Value) col-1 sh gr
  2092. /Times-Roman ff 150.00 scf sf
  2093. 4635 6300 m
  2094. gs 1 -1 sc (val.str) col-1 sh gr
  2095. % Polyline
  2096. gs  clippath
  2097. 4668 5235 m 4788 5265 l 4668 5295 l 4830 5295 l 4830 5235 l  cp clip
  2098. n 4455 5265 m 4815 5265 l gs col-1 s gr gr
  2099. % arrowhead
  2100. n 4668 5235 m 4788 5265 l 4668 5295 l 4668 5265 l 4668 5235 l  cp gs 0.00 setgray ef gr  col-1 s
  2101. % Polyline
  2102. gs  clippath
  2103. 4668 5505 m 4788 5535 l 4668 5565 l 4830 5565 l 4830 5505 l  cp clip
  2104. n 4455 5535 m 4815 5535 l gs col-1 s gr gr
  2105. % arrowhead
  2106. n 4668 5505 m 4788 5535 l 4668 5565 l 4668 5535 l 4668 5505 l  cp gs 0.00 setgray ef gr  col-1 s
  2107. % Polyline
  2108. gs  clippath
  2109. 4980 5748 m 4950 5868 l 4920 5748 l 4920 5910 l 4980 5910 l  cp clip
  2110. n 4950 5535 m 4950 5895 l gs col-1 s gr gr
  2111. % arrowhead
  2112. n 4980 5748 m 4950 5868 l 4920 5748 l 4950 5748 l 4980 5748 l  cp gs 0.00 setgray ef gr  col-1 s
  2113. % Polyline
  2114. gs  clippath
  2115. 5250 6468 m 5220 6588 l 5190 6468 l 5190 6630 l 5250 6630 l  cp clip
  2116. n 5220 6255 m 5220 6615 l gs col-1 s gr gr
  2117. % arrowhead
  2118. n 5250 6468 m 5220 6588 l 5190 6468 l 5220 6468 l 5250 6468 l  cp gs 0.00 setgray ef gr  col-1 s
  2119. /Times-Roman ff 150.00 scf sf
  2120. 4905 5310 m
  2121. gs 1 -1 sc ("se") col-1 sh gr
  2122. /Times-Roman ff 150.00 scf sf
  2123. 5085 6795 m
  2124. gs 1 -1 sc ("sno") col-1 sh gr
  2125. % Polyline
  2126. n 3465 3375 m 2475 3375 l gs col-1 s gr 
  2127. % Polyline
  2128. n 2475 3645 m 3465 3645 l gs col-1 s gr 
  2129. % Polyline
  2130. n 2475 3915 m 3465 3915 l gs col-1 s gr 
  2131. % Polyline
  2132. n 2475 4185 m 3465 4185 l gs col-1 s gr 
  2133. % Polyline
  2134. n 2475 3150 m 3465 3150 l 3465 4455 l 2475 4455 l cp gs col-1 s gr 
  2135. % Polyline
  2136. n 3195 3915 m 3195 4455 l gs col-1 s gr 
  2137. % Polyline
  2138. n 3195 3375 m 3195 3645 l gs col-1 s gr 
  2139. /Times-Roman ff 150.00 scf sf
  2140. 2745 3330 m
  2141. gs 1 -1 sc (A_Expr) col-1 sh gr
  2142. /Times-Roman ff 150.00 scf sf
  2143. 2565 3825 m
  2144. gs 1 -1 sc (oper) col-1 sh gr
  2145. /Times-Roman ff 150.00 scf sf
  2146. 2565 3555 m
  2147. gs 1 -1 sc (opname) col-1 sh gr
  2148. /Times-Roman ff 150.00 scf sf
  2149. 2565 4095 m
  2150. gs 1 -1 sc (rexpr) col-1 sh gr
  2151. /Times-Roman ff 150.00 scf sf
  2152. 2565 4365 m
  2153. gs 1 -1 sc (lexpr) col-1 sh gr
  2154. % Polyline
  2155. n 225 450 m 1485 450 l gs col-1 s gr 
  2156. % Polyline
  2157. n 1215 990 m 1215 2610 l gs col-1 s gr 
  2158. % Polyline
  2159. n 225 720 m 1485 720 l gs col-1 s gr 
  2160. % Polyline
  2161. n 225 990 m 1485 990 l gs col-1 s gr 
  2162. % Polyline
  2163. n 225 1260 m 1485 1260 l gs col-1 s gr 
  2164. % Polyline
  2165. n 225 1530 m 1485 1530 l gs col-1 s gr 
  2166. % Polyline
  2167. n 225 1800 m 1485 1800 l gs col-1 s gr 
  2168. % Polyline
  2169. n 225 2070 m 1485 2070 l gs col-1 s gr 
  2170. % Polyline
  2171. n 225 225 m 1485 225 l 1485 2610 l 225 2610 l cp gs col-1 s gr 
  2172. % Polyline
  2173. n 225 2340 m 1485 2340 l gs col-1 s gr 
  2174. % Polyline
  2175. n 1215 450 m 1215 720 l gs col-1 s gr 
  2176. % Polyline
  2177. gs  clippath
  2178. 1653 1635 m 1773 1665 l 1653 1695 l 1815 1695 l 1815 1635 l  cp clip
  2179. n 1350 1665 m 1800 1665 l gs col-1 s gr gr
  2180. % arrowhead
  2181. n 1653 1635 m 1773 1665 l 1653 1695 l 1653 1665 l 1653 1635 l  cp gs 0.00 setgray ef gr  col-1 s
  2182. % Polyline
  2183. gs  clippath
  2184. 1293 3480 m 1413 3510 l 1293 3540 l 1455 3540 l 1455 3480 l  cp clip
  2185. n 1080 3510 m 1440 3510 l gs col-1 s gr gr
  2186. % arrowhead
  2187. n 1293 3480 m 1413 3510 l 1293 3540 l 1293 3510 l 1293 3480 l  cp gs 0.00 setgray ef gr  col-1 s
  2188. % Polyline
  2189. n 1215 3375 m 225 3375 l gs col-1 s gr 
  2190. % Polyline
  2191. n 225 3645 m 1215 3645 l gs col-1 s gr 
  2192. % Polyline
  2193. n 225 3915 m 1215 3915 l gs col-1 s gr 
  2194. % Polyline
  2195. n 225 4185 m 1215 4185 l gs col-1 s gr 
  2196. % Polyline
  2197. n 225 3150 m 1215 3150 l 1215 4455 l 225 4455 l cp gs col-1 s gr 
  2198. % Polyline
  2199. n 945 3915 m 945 4455 l gs col-1 s gr 
  2200. % Polyline
  2201. n 945 3375 m 945 3645 l gs col-1 s gr 
  2202. % Polyline
  2203. gs  clippath
  2204. 3543 3480 m 3663 3510 l 3543 3540 l 3705 3540 l 3705 3480 l  cp clip
  2205. n 3330 3510 m 3690 3510 l gs col-1 s gr gr
  2206. % arrowhead
  2207. n 3543 3480 m 3663 3510 l 3543 3540 l 3543 3510 l 3543 3480 l  cp gs 0.00 setgray ef gr  col-1 s
  2208. % Open spline
  2209. gs  clippath
  2210. 705 5478 m 675 5598 l 645 5478 l 645 5640 l 705 5640 l  cp clip
  2211. n 1080.0 4320.0 m 1237.5 4320.0 l
  2212. 1237.5 4320.0 1395.0 4320.0 1395.0 4522.5 DrawSplineSection
  2213. 1395.0 4522.5 1395.0 4725.0 1035.0 4725.0 DrawSplineSection
  2214. 1035.0 4725.0 675.0 4725.0 675.0 5175.0 DrawSplineSection
  2215. 675.0 5625.0 l  gs col-1 s gr
  2216.  gr
  2217. % arrowhead
  2218. n 705 5478 m 675 5598 l 645 5478 l 675 5478 l 705 5478 l  cp gs 0.00 setgray ef gr  col-1 s
  2219. % Open spline
  2220. gs  clippath
  2221. 1875 4758 m 1845 4878 l 1815 4758 l 1815 4920 l 1875 4920 l  cp clip
  2222. n 1080.0 4050.0 m 1282.5 4050.0 l
  2223. 1282.5 4050.0 1485.0 4050.0 1665.0 4095.0 DrawSplineSection
  2224. 1665.0 4095.0 1845.0 4140.0 1845.0 4522.5 DrawSplineSection
  2225. 1845.0 4905.0 l  gs col-1 s gr
  2226.  gr
  2227. % arrowhead
  2228. n 1875 4758 m 1845 4878 l 1815 4758 l 1845 4758 l 1875 4758 l  cp gs 0.00 setgray ef gr  col-1 s
  2229. % Open spline
  2230. gs  clippath
  2231. 823 3041 m 734 3127 l 772 3009 l 687 3147 l 737 3179 l  cp clip
  2232. n 2655.0 2205.0 m 2835.0 2205.0 l
  2233. 2835.0 2205.0 3015.0 2205.0 3015.0 2452.5 DrawSplineSection
  2234. 3015.0 2452.5 3015.0 2700.0 1980.0 2745.0 DrawSplineSection
  2235. 1980.0 2745.0 945.0 2790.0 832.5 2970.0 DrawSplineSection
  2236. 720.0 3150.0 l  gs col-1 s gr
  2237.  gr
  2238. % arrowhead
  2239. n 823 3041 m 734 3127 l 772 3009 l 798 3025 l 823 3041 l  cp gs 0.00 setgray ef gr  col-1 s
  2240. % Open spline
  2241. gs  clippath
  2242. 2955 5478 m 2925 5598 l 2895 5478 l 2895 5640 l 2955 5640 l  cp clip
  2243. n 3330.0 4320.0 m 3487.5 4320.0 l
  2244. 3487.5 4320.0 3645.0 4320.0 3645.0 4522.5 DrawSplineSection
  2245. 3645.0 4522.5 3645.0 4725.0 3285.0 4725.0 DrawSplineSection
  2246. 3285.0 4725.0 2925.0 4725.0 2925.0 5175.0 DrawSplineSection
  2247. 2925.0 5625.0 l  gs col-1 s gr
  2248.  gr
  2249. % arrowhead
  2250. n 2955 5478 m 2925 5598 l 2895 5478 l 2925 5478 l 2955 5478 l  cp gs 0.00 setgray ef gr  col-1 s
  2251. % Open spline
  2252. gs  clippath
  2253. 4170 4758 m 4140 4878 l 4110 4758 l 4110 4920 l 4170 4920 l  cp clip
  2254. n 3330.0 4050.0 m 3577.5 4050.0 l
  2255. 3577.5 4050.0 3825.0 4050.0 3982.5 4162.5 DrawSplineSection
  2256. 3982.5 4162.5 4140.0 4275.0 4140.0 4590.0 DrawSplineSection
  2257. 4140.0 4905.0 l  gs col-1 s gr
  2258.  gr
  2259. % arrowhead
  2260. n 4170 4758 m 4140 4878 l 4110 4758 l 4140 4758 l 4170 4758 l  cp gs 0.00 setgray ef gr  col-1 s
  2261. % Open spline
  2262. gs  clippath
  2263. 3000 3003 m 2970 3123 l 2940 3003 l 2940 3165 l 3000 3165 l  cp clip
  2264. n 2655.0 1935.0 m 3015.0 1935.0 l
  2265. 3015.0 1935.0 3375.0 1935.0 3375.0 2272.5 DrawSplineSection
  2266. 3375.0 2272.5 3375.0 2610.0 3172.5 2700.0 DrawSplineSection
  2267. 3172.5 2700.0 2970.0 2790.0 2970.0 2970.0 DrawSplineSection
  2268. 2970.0 3150.0 l  gs col-1 s gr
  2269.  gr
  2270. % arrowhead
  2271. n 3000 3003 m 2970 3123 l 2940 3003 l 2970 3003 l 3000 3003 l  cp gs 0.00 setgray ef gr  col-1 s
  2272. % Open spline
  2273. gs  clippath
  2274. 1833 375 m 1953 405 l 1833 435 l 1995 435 l 1995 375 l  cp clip
  2275. n 1350.0 1125.0 m 1485.0 1125.0 l
  2276. 1485.0 1125.0 1620.0 1125.0 1597.5 765.0 DrawSplineSection
  2277. 1597.5 765.0 1575.0 405.0 1777.5 405.0 DrawSplineSection
  2278. 1980.0 405.0 l  gs col-1 s gr
  2279.  gr
  2280. % arrowhead
  2281. n 1833 375 m 1953 405 l 1833 435 l 1833 405 l 1833 375 l  cp gs 0.00 setgray ef gr  col-1 s
  2282. % Open spline
  2283. gs  clippath
  2284. 1833 735 m 1953 765 l 1833 795 l 1995 795 l 1995 735 l  cp clip
  2285. n 1350.0 1395.0 m 1530.0 1395.0 l
  2286. 1530.0 1395.0 1710.0 1395.0 1687.5 1080.0 DrawSplineSection
  2287. 1687.5 1080.0 1665.0 765.0 1822.5 765.0 DrawSplineSection
  2288. 1980.0 765.0 l  gs col-1 s gr
  2289.  gr
  2290. % arrowhead
  2291. n 1833 735 m 1953 765 l 1833 795 l 1833 765 l 1833 735 l  cp gs 0.00 setgray ef gr  col-1 s
  2292. /Times-Roman ff 150.00 scf sf
  2293. 315 900 m
  2294. gs 1 -1 sc (unionall:      false) col-1 sh gr
  2295. /Times-Roman ff 150.00 scf sf
  2296. 540 405 m
  2297. gs 1 -1 sc (SelectStmt) col-1 sh gr
  2298. /Times-Roman ff 150.00 scf sf
  2299. 315 630 m
  2300. gs 1 -1 sc (unique) col-1 sh gr
  2301. /Times-Roman ff 150.00 scf sf
  2302. 315 1170 m
  2303. gs 1 -1 sc (targetList) col-1 sh gr
  2304. /Times-Roman ff 150.00 scf sf
  2305. 315 1440 m
  2306. gs 1 -1 sc (fromClause) col-1 sh gr
  2307. /Times-Roman ff 150.00 scf sf
  2308. 315 1710 m
  2309. gs 1 -1 sc (whereClause) col-1 sh gr
  2310. /Times-Roman ff 150.00 scf sf
  2311. 315 1980 m
  2312. gs 1 -1 sc (groupClause) col-1 sh gr
  2313. /Times-Roman ff 150.00 scf sf
  2314. 315 2250 m
  2315. gs 1 -1 sc (havingClause) col-1 sh gr
  2316. /Times-Roman ff 150.00 scf sf
  2317. 315 2520 m
  2318. gs 1 -1 sc (sortClause) col-1 sh gr
  2319. /Times-Roman ff 150.00 scf sf
  2320. 2025 450 m
  2321. gs 1 -1 sc (TargetList) col-1 sh gr
  2322. /Times-Roman ff 150.00 scf sf
  2323. 2025 810 m
  2324. gs 1 -1 sc (FromList) col-1 sh gr
  2325. /Times-Roman ff 150.00 scf sf
  2326. 900 3825 m
  2327. gs 1 -1 sc (OP) col-1 sh gr
  2328. /Times-Roman ff 150.00 scf sf
  2329. 1485 3555 m
  2330. gs 1 -1 sc (">") col-1 sh gr
  2331. /Times-Roman ff 150.00 scf sf
  2332. 495 3330 m
  2333. gs 1 -1 sc (A_Expr) col-1 sh gr
  2334. /Times-Roman ff 150.00 scf sf
  2335. 315 3825 m
  2336. gs 1 -1 sc (oper) col-1 sh gr
  2337. /Times-Roman ff 150.00 scf sf
  2338. 315 3555 m
  2339. gs 1 -1 sc (opname) col-1 sh gr
  2340. /Times-Roman ff 150.00 scf sf
  2341. 315 4095 m
  2342. gs 1 -1 sc (rexpr) col-1 sh gr
  2343. /Times-Roman ff 150.00 scf sf
  2344. 315 4365 m
  2345. gs 1 -1 sc (lexpr) col-1 sh gr
  2346. /Times-Roman ff 150.00 scf sf
  2347. 3105 3825 m
  2348. gs 1 -1 sc (OP) col-1 sh gr
  2349. /Times-Roman ff 150.00 scf sf
  2350. 3735 3555 m
  2351. gs 1 -1 sc ("=") col-1 sh gr
  2352. showpage
  2353. $F2psEnd
  2354. rs
  2355. %%EndDocument
  2356.  @endspecial 595 2973 a(Figure)11 b(3.3:)16 b Fp(Wher)n(eClause)e
  2357. Ft(for)e(query)f(of)h(e)o(xample)h(3.1)p eop
  2358. %%Page: 56 56
  2359. 56 55 bop 270 60 a Ft(56)82 b Fm(CHAPTER)14 b(3.)28 b(POSTGRESQL)13
  2360. b(FR)n(OM)f(THE)i(PR)n(OGRAMMER'S)f(POINT)f(OF)g(VIEW)270
  2361. 234 y Ft(Ne)o(xt)k(it)h(is)f(checked)g(if)g(the)g Fp(attrib)o(ute)g
  2362. (names)h Ft(used)g(are)f(contained)g(in)g(the)g Fp(r)n(elations)h
  2363. Ft(gi)o(v)o(en)f(in)g(the)270 294 y(query)m(.)39 b(F)o(or)19
  2364. b(e)o(v)o(ery)h Fp(attrib)o(ute)g Ft(that)g(is)h(found)e(a)i
  2365. Fr(TLE)f Ft(node)g(is)g(created)g(holding)g(a)g(pointer)g(to)g(a)270
  2366. 354 y Fr(Resdom)13 b Ft(node)h((which)f(holds)h(the)g(name)g(of)f(the)
  2367. h(column))f(and)h(a)g(pointer)f(to)h(a)g Fr(VAR)g Ft(node.)20
  2368. b(There)270 413 y(are)c(two)g(important)f(numbers)h(in)h(the)f
  2369. Fr(VAR)g Ft(node.)28 b(The)17 b(02eld)f Fr(varno)g
  2370. Ft(gi)o(v)o(es)h(the)f(position)g(of)g(the)270 473 y
  2371. Fp(r)n(elation)h Ft(containing)f(the)h(current)f Fp(attrib)o(ute)h
  2372. Ft(in)f(the)h Fp(r)o(ange)g(table)g(entry)g(list)g Ft(created)g(abo)o
  2373. (v)o(e.)30 b(The)270 533 y(02eld)14 b Fr(varattno)g
  2374. Ft(gi)o(v)o(es)h(the)f(position)h(of)f(the)g Fp(attrib)o(ute)h
  2375. Ft(within)f(the)g Fp(r)n(elation)p Ft(.)23 b(If)14 b(the)g(name)h(of)f
  2376. (an)270 593 y Fp(attrib)o(ute)c Ft(cannot)g(be)g(found)f(an)i(error)e
  2377. (will)g(be)i(returned)e(and)h(the)g Fp(query)g(pr)n(ocessing)h
  2378. Ft(will)f(be)g(aborted.)310 2392 y @beginspecial 134
  2379. @llx 230 @lly 478 @urx 561 @ury 3440 @rwi @setspecial
  2380. %%BeginDocument: figures/transform.ps
  2381. %Magnification: 1.05
  2382. /$F2psDict 200 dict def
  2383. $F2psDict begin
  2384. $F2psDict /mtrx matrix put
  2385. /col-1 {0 setgray} bind def
  2386. /col0 {0.000 0.000 0.000 srgb} bind def
  2387. /col1 {0.000 0.000 1.000 srgb} bind def
  2388. /col2 {0.000 1.000 0.000 srgb} bind def
  2389. /col3 {0.000 1.000 1.000 srgb} bind def
  2390. /col4 {1.000 0.000 0.000 srgb} bind def
  2391. /col5 {1.000 0.000 1.000 srgb} bind def
  2392. /col6 {1.000 1.000 0.000 srgb} bind def
  2393. /col7 {1.000 1.000 1.000 srgb} bind def
  2394. /col8 {0.000 0.000 0.560 srgb} bind def
  2395. /col9 {0.000 0.000 0.690 srgb} bind def
  2396. /col10 {0.000 0.000 0.820 srgb} bind def
  2397. /col11 {0.530 0.810 1.000 srgb} bind def
  2398. /col12 {0.000 0.560 0.000 srgb} bind def
  2399. /col13 {0.000 0.690 0.000 srgb} bind def
  2400. /col14 {0.000 0.820 0.000 srgb} bind def
  2401. /col15 {0.000 0.560 0.560 srgb} bind def
  2402. /col16 {0.000 0.690 0.690 srgb} bind def
  2403. /col17 {0.000 0.820 0.820 srgb} bind def
  2404. /col18 {0.560 0.000 0.000 srgb} bind def
  2405. /col19 {0.690 0.000 0.000 srgb} bind def
  2406. /col20 {0.820 0.000 0.000 srgb} bind def
  2407. /col21 {0.560 0.000 0.560 srgb} bind def
  2408. /col22 {0.690 0.000 0.690 srgb} bind def
  2409. /col23 {0.820 0.000 0.820 srgb} bind def
  2410. /col24 {0.500 0.190 0.000 srgb} bind def
  2411. /col25 {0.630 0.250 0.000 srgb} bind def
  2412. /col26 {0.750 0.380 0.000 srgb} bind def
  2413. /col27 {1.000 0.500 0.500 srgb} bind def
  2414. /col28 {1.000 0.630 0.630 srgb} bind def
  2415. /col29 {1.000 0.750 0.750 srgb} bind def
  2416. /col30 {1.000 0.880 0.880 srgb} bind def
  2417. /col31 {1.000 0.840 0.000 srgb} bind def
  2418. end
  2419. save
  2420. 107.0 574.5 translate
  2421. 1 -1 scale
  2422. /cp {closepath} bind def
  2423. /ef {eofill} bind def
  2424. /gr {grestore} bind def
  2425. /gs {gsave} bind def
  2426. /sa {save} bind def
  2427. /rs {restore} bind def
  2428. /l {lineto} bind def
  2429. /m {moveto} bind def
  2430. /rm {rmoveto} bind def
  2431. /n {newpath} bind def
  2432. /s {stroke} bind def
  2433. /sh {show} bind def
  2434. /slc {setlinecap} bind def
  2435. /slj {setlinejoin} bind def
  2436. /slw {setlinewidth} bind def
  2437. /srgb {setrgbcolor} bind def
  2438. /rot {rotate} bind def
  2439. /sc {scale} bind def
  2440. /sd {setdash} bind def
  2441. /ff {findfont} bind def
  2442. /sf {setfont} bind def
  2443. /scf {scalefont} bind def
  2444. /sw {stringwidth} bind def
  2445. /tr {translate} bind def
  2446. /tnt {dup dup currentrgbcolor
  2447.   4 -2 roll dup 1 exch sub 3 -1 roll mul add
  2448.   4 -2 roll dup 1 exch sub 3 -1 roll mul add
  2449.   4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
  2450.   bind def
  2451. /shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
  2452.   4 -2 roll mul srgb} bind def
  2453.  /DrawSplineSection {
  2454. /y3 exch def
  2455. /x3 exch def
  2456. /y2 exch def
  2457. /x2 exch def
  2458. /y1 exch def
  2459. /x1 exch def
  2460. /xa x1 x2 x1 sub 0.666667 mul add def
  2461. /ya y1 y2 y1 sub 0.666667 mul add def
  2462. /xb x3 x2 x3 sub 0.666667 mul add def
  2463. /yb y3 y2 y3 sub 0.666667 mul add def
  2464. x1 y1 lineto
  2465. xa ya xb yb x3 y3 curveto
  2466. } def
  2467. /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
  2468. /$F2psEnd {$F2psEnteredState restore end} def
  2469. $F2psBegin
  2470. 10 setmiterlimit
  2471. n 0 792 m 0 0 l 612 0 l 612 792 l cp clip
  2472.  0.06299 0.06299 sc
  2473. 7.500 slw
  2474. % Polyline
  2475. n 1530 5040 m 1800 5310 l gs col-1 s gr 
  2476. % Polyline
  2477. n 1800 5040 m 1530 5310 l gs col-1 s gr 
  2478. % Polyline
  2479. n 1530 4770 m 1800 5040 l gs col-1 s gr 
  2480. % Polyline
  2481. n 1800 4770 m 1530 5040 l gs col-1 s gr 
  2482. % Polyline
  2483. n 1530 3960 m 1800 4230 l gs col-1 s gr 
  2484. % Polyline
  2485. n 1800 3960 m 1530 4230 l gs col-1 s gr 
  2486. % Polyline
  2487. n 1530 3690 m 1800 3960 l gs col-1 s gr 
  2488. % Polyline
  2489. n 1800 3690 m 1530 3960 l gs col-1 s gr 
  2490. % Polyline
  2491. n 1530 2340 m 1800 2610 l gs col-1 s gr 
  2492. % Polyline
  2493. n 1800 2340 m 1530 2610 l gs col-1 s gr 
  2494. % Polyline
  2495. n 1530 1260 m 1800 1530 l gs col-1 s gr 
  2496. % Polyline
  2497. n 1800 1260 m 1530 1530 l gs col-1 s gr 
  2498. % Polyline
  2499. n 1530 720 m 1800 990 l gs col-1 s gr 
  2500. % Polyline
  2501. n 1800 720 m 1530 990 l gs col-1 s gr 
  2502. % Polyline
  2503. n 2250 945 m 3150 945 l gs col-1 s gr 
  2504. % Polyline
  2505. n 2250 1215 m 3150 1215 l gs col-1 s gr 
  2506. % Polyline
  2507. n 2250 1485 m 3150 1485 l gs col-1 s gr 
  2508. % Polyline
  2509. n 2250 720 m 3150 720 l 3150 1755 l 2250 1755 l cp gs col-1 s gr 
  2510. % Polyline
  2511. n 2880 945 m 2880 1485 l gs col-1 s gr 
  2512. /Times-Roman ff 150.00 scf sf
  2513. 2340 1395 m
  2514. gs 1 -1 sc (refname) col-1 sh gr
  2515. /Times-Roman ff 150.00 scf sf
  2516. 2565 900 m
  2517. gs 1 -1 sc (RTE) col-1 sh gr
  2518. /Times-Roman ff 150.00 scf sf
  2519. 2340 1125 m
  2520. gs 1 -1 sc (relname) col-1 sh gr
  2521. /Times-Roman ff 150.00 scf sf
  2522. 2340 1665 m
  2523. gs 1 -1 sc (relid: 18208) col-1 sh gr
  2524. % Polyline
  2525. n 2835 225 m 2835 495 l gs col-1 s gr 
  2526. % Polyline
  2527. n 2565 225 m 3105 225 l 3105 495 l 2565 495 l cp gs col-1 s gr 
  2528. % Polyline
  2529. n 4860 225 m 4860 495 l gs col-1 s gr 
  2530. % Polyline
  2531. n 4590 225 m 5130 225 l 5130 495 l 4590 495 l cp gs col-1 s gr 
  2532. % Polyline
  2533. n 4860 225 m 5130 495 l gs col-1 s gr 
  2534. % Polyline
  2535. n 5130 225 m 4860 495 l gs col-1 s gr 
  2536. % Polyline
  2537. gs  clippath
  2538. 2730 573 m 2700 693 l 2670 573 l 2670 735 l 2730 735 l  cp clip
  2539. n 2700 360 m 2700 720 l gs col-1 s gr gr
  2540. % arrowhead
  2541. n 2730 573 m 2700 693 l 2670 573 l 2700 573 l 2730 573 l  cp gs 0.00 setgray ef gr  col-1 s
  2542. % Polyline
  2543. gs  clippath
  2544. 4443 330 m 4563 360 l 4443 390 l 4605 390 l 4605 330 l  cp clip
  2545. n 2970 360 m 4590 360 l gs col-1 s gr gr
  2546. % arrowhead
  2547. n 4443 330 m 4563 360 l 4443 390 l 4443 360 l 4443 330 l  cp gs 0.00 setgray ef gr  col-1 s
  2548. % Polyline
  2549. gs  clippath
  2550. 4755 573 m 4725 693 l 4695 573 l 4695 735 l 4755 735 l  cp clip
  2551. n 4725 360 m 4725 720 l gs col-1 s gr gr
  2552. % arrowhead
  2553. n 4755 573 m 4725 693 l 4695 573 l 4725 573 l 4755 573 l  cp gs 0.00 setgray ef gr  col-1 s
  2554. % Polyline
  2555. n 2250 2745 m 3150 2745 l gs col-1 s gr 
  2556. % Polyline
  2557. n 2250 3015 m 3150 3015 l gs col-1 s gr 
  2558. % Polyline
  2559. n 2250 2520 m 3150 2520 l 3150 3285 l 2250 3285 l cp gs col-1 s gr 
  2560. % Polyline
  2561. n 2880 2745 m 2880 3285 l gs col-1 s gr 
  2562. /Times-Roman ff 150.00 scf sf
  2563. 2565 2700 m
  2564. gs 1 -1 sc (TLE) col-1 sh gr
  2565. /Times-Roman ff 150.00 scf sf
  2566. 2340 2925 m
  2567. gs 1 -1 sc (resdom) col-1 sh gr
  2568. /Times-Roman ff 150.00 scf sf
  2569. 2340 3195 m
  2570. gs 1 -1 sc (expr) col-1 sh gr
  2571. % Polyline
  2572. n 4275 2745 m 5175 2745 l gs col-1 s gr 
  2573. % Polyline
  2574. n 4275 3015 m 5175 3015 l gs col-1 s gr 
  2575. % Polyline
  2576. n 4275 2520 m 5175 2520 l 5175 3285 l 4275 3285 l cp gs col-1 s gr 
  2577. % Polyline
  2578. n 4905 2745 m 4905 3285 l gs col-1 s gr 
  2579. /Times-Roman ff 150.00 scf sf
  2580. 4590 2700 m
  2581. gs 1 -1 sc (TLE) col-1 sh gr
  2582. /Times-Roman ff 150.00 scf sf
  2583. 4365 2925 m
  2584. gs 1 -1 sc (resdom) col-1 sh gr
  2585. /Times-Roman ff 150.00 scf sf
  2586. 4365 3195 m
  2587. gs 1 -1 sc (expr) col-1 sh gr
  2588. % Polyline
  2589. n 2835 2025 m 2835 2295 l gs col-1 s gr 
  2590. % Polyline
  2591. n 2565 2025 m 3105 2025 l 3105 2295 l 2565 2295 l cp gs col-1 s gr 
  2592. % Polyline
  2593. n 4860 2025 m 4860 2295 l gs col-1 s gr 
  2594. % Polyline
  2595. n 4590 2025 m 5130 2025 l 5130 2295 l 4590 2295 l cp gs col-1 s gr 
  2596. % Polyline
  2597. n 4860 2025 m 5130 2295 l gs col-1 s gr 
  2598. % Polyline
  2599. n 5130 2025 m 4860 2295 l gs col-1 s gr 
  2600. % Polyline
  2601. n 450 450 m 1800 450 l gs col-1 s gr 
  2602. % Polyline
  2603. n 450 720 m 1800 720 l gs col-1 s gr 
  2604. % Polyline
  2605. n 450 990 m 1800 990 l gs col-1 s gr 
  2606. % Polyline
  2607. n 450 1260 m 1800 1260 l gs col-1 s gr 
  2608. % Polyline
  2609. n 450 1530 m 1800 1530 l gs col-1 s gr 
  2610. % Polyline
  2611. n 450 1800 m 1800 1800 l gs col-1 s gr 
  2612. % Polyline
  2613. n 450 2070 m 1800 2070 l gs col-1 s gr 
  2614. % Polyline
  2615. n 450 2340 m 1800 2340 l gs col-1 s gr 
  2616. % Polyline
  2617. n 450 2610 m 1800 2610 l gs col-1 s gr 
  2618. % Polyline
  2619. n 450 2880 m 1800 2880 l gs col-1 s gr 
  2620. % Polyline
  2621. n 450 3150 m 1800 3150 l gs col-1 s gr 
  2622. % Polyline
  2623. n 450 3690 m 1800 3690 l gs col-1 s gr 
  2624. % Polyline
  2625. n 450 3960 m 1800 3960 l gs col-1 s gr 
  2626. % Polyline
  2627. n 450 4230 m 1800 4230 l gs col-1 s gr 
  2628. % Polyline
  2629. n 450 3420 m 1800 3420 l gs col-1 s gr 
  2630. % Polyline
  2631. n 450 4500 m 1800 4500 l gs col-1 s gr 
  2632. % Polyline
  2633. n 450 4770 m 1800 4770 l gs col-1 s gr 
  2634. % Polyline
  2635. n 450 5040 m 1800 5040 l gs col-1 s gr 
  2636. % Polyline
  2637. n 450 225 m 1800 225 l 1800 5310 l 450 5310 l cp gs col-1 s gr 
  2638. % Polyline
  2639. n 1530 4770 m 1530 5310 l gs col-1 s gr 
  2640. % Polyline
  2641. n 1530 4230 m 1530 2880 l gs col-1 s gr 
  2642. % Polyline
  2643. n 1530 2340 m 1530 2610 l gs col-1 s gr 
  2644. % Polyline
  2645. n 1530 720 m 1530 990 l gs col-1 s gr 
  2646. % Polyline
  2647. n 1530 1260 m 1530 1530 l gs col-1 s gr 
  2648. % Polyline
  2649. n 1530 2610 m 1530 2880 l gs col-1 s gr 
  2650. % Polyline
  2651. n 1530 2610 m 1800 2880 l gs col-1 s gr 
  2652. % Polyline
  2653. n 1800 2610 m 1530 2880 l gs col-1 s gr 
  2654. % Polyline
  2655. gs  clippath
  2656. 3228 1050 m 3348 1080 l 3228 1110 l 3390 1110 l 3390 1050 l  cp clip
  2657. n 3015 1080 m 3375 1080 l gs col-1 s gr gr
  2658. % arrowhead
  2659. n 3228 1050 m 3348 1080 l 3228 1110 l 3228 1080 l 3228 1050 l  cp gs 0.00 setgray ef gr  col-1 s
  2660. % Polyline
  2661. gs  clippath
  2662. 3228 1320 m 3348 1350 l 3228 1380 l 3390 1380 l 3390 1320 l  cp clip
  2663. n 3015 1350 m 3375 1350 l gs col-1 s gr gr
  2664. % arrowhead
  2665. n 3228 1320 m 3348 1350 l 3228 1380 l 3228 1350 l 3228 1320 l  cp gs 0.00 setgray ef gr  col-1 s
  2666. % Polyline
  2667. gs  clippath
  2668. 5253 1050 m 5373 1080 l 5253 1110 l 5415 1110 l 5415 1050 l  cp clip
  2669. n 5040 1080 m 5400 1080 l gs col-1 s gr gr
  2670. % arrowhead
  2671. n 5253 1050 m 5373 1080 l 5253 1110 l 5253 1080 l 5253 1050 l  cp gs 0.00 setgray ef gr  col-1 s
  2672. % Polyline
  2673. gs  clippath
  2674. 5253 1320 m 5373 1350 l 5253 1380 l 5415 1380 l 5415 1320 l  cp clip
  2675. n 5040 1350 m 5400 1350 l gs col-1 s gr gr
  2676. % arrowhead
  2677. n 5253 1320 m 5373 1350 l 5253 1380 l 5253 1350 l 5253 1320 l  cp gs 0.00 setgray ef gr  col-1 s
  2678. % Polyline
  2679. n 4275 945 m 5175 945 l gs col-1 s gr 
  2680. % Polyline
  2681. n 4275 1215 m 5175 1215 l gs col-1 s gr 
  2682. % Polyline
  2683. n 4275 1485 m 5175 1485 l gs col-1 s gr 
  2684. % Polyline
  2685. n 4275 720 m 5175 720 l 5175 1755 l 4275 1755 l cp gs col-1 s gr 
  2686. % Polyline
  2687. n 4905 945 m 4905 1485 l gs col-1 s gr 
  2688. % Polyline
  2689. gs  clippath
  2690. 2730 2373 m 2700 2493 l 2670 2373 l 2670 2535 l 2730 2535 l  cp clip
  2691. n 2700 2160 m 2700 2520 l gs col-1 s gr gr
  2692. % arrowhead
  2693. n 2730 2373 m 2700 2493 l 2670 2373 l 2700 2373 l 2730 2373 l  cp gs 0.00 setgray ef gr  col-1 s
  2694. % Polyline
  2695. gs  clippath
  2696. 4443 2130 m 4563 2160 l 4443 2190 l 4605 2190 l 4605 2130 l  cp clip
  2697. n 2970 2160 m 4590 2160 l gs col-1 s gr gr
  2698. % arrowhead
  2699. n 4443 2130 m 4563 2160 l 4443 2190 l 4443 2160 l 4443 2130 l  cp gs 0.00 setgray ef gr  col-1 s
  2700. % Polyline
  2701. gs  clippath
  2702. 4755 2373 m 4725 2493 l 4695 2373 l 4695 2535 l 4755 2535 l  cp clip
  2703. n 4725 2160 m 4725 2520 l gs col-1 s gr gr
  2704. % arrowhead
  2705. n 4755 2373 m 4725 2493 l 4695 2373 l 4725 2373 l 4755 2373 l  cp gs 0.00 setgray ef gr  col-1 s
  2706. % Polyline
  2707. gs  clippath
  2708. 3228 4200 m 3348 4230 l 3228 4260 l 3390 4260 l 3390 4200 l  cp clip
  2709. n 3015 4230 m 3375 4230 l gs col-1 s gr gr
  2710. % arrowhead
  2711. n 3228 4200 m 3348 4230 l 3228 4260 l 3228 4230 l 3228 4200 l  cp gs 0.00 setgray ef gr  col-1 s
  2712. % Polyline
  2713. gs  clippath
  2714. 5253 4200 m 5373 4230 l 5253 4260 l 5415 4260 l 5415 4200 l  cp clip
  2715. n 5040 4230 m 5400 4230 l gs col-1 s gr gr