latest hstore patch

Started by Andrew Gierthover 16 years ago29 messages
#1Andrew Gierth
andrew@tao11.riddles.org.uk
1 attachment(s)

Hstore patch incorporating changes as previously discussed.

In addition the requested new features of conversions to and from
array formats have been added (with docs).

--
Andrew (irc:RhodiumToad)

Attachments:

hstore-20090923.patch.gzapplication/octet-streamDownload
���Jhstore-20090923.patch��{{�H�8���z���|IB $=itv��I��Y���l��[2���i����s��*�$�N�o;O7����:u�Uu�$�{���^�3��p���{����
��w�������3l�	{8���{�8z���fa?��O��9�;��f��.�`�f��a��[����`�6{ls��wcc#o(�f��	/Y��x�Z�';���4�f�*����fn�V��{S���5ZO;O������G�8�&�_��Ao<�{�/�8�v�s������h�S�o
�a�Ci�����w��;]���;��?����n��{8M��(���7��[[!o�������`�x6� ������E�������0&��N�n|;c<���(0�>| {���=������]��?�'�����=��l|��Z�`��vK>��dx����������k����'IN���lkt�?������X����TS��A���T>z�c/��]��j��-�V��~���'MG<����vs��~=��^�wx�p��#/��;�X��������5>g��//b��~p������#�����x�O���L����y}�_�������
���i����v����Q(m�U��q���W*��;�.yn���j?dA�8��FXHt|�V�@b��
"�0���J��������s$���_������q������������	����m�jZ�gG��!�b��g�|0����gD����AC�y�^�������^�A�J�7�A�F
���1k�_���5��4\�Z����}�m�kj��v�������Gg/�/����y~|qzt~���{]M����k�Z���1�6�L��@��%Y	�u�p\�p����<�O=Q��yh8�����U�(Q�.C��6\��?��}UD����"�J#�������Ym����\F=y����_yA��a����o��RPV|*��4tAe��37���o���7�<�<��*]��X�� ���w�D�
������H���l����;���B���@a����6��7g�s��a�Y$S���C�d5�d�#���a��1��X�
����%�q�������������pBe����y�<��-*�p��o�/o�j��\���sr������5>�5�����w�^1(��[��������C����B�$�]3 r�v@��w�i8��0�����������=h��Y���g3��ZJ��UQS�<|�
����yL*]���'T~��6r/=�;���'~L/�cx��F+y��f.� �D��8�e#��:��qxq�Y����bK���R�����c��8��0Qr��|@��gsV���T\�4��'���yv������p<��>�Su`S�s,��:�:���s�8�=Hq`���F-�����X�^���s`LY�V[�m�����Vf?�{��^}@/j�7�j���r����/A����V{�$�r��{��*�B���8>!���#�����*�O�yz��< �	j����'�.Q��T�c�����G$o@0G~�Tj�	��1�������&�!�Y![!�C�t3P�3!d��e�
���H	����gz��!T���g��]�@J!m�������7���������M�:�>���!��[�`�����)l�_$�^��x��J�Y��eU�HFGu��faD~Y
a0�������E���_s�"��,p��c^����K�;��f��I�]o�D�[��{=6:��`7n7���}C��=o�r������?�O�3PD��Y�h�E�x���E�������B��k�O��
k	,WV����&s0tJt�����(vg1DvM��$�����d"�VE����VGw��f6y��,�78��A$�������a}�M�������;�J��-69�OB0c�=%[D*�F�9�	�z}������U�C�;�C�p>���\����Z!��`:�QI�q�:�&��u�Jm�V��j�V�R����^Kg��t��t�Z��y�UT��7�����7�OF%�����Me�Uz�TB}c��O@u���W�4���6�u�}E�(��pn��">�ipbP�'��\"�M����9��=��&H^bzy�-���A�\��V�_������Ue�a�e�q����'����F)i�brs�m�P�U��`WJ��vy��V�]3�����1jb����:�Sp�8�fh���0/����0�#���(TLWxx��F��OEJ���l4"lxR������ e`��[D�9������
D��]��9
�}�(��TmU� ����d�F���?�����/������U�����/l.�rJ�t��T��@��*v=��y�ji��EP����3bx����*
���b{i�t�5�6�D��4��h�
�ql�	�ad�D ���Sye|�"��H�qq�����/���Y�/���d
1H1�������	��0�H��w���yO�0=�������N�L$
c���p�g"�������-\��
����M;`������< E�[Q�����.�SoFH������(��=h���Y�oF�����|���?��C%������'�B�/�TGX�U^�_�W����Y�$���Ld�O=q	0���f�C��0�r�c����FQ�=�I~���<0��|Q4�0��g�	h0���'���������b>���>z#i����'�	�������#k!s���!s��e��k�4��J�D�)������u���?^����]�a����]��0D9M#�9hN�Hk���!0��*���=��[�������T�f#��x�.����P����=}����q�������G�� ��c
��u@a�}�.�����&\p�x,D ������@�1���b|D8@&��'�H��q�a ���b��^����"��|{U0�w�u��`P
�
0��wo�]�����yq���YUE�1�F��l/�z-�P�(({[X0�E��P56��� ���D�����x4.\V*��}o��w���A�����ooh6�	z�&^�������x�h���z�V��e�����{N�!�;<;;>�8f�g����+dIj�KP��������wgo�����9[�f�]������������^�g�?yv!�����������?��^���������g'o.���P�����`�l6���w���@y���x������0�c �/k��0�������Cu�l������~�����W������l�0�4���m2|e���E.xwO!z�d�-�\�������w���N��x�u�:��{�.,RW������v��G����M�"JrX�>/���N�w�
�u�W�fp���
�����u(\������H�qi`�����+�F������������r���(��
]��!�����5�����Y������+m1&�8�=�C{
�����S1���ySq�[+C�u;���������m��+g'/O9D�T�6xUKu�;|�G���`.;~�{5������F�$F��9�p��e���tm+���'o�hI��C��X����4<Q���1`{��B�	�@`��0�:0�=W[�,��V!08r��4w��\DR���{�
7������������$V�=�p,��l�c�J�w��x|;H�WD��[A�x�"��P8	�2��A���R�p�uC�-
�pI�1���n��K�H�dZ<c��<ke�wo�%+4n���j^{Z����<5c���@������X����3��R &n�x��)uwH��M����Nso[�w�+}������4H��y�6Rl�v�>+E�1@q���*I��T�)pafi�.�x��.7�tc��f�	q9����]G�@i����>/����3�g�����;���w����'��J��p+���%����i??�8}�f^/��o)�H_�
���K��Bm��x�(�GX�`��p�����
�4����	Q`I��g������K�Uq���.�����.kV�&��-��jeW-���Z��e:���J#�����C�[Mh
L��1�����D,�
;
n4�����N��gG�|�W�!1������y��S.3V���d���'�2n�*���'�Ij_����r^�$����HL.xe��.KY��e�
�L�x���xy+�������}w6�'U�.&OV�~P��q+�X� J��||;�(	2B���@,pO��|�����U7�����b�g%���e^TI�T��0�����%(��A:*�
�\d$-���n<����c9)��n�9��`a���rA�|`�L�mi`�%&��fBIK3�o
��cfxk��3�[������fz�i>4%7�@+���X��k��Q/07�O��g���@{����x��P�+Y��>���'�s�Ob1G{������������_��e$8=���w3����1�d���9C���:p:�K)w|<VN��E<)�`|�f��X��S������A<:s��x���q�M�tl��G�p>s�*<-�����9h�k~�;�l����<����
�����g�����U������q�75?�d���~�OO�s��l[�H�LMTv�w5�\"L�H�]����:����9�|Z<�������t�?�O����-��2�g����9G��Z!�y~������
��_����y�L�#���Z�YA�w�g�
����]9H=�����;�:z&5.���sK����V����W���Xdcy��0�o��u��Q�i��J��������{�y,B�����Y��VF�vo�����v����.qR����L���V�m�4m��j��V;C}&Ca~Y������4�$���J>x$>�v���b�����v�����LW��O�������m��������rj�e)�)'�)���:��0���B��<�5�J5?��������;�Nc7�)�rb��WZ����!�~I�c������L��9^�d���h�y��vw��`9
$�K�%H�%*:��n�e��I�D��`8P�q���V|Y�h�6��4�f�yS�J�.�b[�"!+��V�szYS��"i��i7�������������E"�O��mU��EKw@SE��)�}�{�����`�{#��5_�`�z��Q}�C����1O���T�_����0��3/R���Wn��E�C�9�J����8;�:c���/l��w�G��1�����P>#yI�|-�9�2��i5�bkZ���dW��e!�zI5��"��T��0��L�"��2��g���@��y���R��x���/��$I�r����J%
��&>�iHx*��x���z2I/=��w%l5���o� mj ��IY�Dy���<wr�f�;`���_�|u�n�8���AB�6~;:�LU�R��?�'��������������K/��J�������_�3 ��:�!��B�$8��Wf�(l;=|���_ C�������W6�����^'��`� ���&��qv|�9yA9$1�����XCtI���-r�]�����;�$&v�����b���<��P,��t��`R�PZv������EX)#���E�x>�%y�����f����\�{a�����W
�NS��wLx�d|�_s�����_Y���[~J@�tKK;���E�-�O��5s�	�3(��S((�I�Ru�f!.8���1���q������H$>��cE��4jI�����SF�"��3��V�^���&%���_:?X���@�f�G��\y�����6������l3�����J�Zf�-g�&K3���2����]t�JI��(.6����`��)+�j�rK2�'�U�U�&�����%���F��b�����R�4�.������3�����G���h������;�)�
I~���l'��������;Et����J�K(�u���B����Q/1���v�J*x�-�J:�����d���6XDG��0��u9q�,�����<�$%Yd�;���+��7��c�H�����dU/$�� t	�x�EV�{*A�H;B�p8v���OO�;���.L����u����A��y&�\����N�;���y	j��W'��.��{�CMNy����/����dhX7���sS���������^�����D_t�����?�IQ�)����
a��k�	RY�h��{i���:q��Q��,���okU�A��.����Je����t-�W�{��r�b�Um���R,**f��=8�.B���c[��F�������t�3�c`KOJ��::����4w�}��f�:������Xjy�	�2)Ob���xl��m��2�Ut���1��������b�g��MC(����#���^���Ioczh�N11��C���!r��"qs�b�d��C����uam�����G_T�KZ�|������D%��c�������E0P�-��Ks�m
1������Uu��Ib�03�}�\�o1��:�y�{[�����C7f������Ko\[�,��~hb�N�J6�f�����2"�d���-�`r�	C��&gGZ.������1@�`*���:����a�n0���(,P���FQ����F�rT��K����c)�8K��I-\y�,Yx�W~<�����h���Z��Z��*��TO��l�=w55�����V��B ?B=R�D���U�� S�!�����on��8f���.��O�� d�XX9s]���l.g��^���K����1C��~��6�>,�W�z�@e�����_�*O�_c��Zz��	���w~��
I��d��D]zA���F%�6��j��#��r a|�h��DH����PPM����l2��bA$H�tN��U�d�e�w	�������'�"�2|*n��<�yPT|���w���&�����7�0>���Y~J �eac9*y_� e-�/�8V�tvY�,����1M�J��)��S�k��0�oU6����K�M�(%�+Y�hV"�H��(V\+�it�0�^��+@[��7�����F���J�J��������������A���h�p��=0R.��g
�K�N�qgLA7K���w�N��g��gb
m�����H��	���������TN��i�UMN�[j���\�)_#�1b^�~�R���1��G]NO�k!���.�����/'�?{��h9}xI�����t�����y?�
�����Ec,���t�Mg����j���QYK���k��a+����n�yya�U.wi�����v����(���2Q�I�n�2��i�Y�uY,X�}v�:�C��h�o����H`h0UU�%������jiMK*�I���D9`�7e��&u#���2KG�k��B��d�~�2��V{o�VY�x��{)l��msSBj�[�&M!����=���n*!���sv��#���RA����S����Z����#pa�~��O�)��	CsU�3�`�\Y�v�������}36+�g�����ne]bA�X2���������Ek��g���s������9�V����G�����[X#���J�8CWk�f�U$�u��8{g�����!~��WC���C�`������ w!���U�f�*H�y������v�����/}����'l12h������C�������}7`����/�X������?�������Kf
�o�2�H���^y����_�������'���~�~�;��g�������z��W3��uZ��R:HUqB�����g"���YS7���R�u�XX���$����.w���=��n@l���� ��1��H\}Lr�]�~���vk�[�-[��\cnMzy���]���������b�(���o�Y{0�������6������Bl��mb��F����/��C�br�@����&��9�f������R��K/��b�2���Lft=�����ax�2�{��#L�5�o�b
�[~�"x3���������4��'���y3/���������o��e
�Z�z=w�R��a�o3"hv����������R�����}0�$tC����M(���*
'���!gL>�����~����(�����N(��K^��8��a3��)u\.a��~�)�%������
8z����������Z��{Kk����n74���O|Gp[Q�z�hi��w��N+�y8�:p�&��D7��s�T`|y��x��]�;l��w��,5���a�O�-����D��_����������2'1�8�����v���%��F��Am�r�
�����k��������t��������v@vw����g!)�v��I�PBP�����r��,�@���(�W�SX�R���"��yW���W�<�z�x���L��E`n���H{��3L������J����s������io>K��s�N#�"� ���btO��qr�����������W�������ye��n(��[�(���Q���KJ��'d��ezqU���?&}HI���d7�i���c�_�v�Su��h��8n�����iI����c���q�j@��&��7�F��X��=K����d*���QkY���}%�m�j�����#a{�6R�b���o�����?�
�B����rC+�m#J�o�Df;*IF�D!�y�
�����# W�5����`�� �����
��(�l��ur����a��#�eJ��C0uF!�
S�����Tv"�����]/����G*�daw	�b�������N��K��@o�fD�l��@�G�H���SO,�E���)������T��H(�i��s���������@���E��j
J�8ys�JQ G�W�L��*O�G��|>�z�6������|	E��/p���)��YS�� �"�rcfa������k������5�����
f/������c��r���)���N�ZvB�g�%���_�%���7eM<	!�<VM����������:C/�D@Eq��m�B�W:;�"���Q����&�Jt���3j��k>L���������{�e��x11J�jOq�\��<����\��z�:-������W��������W��8~^ST��Io��-�^��<l��F��ZMM@E7F��`���
���*��&JwO,���D�e�i���Gt���c��7��F��2���1���^����������(XbT��5�]Y�*����i{>�X�
��7�{*�j~�])	XPZ�A� 3mtL=KQ7��o�#5��z�|/���F�`�z��>����fO@�x}e]m���Zv�]!����i�v�����+��$O�������U��$���E,�V�e�Kp+�"K��kuK��T�1�8+I����<"�o��y^����$�����*���y?1����VH�X��o�-��I[��:�M#�����w�5eU}�.�'��Q�����s���5�����������y3�u��	�A����Q7U����f|��J�J��}�Sq�d3*�&�P1B����k�C��#����F�9�������*�,eX\�B\4��[��E�n����8�m��~^b��oIP%��HP�h$Yb�I7q����@S
�v�F���d����Z���.H�~�w�k�F�ZVz4��(����1ZL1��_b��s����.
����v`�*�-��s�����^��u_�r���s{m�.U�v7����	�{�����p��[5<t�X��oNC�u5�U�%��Wg
G��,�1U���!)�&&���%�������KoLZ�W���H?��F{�t�4��T��}�a����x+9���V��I�O�]�+�z��wd�U�)�UQ����`��ilV��,Bg&���c���
���e��U�)�Z�$��l�En3�Ei�/,.�����%K3*��+]\W�F�E����P�:u�P��w�E���lwx��F��6��Z����x��5
�&��+?��X������J�����\�2y�"��R{�'�f��R�
>�����%w{�D��%[Z7�m���3����'���>5��y�Gs,�ci~ ��;
���O��b���
��8C���,�K����j	��&��l�����`�(�r���{$)���U�`YK�K�8y��}�+��Z��`�@i.l��&�����m��_��������`�/P�
�|D��
�5�i���N�b�F�3���9c���_����3����
��o��2M�Lsi��4J���.����2�^�)�]#'���� (�,a��427�M���)�o�E���?E&B1�K�mgb�$���_r�5�CF���:<���-��������j����=��Ipr
�+-:.��7�M}?y
?�����M��KYE+/&��V����}5zxK�qF���XPp����I�O��J������//@w�c,	h�o~c�.7R8G_
p�����<[T��^��+/q���N/���_���r�X.ILF1���E
����2u���z����8����s�lcr����M���C��M��S��^��sB�J!��h�x�(��0���3�Og��:�a����?�F���X�"� �#C���G�����n��[��p>����l����m���m���Yx��:��G�u=�����e�v��Q�h�<������������{����;��D<���a�@�����,�=�,���X�����vn�����������s�]@OQG��qQ������f�A����b|q��B�����_�Zq�&$�r��*`p�j�7 I�>/�y�q����5N�?<2K�aB:�)�Y�j����B����b�����@�C���F�|"���"������7����<�p��<��mZ%�^�Ck�d�t�>K*s�`_���s@�Dx(����y=���_{�pv���i8"��Re��'~�a2�������
jF��2������V���M�A3'����|�/���a��>
f�kL�LfZ�6UI��dr��^�ZG/�#k���4�t}T�SG�h1!E�)�+l��M* B��P�e���#fxs}8sg������f�%�m�m�n3g��?0���H�q'���_�$���*[C�YK�!=����C%��8YD$�V��J�Y��g��.��r=L�����j�z� ��]% 5�7�Gyx���c8�t�P�}8R;*�.�S��^j���h��i���y^�U�7��
aN��?`
�f��a_Z+����P/���7���<���4�'�]��,��c!���9�/p��m���Du���imz����������x��Zo����Q`xU-�f*����O������{n���\w��"w��<��R��+R���&�%m�g�+��1hF@�ht��,E]���B�~ ���'�o.��U���uu:���}�����u=+��,�w"��x�T�����J�yt(�|9fAM�9)NR���|�������`���w��	Kq�����A�T��f[Ld�I���bn`��%�"��L\��{n�)Qrn����B�{N�c7���T�R���:����Z�Y��4�}��M�������3���w���/>�ft�u���/������F~�I�*P,2xX���6FGi��������g�����lC�s:@@���`��pvq����n�e��jV_[*��������^�iZKt�x����"�P����z�vg'>W	@�Pqr���6*:8�=7t����8^t!#P�
s
L�(�Y�0�$��E'��OW���+?����'����X~��}��#���
�k�
�j��t�O�KWl���]����?�H������j��h�`�U�6��m��[�q�;#�A��*�M��&�Q�~����7���#�,����g�������(@j^�U~�?�����W�k��D(H+�l�H��pK�i1��(����0�u����Fka�\y�>?� ea��=wL6�;�l)Y?eR1�2AiL4�\%�0�%jPN����D��`�^��v`��G�{�F��j��KK/���D����s5����rd����`�`���(f��*1EU�r���&hO���}����E@>OS�a6\�L�[p]��"/����������I� �V"�f)B�0~��>Q_�0#k��ix_3�&���/3#��9����'���PR�yQ�����[<��'�<���Lg�X m[M����3E�b�2^y"E�)��L��,�:b��&k_M0m��I* ��P9�[5D��@cN��~��}����(�]��m#�/TKh�h�J���5�����c���]s�;�q�����r�mo�:�{;��&���T^�_����<����%����i�����T�}"�������\�l)�t`I��ON����2�T�j�3r��������4��5�=;>����<;}��'m�(dj�L&��m(�Ih����tMmx�?U�����6n#��	��������z��j�N�U[�ZuF�������0^��:xe����0����|@0P�H,$k#"e�&���V��e��P�J���ulf�4o��m8�����[�������d_N6#���=��A������\Z����������������4����E7+s�<Wm�3a�E����f���c�������!��
�0���=��	������E���7����"~��8�
��N���<��cw6�d$Ux��s[7���-�Y���d��n��������5����En�@v����{�V��������!�%;v{����c0G���f��\��O���
dk���;����O�3��?\DF�[��1��������9����'���u�U�>%�i��������H�$g�~�vItmh��(KF��3���5��N2���`��mNydI�g��~=�0����<�ZF�-BUy9&�Q�` �nS1 ��,�A�r��jz�=v�'������&$J	t���N6�`-��� ���\�kJ�����)9�W6�%b�j�����F�K
��WZj\�	�i437�U���Rr��U`h��uq){�����![;Y�R����6��R;	��Ytx���~��]u��us��n��	�(z)�K�����
�D��]"5�%>��^([�8/�����L����R�[Lm��},��O2��Y��I�ybS}�E"Os�3��AA���/�c+���1�t��R��}tVa���o����������*�����+\���K��w������m�^�f:���������n/����KZ��4A!�I��p$�ym�=��:w�������=63���y�t
��;����z�CW/���)��&����q��Y����ePF)'��`<�&����Ux����-��?��eq��g�~���c�7��gP���W���"���4����L���aKz2�*p7��?!�i�����_����fv�R��H�N/a:���TfD�Q���j����T>"u��z�-K�Ji&3�!��4����:�������R7��l���F2��0�����@���,n|v��H����'�������VW��>wUfX�|���]�e^�e\�U��H�{�����}G+x�]K�#J�^~vo�f2m���Ed�t��2Evp
7�T�����E5��Z���.���i1P�,�t����M�$F+wFVA������|#���������}k���)7y�!���^_��xT���B��k������5y�����3[.������)c�)O��i��|��E�e/s���I���|$�G"3���?2��L�T/��%�2y�3��Wm(c��cj��)�ZL��LK���M�K�Y�.���g�$��%-mj-��0��'Z�j�(��n�~��g�)2�$+�j�u:���c]e�Jn��b�
�:j�(�"
��{�-y}�z(��]#����^,��� ��{����Z��^$���0���!�%Rf�JW
9�f�����N���U!��Ix�U�h���
5YN1�TW���fp{2���,/�p�Gp�tI���by5sV��2-�n��.��A��Q��ZJ�FM]�E-��E
��=�4
EL��6`R"2j��u��k(�� D	:�������%d�U2RuA���G���VI�Lx��4��!6��5��[9�;�Z�I�Kd���;�8�g�i�u�q3�:�=i��&��v�1O���������-�tl��a.D���\LQ��L�������5ys�V�f�E-S��\tJ��I��Yjz6omz6M����gSW�w�R[BS}�R��tV ���{Uz���$0],25�X
����E�~
��!v��U��
��f�	�/��������f\�B��x^���R6���s��;��o���X��U9�5R�-���]�.��j�����/%$��1H�������$�e/��E%
_y� ���k��">R'��
bV%�lq�	�v-*�&nM����M9z���6?��%HV�B����+.�I�,u�����T��&��]'y���3�q!����f����ik�X���ai,�G�����i�q���6k��������+�1b���X��)�dz��0�9��t�����y�V2Q�d��q�������M��"J^��7I\R�Q��#V3��qZ��.7��7��#�j_=v$�/��d�)<�N�O���h�'2U�z��L���������P���e����1���(��rG������}�����Q�#MF��^�OFY�Q���
h�R�7+V>���~�2�%K#�`�����Wv�wz/��p.C�o#/�O;���������Q�6pkP/���d��b@#����J �^)YQ��N
���������*z�<�����A�:*���jf#l�*{�0�x!&%��W��"��v�rW�����8L��je������u��G$c�|��x�,��Q���9E���w��.��������}pI4�)��Ja��ThN��=��
fJ��"G����6���=>�n��x��*�#EL���]*NNO�������U1�
����)OIvVN����nR=kQ�"���#N�w	R6A�U�k����M���?�_XTk����c��BZO��b{!�������:'�K����g�'�r
B�1��$���.,��6II��y+��(���Z��f�E�^�{R���Zy�����X`:����8��<n���m��wG�r�7����n��E�����^������;Y��+�"�8=;C���w��7G����=;���+u=��
�����E��6G���-&�d9rKWAA����D���������]��(K��H��E�R������B(��X�"��D�-��t���<�7r�,��I��31=f	1�\������`_~���`8����G��z�������L���+���>���0W3�G��/�N�z������<w�#�F���<�AdC�����Lrn�����a��(>�n��&@l������M�^�����=
��Z*K��)�V�=�rTK�n���[3�iFj#��|6��n
k�'Z��g-�m�.��=R�����w���� ���G�v�(��m���
JZ���o;�5"����_�*;��R0���*�&}�M�O%����<��-6�o�O(+��9|��R���[�����~��w����
5��x�&����X��K���JF��N�A��]���W��r:e�q�G�h��|�\�����`&e��6y�f�wv_���V?c�B����@,Zg"��T�M�e��@�e�������6�����x(���zD���ty�����hU�%[���-�������V��m}��f$�R�n��2���T6_�jO����Q� �T�W�z�x_)����h�Z�-qA�����������g�h�LL=��y��2��R�'[���k��l��W�s0����N�&��gj�"0V{n(KH�~������Z�����q������R� ����"����7���.��ax��a{q�L�`Y_^!s?�^�f���B��U�`��������
7�D�=i;���0��l|M�
�>O���S()�L��A�������s���}S��8�F�=�~/��$A�D��A�&�-l��4�s��6���(/w�3L����k��Q�G��y��S6���>�r���k���a����.k��x�S��������i��(D���a�'z�%D���Qzg���R���q�����K�0{�e���Fme����p���Y���1�����MM���&�o��+�7��L�M)]�Ls	Evk���1)�l�$$��74��\4u�#���R"��T�������|�"���lK����X�,(zk|�%D������zF0��d2�[B�B�,�(���B�U*!���Nq��0���)���������$"�i�#3���tr<V+��� a��l��)�V5�pd��rSQD��T��(��B���'���<W��/>�nh��Ld2|���r�-�'~���7PQ��,�Pw��{��I!�90��y�+Wr��X9�_Ta�_��u������m���8���*���x���8k4r}���������f�D��-*��HY+)��f(I�����)�"�kx���Z�u���a��G7��e�I��H��2r�����&�|��z����'��O}Z��,l�M<�]*���90'�Y���o���-O�9�SFx����(�H)�=�=���I�E�&��q3�p��>Kg5�*%�G����c�fSZ�:�&�#���J�o��e4�Y����L�bS�L�Q���4V�V?�dRR�Ckmm�G�5��>�i�m�GZZ'��3
�h��c���Rz.����,��$��0{}���� ��y+][)��U���4��J4���%��]��X��j�zI-�)��l�����O��>�t��`��M�`��W�d���������%W_V����i%W�(�z*K����|@=�U��|�_���[Jq���H��v���3{���M4P~��(�������pg�UM���W,��j9��haYau��^��)ud�����
��R�:N8�T���*vVE�X���2-b�_���+�JL��[�����hU��6'�N�+z�@����Y�#�_��X���D�y�c���Z_m����G|%��$�����F��R!��GY��FY���zM��/��e}���U����Z�b�l�t�����`�mB���=��9~��.!2\r5���?P�g�Ee���a�.a}�`Z�?������4��,=�e�f�Z���=��I��I�Yt���2�f�n��X���3�?z�H�cK<j������fo��@M��P��4�)P�iw�lEdd4��[�!`J�x�a�4W����Tu]h��>S_����,��d|�j����%r+�6�Q������zH�GQ
o,��O~&�%�eL�����2����/�q��-����l���{�������{��V>���>U����G�c��)_<M�WZr0N���8+m�6*ACy��U�����U���;Y��d�-�s�5MWlUPy�i, �
8r�kj�5�f*����V�
L+
��t]x��}�6w8��L&�/>����}����]��'��s.n���2ro���K��^b7��&��K`�5jf�k����+���
2-��X����J�.���uL��"SFg�{�����a�1
�"�������Gk��������_�.~�W���F6�\�+�B+)�V
rUG��A��^X��-���<~U�UR��Y�N�����1 ��'��f�z���������������q��"oT
)#��Y
|�:xn��m�L��d�vorj����wCM�{Ed�\U�A!��T�A��U�N]����^��tF���|�e����3X����v�KS\<����*�L��r�98���<����^��P�c@��)Pf!aH\��)��J5$'6Sg�n%�����?/���u����cEg�W�r��	�=�d��n���DT�2������<����59�.fb��]]���vU�[�_L\D�:,4�'�Z@��6��r������+����]��7a(/�\�l�U���C^=�i�����X�C��W�um7���[�%Uz��y�p�:�v��[DL���`�M@d��R�.��i�vU�7�:K����O���|��Z���H��[��?�h��Y��+~��@"B,q4�<��e�r���h&���F0+aj��2I�Y�}-fp���@������fU�jQLK�,�2+,�s3�%"Y7��jS�l�lL�N��q^�8�WZ0�]��6)et���8��6�"�e�!�4�:C�K�������E\~�Y,N,�Y��OX����ZDn�{�"�BJt�}�D��|m*~[pe��'.P�g�����c�+}�o�=x����$@%�����������/ ����A"/���
Lv��a�hK��C�7,bsl�<����q��.�z�dF�7��p�������^�0���SjF���������o|a���(��#W��%���`L&��*T���g����5t�F�6o���	�p�	O������A�)@�[B
r���_��&�r8�}x�������������d������_�c�tT�B
��r�zu���t�K���I�]�Uu�DA5.n��@�zUt#a����e���@ZDu���)@L��g�g��4�|K6��C/���)���Z�=��6F\�p����������r���a������a�%`g�9 X�e��G��U�J�v8�w�W%T��(,���X�f����-D�x
��&����6}�2�\s=��fp�t����r���T�R��P����T.T#�X�������9?��_1Iq�t��������9��% ^@�9����K�I����;5%S�����P�l�������Ba]���\�W�}��
���F����a�@���W�I^t�D%{�D&G�J@�i�r=�!%��2w���D{��pY����i���C���W���<�6�fR1���$"�NH����VT6��L6�����1~�O�vOw<AuhM\�_l��T���0��C��X_���^#19�UD��^����������S#j��hL�IZ�_��v���K�(��J��0����R�K.S��f�l��i�$�@��d3{�	MT�3]�N:w�7K$�)f�t���yY��
����G�^W��3���W�j6����
��0%o�Y+~���k�0BI�5L��b�K��OV�8�����B�Vo[�
��L�e��I]D��M4���Y�=�\�XDrWpw�4�
wwmwW@����`M���=�%p���������^Q���+���/�����J���	�����x������1}|������+D<���[kRW�a'�F���"��KEdK�u��:j�����8����]7�iY����m`�I��T��C#d��.�B�h�+{5�
j����X�_���O^�L��wM\�^X�)�.@��f�$76��������l������Ki���U9kU���F������������H����Z��Z��K�F����g���~��V��v�~��������G?P{p�6�Xi'��W4��N��\��e'����D�qnR@�^\�al�qE�3�$�����Sl*�T�W�+��('C�!�G�S�>WU&qn��8\z��U��9X�8��8�5myRH�GP�2�'B��5W�65qu�d�9���nYuS�1}���y��xI����r9�W�"�Eq����qn����F����-8u�����).�V��v ��|+O�v��M��Q�gH��W�nb�/�Q����1�����JA�K)L�G.����7��=(��x�_&�TA�
�.m��
F�E�d��5���m��w�-�*������L�?k9k�?kJ������|d;5�}���Z,/���G���.���"��v�E��.���"�x:����.5\�GU
��8��J{>nb����)?b�c��39�/����}(�b���F�|H�1��!^�x2��I(��J�I��-��Lh~(��L���'�r@�r�M�Y�K0}�|�8��s��1�tj b���:� �8�w��<{z�����!�d�b�K�^+S�����zT����"Hc2q�a��Sv7l��T@\P%9�b��;��`H2����J>����MfHaA��L���obD�����n�u��k_�(��,.��
��?�Gm-;=x�^^�E���;��5j%��VR�N�G���D����E�=��������r[c�e�i+5��k-�+��_���,����x-]��#���C��ju>��f�;=�U	Y�xWX����y��_>ax`2��~��c���o�z$4�1��#tV�U�i�W�J8ys�n	��d^^��E{�Jib[1���������� �|����o���-,������~3v~
��2�������Y+��alA���g>�[�9��qc#�a9���7�My��g\�pl�~|�<-��������nR�S����,���pd/xo�\�Z�-6��kl�.������e�+�Q���p�KC����L��1B���S'hV��x��/b��76��~��~	��x��[�,wz`z��^d��x�;5E����*�/������m�F�|�G�e��"�y!����C��@w��4�<�~��r�t�G���rOd�5����3D��c��n�&�?p��R�;J���F�,9��K��&O����	��������?�b[�[��������;{v���{�Ng�������e4���t�<,�syo�a��8���,6���aRC��c�3�������%:��v�k �V����ZO���4��m�_{��R����7��4ZO;OvZ��^��+��bH���-;}{|vtqz���::?gC?�E�p�w�'o^�S���gG���sk���^���?���.�!�s����Qf�pq�/_�2��������z��Rm�)��e
T8.}t�Ii�����Iu��,�G���bThaS����reK��}���FHL�-���e��|��|����1�D�J��'O1������:*�������C�B8��~��)�qAY�MY����8�VE���'"l�y���_����[������O���F�*�tI�MVF������X�P��L�??(���_�AvXJ��j���R���a�bO�V��r���r���\�)��C2����(�4�Y<Z\[�!<-�����T�����T��a�sZ���J@�� �d��-9��������ns\�M\�(Y����B<��.����ey���E1�������Uu��R"yi{�!�������KC�-d�Yl�����st���|i���t>vc�����)��L����Mg[��hE>�q��6�TW`bn�'��1���������������fn��n�z�Osovm���hB�G]mm;G41cL�����N2<C#Ua���w��K{���<�z�����y�}�4@r�4�F�f�i�[�3��+�m�y���OZ�';m����fl�XB3���L�����k'T���=I�l�T�x����(�4OwM�)�kx��b�����q���z�}����asw��1�P�Rc�����zo�mib?���|�,zI�����>F�%<"\���������V;�'�J���i�o��L�j���G!M��M���n[�x��(���d��������������aH��x(�x&����B������������h���i�[	��w�m%�Y��Q��z�WpR�[��1Z|�`������[��`q��+�r�_�Eug�E�H��������_bV�������������;��w<������sG����Kb�{M,�������Lj�Jch����6��]P������������JP�w��8j�,���o-���o��92�B�� r���a6-��d!O�R"��E"�7!�����>V���G0��Z�����;���E��ZM����oC��-+#)P��%0�B��A�y�<0����N�$�]XS��O,�0�8���-����:E+��m}0�y�R$��t�+��H��f������P~kan��Ys#��G��\M?���_E�dG�����XI���_V�����*-X�U�eo���&����_�5��+Ha�$]��&�q�4p	I�pEs��f)���"+89�n���[%9%�S(���2 Y�{5�J�v��T��Z`��@3b�#O�!)/�4"������Y	����V�0��/I�'=���|����a����`]����kh���~��D�v�v�G�GI�(dH�	����`�_yq�4���$X����g1k�M��;_Z����p&D���8���C�O�����_�D������`����ae��m��v�������i6�TXt(}��9\P��k�]��F'�������
�����Akri�T7����{G	����C����Cx6���L�aE
����^��H�F}�����r�"�����%B/��_�5�����	OZ����8���r����,jM�0��+��R��sLK��?!z	|[��/M����k��|w�8[<��*1��2�����
�vi�T/���|ecM��p�b@n�['���Bz�;���<������PfU�s!����Q>g����J�Q���w�4@f�|��lF[�(���	0�0N.�8���1��{�x�)Ls�)��8�����/���#�A+��m9���A��qy�f����-����D?��c;	�1��i��Po$	Jo�<!#��>�.��iN���6���7�%%��b�A��	�
�#V��.?���~2�t��6�qd��j�p��.&i�~�y��~�	<�C<���"o�J��n�����q�`D���`8���	������"�6;]H�������������:#v��-�i����M��������r��AO��:Y,_���Wy�T����A�;��
����`��^��.�.�D��gGR0�%Ff�����-��!�h��-2��v�s��������~4����/C F�����.^+C)6E�����_����`UW�#F���!a�u�h��WA#���8����&���`��k���Wn��l'��\�(&���#�
�vA!=�@����[cW� ��o���j��a��F���X�f>�.���'f�!��)��/:,��&�����/H�#�H-G��
�T�������/�7����Y��rR�j�d`I�\���9m�R����_
�,0E�*J�i9�<Q��^
 ;<ip�����(�#������^D/O��z�K�RR�k6h�_�2�|P#����{�3�jkssS�������;��Hh}�{a�����$Qd_F�Z����_/
Fy�8\�.#�2&
M���:7�����}I�gR�,�D�����O�y�l���vJ+L�N;���@?	�����3�TK�h��5l��,���g�{����Y]�.5��Tl>H�����6���M�>�7m�eJy��b�^k-�sVQ�By	%�QJ�,�����utF����#�8I(M���
�s�5���,p�k��\wZ�P�5]��_�(��?���;Zwv��>WG�_Wu���7��k5�gy���Q��F����\D��<��h���jW���k����p���dZmg]%BZ
S�S�8�[!0��L"�����t����_�A�w��T��fk�i6�-�Y��`O�OCo������u.v9��Z6�fs�	CLRv�?��l�c����<����mW���Y}qP���u�����{�`��aa�������2�Yn�d�7����F��1�F)P
�f\����	y.Z�VT����7���n*��.9D6���k;;{{������k>��������1���7#-?�t������p�Bf���2%(��n?����]>X�K��J��X[�1����a�w9�����L��y1���y������~2���AW�+z���n�����NB���������5����/1�[0���h�:��M}6v�`6�v������c<d���*
M
WP��:&q&:,g�������n�!��(���v#Jf�����&NK�%J��������E*���~|MX�GP������]�����1��W���b�����i�xn����y�|DL<`c7�����Oc��/�����g���6=�Kk_i}�T{��y�
bw6d�]����(�l:{^>��CQ_��.1A$xz������Z����s�����F5�4)��jTLU=��=�T>��~���4[���j������Z;>HU=H�;��2,�b��c�n�~��	�)��^��`b��4�C�~��\�����
���;&������#�g�9��^-�W��$������l���c����������r�7Rq�@���X�:m���~��{�-~i�H�I�	_3��^Rs�+��S���J��):�l�����h=��9 ���G��A����~9r�x���a\a�`Od�)e���w��	���ks�2]!sm�K�������t��2��:]��,N��y�;��������d-�9C�2�&��rr�U��9n��+��5N��,�lN����bm���5��k9�F3E2W����zm�T�^nA3���5{�)/��r���z9����.j����t-�g�:�����I��ZT����t�%0`KS�T��H�e�,�V&�k;F���4w.+�/.�o%��9�D����K$�j���Y����5zK��gk|������&5C���Y�M�V��rm=_���s�/.C��C=�f?��p�j����L�Us���q�����V�����g��HmV�P�jy��n%/g��
�z��n8&k�US�-Q='=�-��2+������|��^+u|����%��Y_���$��N�i������b����2U��%������v�M�%�*��N�k����%�b7����Fw�����L
��t����������@w�����d�Z��Je�*��)��������g�/��g����A�<�w�	�-���T-��&M&��HV.���<�,����e�~��,7��62��[>�JVhfHY\<�����L�k���?�jK%�0X7���|�0�F��I�[�R	,�*���V+�
"��)�5���p��r��V���0�����i.���0�e��E
�:�]�@�C?���y]�����v�j�K6��B��w�:���|����eN �l/9�Z���M�e��5J���UtH��A�1���m����nv�PoD�y'K�5���9����#��������a����;-f�6�N��EV[�
��(�}$}�)��?K���U
�:Kd�o��>��2�nn����,������n9��#m2�������\�|��g��y��a|[>�MX�������M����n��T��#7�I�n8�����F�i7���[��������c����zj7�N{;�R����p��m-bGT�b���R;���R�|�t��z�H"1������}r��������m���������?�r��YB��'`��Z�\j��}��!zh�x}~����'��G'1l�6���'S7��u�O�
<�Aum���A���������FF7�_��Q<�y����/��!��L�x����)m���Q��S?�x2��g�c>�B�}�)���x��a�i�a|�b���>���fx+ ���
��\���0�{��Fn��h���G	�Q������>�y;��*d��f��.X0�!�?�;���?��e�@��*�w�[�^�`
d��=���c?t��o/�v~�?��z���������y3^��b.`����Eo�����v�KDp
"	�c�7��(�w��3hg:vc@��aW��D��p��1��cG�XI��o������/����&������{1q����2����[���Y�`Q�����
=�1`�t�#��'�&��~���q�$S�<�p�C���w�a��zN\�1����WCJ�������gP���*�|t']�";mr.H@���#U��HHy�} �'�$Z/�f��7�`��Xh�?���|X��
�fK3;��,�k�sE�FTgaA�-N�U(��T �3�s�����Hc��w^�:z�ys������ON���r��F~o���r�h�;�i�
z���W�;��;i��%o�Q���5�u�H��s8��F��(C&!d�����|��>�����`�"RU9T5(��T���������e�h�	p;}���l�������"���M2o@�N����C�d���$A&��&�(��?�M���J��o�l���d��)�/~��� �h�O��M��L
��
np
��H������]*��,���kP
����@T0�a�����?���<Nd#�S��F9�=������^4�z��|��&0'X�Z���]��P����k)�A�y�x~lvg��d&�>8<�7�z#4�/���\EF�|�n�*Yd�&3����5�p�C����P����{�
Q������a����
�������7 @��������A�#������P����y}7v�j����$���&�XRV$D�������@U��LH=N�|7{D�C$%�D���G	����SRG���</P���V�f���
��/���������v�?IMB��@y����P�F�x7F�{�'�/�0h? ���0��7�&pH�+P��q~�w��|v"M:"�3�n�� a-���=��f�c�c��[[�,��W��FpY��.��.U�:W�:m\2��G#�r B�{��}�&@���
�������Q|Z�� {�� v�������7��#f~q[A�/���E�i���
.h/�L7��`i�5�B�?���������_���$bF��!8�D����B�������bs`:v/}�������'��)�?�|��a��hwO����>rh,�hQ�W�1r5�V�(t���I�aw���N�\7(�5�_c���4�����/�3N����]m
��]?3����c
`��TS�J���?�),)��h)�X�-Z_��G��KD��~��������wq�Q�\���'�F��&��V�?�n��;�w.yN[�\8688e�$B�HH:�;�,��J,�����"%�]����r�R�����[k8<�L@�8�h���9~@�~�+]��B�(p2��'�u#��QD_����?��������f{�l6�&s���i�8���F�4��@d��Os�=8����AJM�kC#d>�N��� {�bh�K��JJ-������mjI�3�+&���N�A6&!gIpXj�&g����JQ����8K�K�����F�llH6W�P���������is�dF�@u5��6��j! �v���c[?l�{�!j�D�t�I�V�
QsN����\��P
���jF�K������.�1���y��$�B����	���E=�i���2���(�I �	hB�U���<��0�x��a�8?>���?C[�����9bG�P�bt�����x;���o�L�S+���z���06n�h�6��I��e���:��d_�4`���5h����A�i-b�kO��@�.��������X�+����k���LL�}:�#�Ue�SQ/P����w�-K���=��������@��'r���/��a��P��V�akM�z�~)��+���@����d��jcv�G������N�g�������a��U4��{Z`����ca��a��g��7si���*T;���V�B=y���4��Y�y+�RS�1�;-�wJ�[���l)��V�<��H�g�p�<s�s�w�{���V[��gp�S_������9q���4��G�3���[lS��;�DNp�H>Q��+���1���A�O��o+E\��i���y��>��������~6�
�}�%SY�?p����y��C[��,�(�s�z���G������Gq�������;�f�����#��j&�5<$������S�����L�*�D-�s0����w!��4���A�_#�sie�[O!kcqd�^	Ur"M�Ov��VV�����q����!��
w��C����v/�`vhq��r�io�)$~��0Km*�z�N_��cP%�����0�`�e=��t<R��@��I�������U��z�������[��D�/�WJ�T��ib�I
{g,.l��J����). �Z��
R�}��D�C1
��:
�G!9��a.��y4|���,����59FN��}]���b�SSct8�K��5��2T��?����rAgAhBA�.&[�LS�i^�p��dl������U0���pVVXg��*Y�����s��F��R��}������B�3E
4��e}��������=v����X{-�d&��,A�k��C*HJ�n�? "�d�7A�
��n��5z���y������r~�|�q�����o�A���y��(�����������%��cJN��b�
���_��1���!A����,���O�M����LQb�H�l.<�V���'����5���\a$(��)��M_�����8Hb��j��6L������`
v�`���t�I�!b�95�r��7]�`���:����zJ��$�e�<���[EO�m<��
cbU4���(��l���]�)�����Td�� ��6��z^E�?G�a�m��Q��Wo[�Z����a���x��!I72Y�����~l�]o��-�rX�5V�wr&EBr�)�;4�����g�lS���3����|us�Q��Y@�����!��,��X�9s~�(��'c=E�p���O����S�7d�8�l%���L��>L���}O��p�Za}�&�B����'�z�"����{��_{�6�)���S`�������AGc�����r%A&��{	+	�A������NEu4�a�a��.���8	�c�B,0���+�c��N��QvF��*!zqh��1Z��}
���i��OK_?���u{G��O�i"*@4N�R�q�1L�������Q�p�l�h�d_P�k�>-�E�. ����_m5�%��F��w���TT��������Y*3���#�DVv9��l����Lj�Eu<g�]�s8�p�8Ub�z��{�>��+x�Yl�5�V.s����@�B}�����3]'��
�;��d�=,����,�ee��w�%�)����c����}�k%n���V��i+!���VF�
l����C���b�����ld�,�����n� ��:V���V���p�����^�������r|K|
���}���1/-�-��q�!e����A�������������L����,fa������|wp�����wx�>9l�9:��-U<dS?�m0{��n����wt�vmf���2t�o�����������������Q��u��a��a�N�w�Ad��������`�aj�,e���l=����l<|��*��~f1�z��~]�S�D�YW��.���jT�}j
��)szf���[�k�95�����#(�;�W��k��"���V�C����A�@V�Kp���PR�(���H'�����	�9��9���F���F��������(���������"0��
�B}�G���w�C�j1�0����I���)�[t��Z������������b&�������<<qPs��&�c��Y��v^��9_�
3'�ab8D.�^���`�s�;"���Yu��ye"�H���l>5$m�TXs������zt���L�s �u���?F]���Q��'w��L��)�����P"��X� @"����z�C��*
E�zg���K.X��9��x�*8��Wa�T�"��VT�=����:�!�m��z"f��lS�
�f��N{#�-`���	���A&$��x>���L��M��o��AYR��;�i�nb��o;����sPTD����V�'gt�!_3'�4�<�8��L$�PG���i	��3d3)��^�S��E�3��&l�p��n����h8�{��������:�����AE�r�%q�M���v��X�a�d��?:��o�D�d��/���-��$��I��i��z�*�E��]�s�$!�0�R�P">x��a�����b �3�a�����`��L� s��u��q�������1�����$R��l��mt�@����>��^�dvK���%� �n�d�RX�#�8)~��c����N��g�v=�^�����W�"�&����K|�����A��dCJ5ljM3Hn����yg�;NB���:�����0��
�*���Y���1������6}�lU��������kw�����S�)}��G�G���>U�>DNy����Q7d�]�T�����Y�,��*�,����@1�Ew�qk��&!C s�0��8?}-��&	SBIT%�����@�|����j#8���]��J^� �\ �S�\+-MS����O����l��=�7Q!��E�w�Z��C[s��Z%qr����Ka;���Jg�P_��G��_�d���,�1u "ch�K�?����(��O�m~]�l����
�3�m<�����/��jj�cT�&�a����<�Z�c�<
��KS\�C���;�� �����_��@�$�o��/�?��#m���k���y	oXw�+�D�Ae��\�x�
����
��_E�r�E�[����
v�[
���r�sjJ��S�^$�6[O������cj��(^���jJBXo���~�`�'���a����!��|�oF���� ����A������i5O��2���9����j���o�z<��������~C4k�w���n<���3V�K���������%��7��'���x=����sT�����

�z#���A�<��:byu�$~vjk~8���K?C�"��HZK�9=�}-<���05��B�3�v���U��V�����
~���i�e>���u��L����e�I��0�T_��v�m������*�%v��
����>��'q(o>��q��w�1��!B�oK��/����8w�;Y�z���yEm��G.��kF�:�1�Y�\���F����X�|�`6�+K~k��N���d���h�����������K$��Bn�/��n���������=A������������y7!YI�4�����bIS��2�L::�����K	���1�\%���M����d]�4sM�%s�q_����7�H�|W��x�0���^�=uj���<������3]?/���g�P��+P�4L�%
	t���@�������`�G]��o����1�9���+�&U�>�cJv���sv{(��2
eh@�7�ds��D�'<��G�p�.h�u���k���~�=W�<j�� �R��a�'U�����.4���'�N��[��]n�e�`1%/����������E
?���1����sd/�.8yO�2L	
�����g vY��,b��s;��Z�q�aotN�+��q��Kc����gS�=�>�
�gi�ko�\���.�o����HA�0{��>����0]�d�X877E�8	�F�U��x
�-�H:��?����������S��4���^�Gk���'�K�Y����R?Z:y)()?V0lZXR�g��d(?BZ�{�K�#I3ScO����t$L[�Hl�����!E����r�:��G���"���N��+��EA5�*�IE~p6��������>�����{�9:~�^}p�Qg���O�h0{�~����\\�@��)�a�.O��@r��J����#��k���`I�4MZW�a������$�B�Ft>5�+}�	��J����~QIp�*��|"g�T���i���*X�f�Usj[V(m���46�����)u�n��Su[=�%�UG�^�;x�fT�j_��������S��Oq���<���{�T���f�����~�e<������V�������{o�[]Uvku���U���	������v���s������Ef���m?=!L/���K�:R+ju
���J����X�G�6��,����hD.�!�������,j���"{G�������������1���W�9��k�����ll�[������h_x�_x�������4��
��mg6���R�����_��j���:��7������S�Y����v���<^K��x���?
�3�����M-}����V����A���j>���p2)���"p�f�,xJ����(@���b�����UU��yx�2��j����\B����#��P�����1q��Ko�M6�s%��3����':�F���z���bQx�W��Z���v�ZJ����$����M\���S��'Ya:|cbi�@%(��(�RG�Z�o�5Gw4����|Ok�G^������������D�+���W�(����oQ�"�x��������-F��M����p�YT���.8&)3 +���UR�<�n���)�W'�jU7����J�$��t�������Z���>/jf��V�/�R<{����,��3-/��`0����v���{��qm�P�)|��'@`�@�
A��}K���a�|��5��.��*����.����p��/�|�t����T�����y�9P�����!��E��>�k����J�L�H���\�^��T�Fc�il=�U?c*�^�����|BG�����&�eu4F���;Xc��-���[���T�M���:c�a/g��_d����/�pD��#8!!(*z6}�k���[��?�%�W��������g~<������m��_�q���
#2David E. Wheeler
david@kineticode.com
In reply to: Andrew Gierth (#1)
1 attachment(s)
Re: latest hstore patch

On Sep 22, 2009, at 7:18 PM, Andrew Gierth wrote:

Hstore patch incorporating changes as previously discussed.

In addition the requested new features of conversions to and from
array formats have been added (with docs).

Thanks Andrew.

Just a few thoughts for discussion:

* From my previous posts: Is it time to kill off `@` and `~`,? Not
necessarily for your patch to handle, just wondering what others think.

* I like the %% operator for converting to arrays. Though I think
maybe I would have liked %@ better, but maybe that's just the Perl
hacker in me.

* I also like the new %# operator to convert to two-dimensional
arrays. But if you adopted %@ for arrays, maybe %@@ better indicates a
2-dimensional array? I'm just thinking out lout here, I'm happy to
have them no matter what they're called.

* More name stuff: Why `hstore_to_list` rather than `hstore_to_array`?
And I'm not sure about `hstore_to_matrix` for the 2-dimensional array.
I guess that's better than `hstore_to_multidimensional_array` would
be. ;-)

For those following along at home, here's what these guys look like:

       SELECT %% 'a=>foo, b=>bar'::hstore as array_op,
              hstore_to_list('a=>foo, b=>bar'::hstore),
              %#  'a=>foo, b=>bar'::hstore as matrix_op,
              hstore_to_matrix('a=>foo, b=>bar'::hstore);
          array_op    | hstore_to_list |     matrix_op     |  
hstore_to_matrix
       ---------------+----------------+------------------- 
+-------------------
        {a,foo,b,bar} | {a,foo,b,bar}  | {{a,foo},{b,bar}} | {{a,foo}, 
{b,bar}}
       (1 row)

Pretty cool!

* Thanks for updating the docs with:
   + BTREE and HASH index support
   + A fix for the populate_hash() pasto
   + A link to a discussion of backslashing and SQL standard strings
   + A note on the overhead of reading the old binary format
   + Notes on how to update from the old binary format

In the attached patch, I made a few tweaks to the hstore docs, after
applying your patch. I would have created a new patch with everything,
but ran out of time trying to convince Git to create a context diff.
This is a unified diff, but short, with just these changes:

* Fixed doc pasto for %#.
* Noted in docs that the format is new in 8.5, rather than "this
version".
* Eliminated a redundant "However, ".
* Added an example for creating a HASH index.

In sum: Modulo a discussion of the names of the array casting
operators and functions, I think this patch is ready for committer
review.

Thanks,

David

Attachments:

hstore-doc.patchapplication/octet-stream; name=hstore-doc.patch; x-unix-mode=0644Download
diff --git a/doc/src/sgml/hstore.sgml b/doc/src/sgml/hstore.sgml
index 08e0d7b..442dad5 100644
--- a/doc/src/sgml/hstore.sgml
+++ b/doc/src/sgml/hstore.sgml
@@ -203,7 +203,7 @@
      <row>
       <entry><literal>%#</> <type>hstore</></entry>
       <entry>convert hstore to 2-dimensional key/value array</entry>
-      <entry><literal>%% 'a=&gt;foo, b=&gt;bar'::hstore</></literal></entry>
+      <entry><literal>%# 'a=&gt;foo, b=&gt;bar'::hstore</></literal></entry>
       <entry><literal>{{a,foo},{b,bar}}</literal></entry>
      </row>
 
@@ -407,6 +407,8 @@ CREATE INDEX hidx ON testhstore USING GIN (h);
   </para>
   <programlisting>
 CREATE INDEX hidx ON testhstore USING BTREE (h);
+
+CREATE INDEX hidx ON testhstore USING HASH (h);
   </programlisting>
  </sect2>
 
@@ -474,13 +476,14 @@ SELECT (r).* FROM (SELECT t #= '"col3"=>"baz"' AS r FROM test t) s;
   </para>
 
   <para>
-   This version of the module uses a different internal representation
-   than previous versions. This presents no obstacle for dump/restore
-   upgrades since the text representation (used in the dump) is unchanged.
+   As of PostgreSQL 8.5, <type>hstore</> uses a different internal
+   representation than previous versions. This presents no obstacle for
+   dump/restore upgrades since the text representation (used in the dump) is
+   unchanged.
   </para>
 
   <para>
-   However, in the event of doing a binary upgrade, upward
+   In the event of doing a binary upgrade, upward
    compatibility is maintained by having the new code recognize
    old-format data. This will entail a slight performance penalty when
    processing data that has not yet been modified by the new code. It is
#3Andrew Gierth
andrew@tao11.riddles.org.uk
In reply to: David E. Wheeler (#2)
Re: latest hstore patch

"David" == "David E Wheeler" <david@kineticode.com> writes:

David> Just a few thoughts for discussion:

David> * From my previous posts: Is it time to kill off `@` and `~`,?
David> Not necessarily for your patch to handle, just wondering what
David> others think.

I'll take them out if people think that is appropriate.

David> * I like the %% operator for converting to arrays. Though I
David> think maybe I would have liked %@ better, but maybe that's
David> just the Perl hacker in me.

I originally tried just % but something in the grammar stops you using
that for a unary op.

David> * I also like the new %# operator to convert to
David> two-dimensional arrays. But if you adopted %@ for arrays,
David> maybe %@@ better indicates a 2-dimensional array? I'm just
David> thinking out lout here, I'm happy to have them no matter what
David> they're called.

%@@ is a bit on the ugly side for an operator I think.

David> * More name stuff: Why `hstore_to_list` rather than
David> `hstore_to_array`? And I'm not sure about `hstore_to_matrix`
David> for the 2-dimensional array. I guess that's better than
David> `hstore_to_multidimensional_array` would be. ;-)

I intentionally avoided hstore_to_array because it would be unclear
which one it meant (the 1-d or 2-d result).

--
Andrew (irc:RhodiumToad)

#4David E. Wheeler
david@kineticode.com
In reply to: Andrew Gierth (#3)
Re: latest hstore patch

On Sep 23, 2009, at 5:27 PM, Andrew Gierth wrote:

I intentionally avoided hstore_to_array because it would be unclear
which one it meant (the 1-d or 2-d result).

Thanks Andrew.

Given these replies, unless anyone else wants to weigh in on the array
conversion operator and function names, this patch is ready for
committer review (along with my tiny doc patch). I'll update the
commitfest site to that effect.

Thanks,

David

#5Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andrew Gierth (#3)
Re: latest hstore patch

[ starting to look at this now... ]

Andrew Gierth <andrew@tao11.riddles.org.uk> writes:

"David" == "David E Wheeler" <david@kineticode.com> writes:
David> * More name stuff: Why `hstore_to_list` rather than
David> `hstore_to_array`? And I'm not sure about `hstore_to_matrix`
David> for the 2-dimensional array. I guess that's better than
David> `hstore_to_multidimensional_array` would be. ;-)

I intentionally avoided hstore_to_array because it would be unclear
which one it meant (the 1-d or 2-d result).

hstore_to_list seems like a pretty horrible name though for something
that produces an array. I also note that "array" means "1-D array"
according to no less an authority than the SQL standard ;-). I think
we could live with hstore_to_array and hstore_to_matrix. Thoughts,
other ideas?

regards, tom lane

#6Andrew Gierth
andrew@tao11.riddles.org.uk
In reply to: Tom Lane (#5)
Re: latest hstore patch

"Tom" == Tom Lane <tgl@sss.pgh.pa.us> writes:

David> * More name stuff: Why `hstore_to_list` rather than
David> `hstore_to_array`? And I'm not sure about `hstore_to_matrix`
David> for the 2-dimensional array. I guess that's better than
David> `hstore_to_multidimensional_array` would be. ;-)

I intentionally avoided hstore_to_array because it would be
unclear which one it meant (the 1-d or 2-d result).

Tom> hstore_to_list seems like a pretty horrible name though for
Tom> something that produces an array. I also note that "array"
Tom> means "1-D array" according to no less an authority than the SQL
Tom> standard ;-). I think we could live with hstore_to_array and
Tom> hstore_to_matrix. Thoughts, other ideas?

I don't feel particularly strongly about the name (I've also
intentionally held off on updating the pgfoundry version of the code
until this is settled so no-one else should care either).

My own expectation is that the operator should normally be used in
preference (though obviously people's tastes will vary in this
respect).

--
Andrew (irc:RhodiumToad)

#7Josh Berkus
josh@agliodbs.com
In reply to: Andrew Gierth (#6)
Re: latest hstore patch

I don't feel particularly strongly about the name (I've also
intentionally held off on updating the pgfoundry version of the code
until this is settled so no-one else should care either).

Well, since we already have string_to_array, hstore_to_array would be
consistent.

--
Josh Berkus
PostgreSQL Experts Inc.
www.pgexperts.com

#8David E. Wheeler
david@kineticode.com
In reply to: Andrew Gierth (#6)
Re: latest hstore patch

On Sep 29, 2009, at 4:11 PM, Andrew Gierth wrote:

I don't feel particularly strongly about the name (I've also
intentionally held off on updating the pgfoundry version of the code
until this is settled so no-one else should care either).

I'm down with hstore_to_array() and hstore_to_matrix().

My own expectation is that the operator should normally be used in
preference (though obviously people's tastes will vary in this
respect).

Sure. But I realized that I forgot to ask for array_to_hstore() and
matrix_to_hstore(). :-) Would love to have those, too. Not sure about
the operators…

Best,

David

#9Andrew Gierth
andrew@tao11.riddles.org.uk
In reply to: David E. Wheeler (#8)
Re: latest hstore patch

"David" == "David E Wheeler" <david@kineticode.com> writes:

I don't feel particularly strongly about the name (I've also
intentionally held off on updating the pgfoundry version of the
code until this is settled so no-one else should care either).

David> I'm down with hstore_to_array() and hstore_to_matrix().

My own expectation is that the operator should normally be used in
preference (though obviously people's tastes will vary in this
respect).

David> Sure. But I realized that I forgot to ask for
David> array_to_hstore() and matrix_to_hstore(). :-) Would love to
David> have those, too. Not sure about the operators…

hstore(text[]) (which is also present as an explicit cast) covers both
of those cases since it can figure out from the array dimensions which
is intended.

--
Andrew (irc:RhodiumToad)

#10David E. Wheeler
david@kineticode.com
In reply to: Andrew Gierth (#9)
Re: latest hstore patch

On Sep 29, 2009, at 5:00 PM, Andrew Gierth wrote:

David> Sure. But I realized that I forgot to ask for
David> array_to_hstore() and matrix_to_hstore(). :-) Would love to
David> have those, too. Not sure about the operators…

hstore(text[]) (which is also present as an explicit cast) covers both
of those cases since it can figure out from the array dimensions which
is intended.

Oooh! RhodiumToad++

Thanks,

David

#11Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andrew Gierth (#1)
Re: latest hstore patch

Andrew Gierth <andrew@tao11.riddles.org.uk> writes:

Hstore patch incorporating changes as previously discussed.
In addition the requested new features of conversions to and from
array formats have been added (with docs).

Applied with some mostly-cosmetic editorialization.

regards, tom lane

#12David E. Wheeler
david@kineticode.com
In reply to: Tom Lane (#11)
Re: latest hstore patch

On Sep 30, 2009, at 12:52 PM, Tom Lane wrote:

Applied with some mostly-cosmetic editorialization.

And there was much rejoicing…

David

#13Tom Lane
tgl@sss.pgh.pa.us
In reply to: David E. Wheeler (#12)
Re: latest hstore patch

"David E. Wheeler" <david@kineticode.com> writes:

On Sep 30, 2009, at 12:52 PM, Tom Lane wrote:

Applied with some mostly-cosmetic editorialization.

And there was much rejoicing�

... except in the buildfarm. Must be some platform dependency we both
missed ...

regards, tom lane

#14Andrew Gierth
andrew@tao11.riddles.org.uk
In reply to: Tom Lane (#13)
Re: latest hstore patch

"Tom" == Tom Lane <tgl@sss.pgh.pa.us> writes:

And there was much rejoicing

Tom> ... except in the buildfarm. Must be some platform dependency
Tom> we both missed ...

"oops"

--
Andrew (irc:RhodiumToad)

#15Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#5)
Re: latest hstore patch

Tom Lane wrote:

I intentionally avoided hstore_to_array because it would be unclear
which one it meant (the 1-d or 2-d result).

hstore_to_list seems like a pretty horrible name though for something
that produces an array. I also note that "array" means "1-D array"
according to no less an authority than the SQL standard ;-). I think
we could live with hstore_to_array and hstore_to_matrix. Thoughts,
other ideas?

Off topic, but in normal English usage I thought 'vector' was a 1-D
array, and an array could be any number of dimensions.

--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

#16Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#11)
Re: latest hstore patch

Tom Lane wrote:

Andrew Gierth <andrew@tao11.riddles.org.uk> writes:

Hstore patch incorporating changes as previously discussed.
In addition the requested new features of conversions to and from
array formats have been added (with docs).

Applied with some mostly-cosmetic editorialization.

Are there any pg_migrator affects in this patch? We had discussed this
issue in the past with this patch.

--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

#17Tom Lane
tgl@sss.pgh.pa.us
In reply to: Bruce Momjian (#16)
Re: latest hstore patch

Bruce Momjian <bruce@momjian.us> writes:

Are there any pg_migrator affects in this patch? We had discussed this
issue in the past with this patch.

The code is upward compatible with the old on-disk format, so that
end of things is fine.

There's still the issue of how to get the improved module definition
(new functions etc) into a migrated database. That's not specific
to hstore in any way though, it would affect any contrib module that
had added stuff in a new release.

regards, tom lane

#18Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#17)
Re: latest hstore patch

Tom Lane wrote:

Bruce Momjian <bruce@momjian.us> writes:

Are there any pg_migrator affects in this patch? We had discussed this
issue in the past with this patch.

The code is upward compatible with the old on-disk format, so that
end of things is fine.

There's still the issue of how to get the improved module definition
(new functions etc) into a migrated database. That's not specific
to hstore in any way though, it would affect any contrib module that
had added stuff in a new release.

Most modules just install functions, which are easily
uninstalled/reinstalled. A data type like hstore is more complicated
assuming it is the data type that is changing and not the support
functions.

--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

#19David E. Wheeler
david@kineticode.com
In reply to: Bruce Momjian (#18)
Re: latest hstore patch

On Oct 2, 2009, at 8:20 AM, Bruce Momjian wrote:

Most modules just install functions, which are easily
uninstalled/reinstalled. A data type like hstore is more complicated
assuming it is the data type that is changing and not the support
functions.

Lots of modules install data types. From contrib:

* hstore
* uin
* citext
* cube
* inarray
* ltree

Plus lots of stuff on pgFoundry. It's a problem that needs to be
solved. Surely someone, somewhere, has solved this problem, no?

Best,

David

#20Alvaro Herrera
alvherre@commandprompt.com
In reply to: David E. Wheeler (#19)
Re: latest hstore patch

David E. Wheeler wrote:

Plus lots of stuff on pgFoundry. It's a problem that needs to be
solved. Surely someone, somewhere, has solved this problem, no?

Dump & reload?

--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

#21David E. Wheeler
david@kineticode.com
In reply to: Alvaro Herrera (#20)
Re: latest hstore patch

On Oct 2, 2009, at 9:43 AM, Alvaro Herrera wrote:

Plus lots of stuff on pgFoundry. It's a problem that needs to be
solved. Surely someone, somewhere, has solved this problem, no?

Dump & reload?

Hahahahaha. No, really. "Dump & reload" is a phrase that end users
will not put up with for much longer.

Best,

David

#22Tom Lane
tgl@sss.pgh.pa.us
In reply to: Alvaro Herrera (#20)
Re: latest hstore patch

Alvaro Herrera <alvherre@commandprompt.com> writes:

David E. Wheeler wrote:

Plus lots of stuff on pgFoundry. It's a problem that needs to be
solved. Surely someone, somewhere, has solved this problem, no?

Dump & reload?

The point is it's *not* solved in the context of using pg_migrator.

regards, tom lane

#23Alvaro Herrera
alvherre@commandprompt.com
In reply to: Tom Lane (#22)
Re: latest hstore patch

Tom Lane wrote:

Alvaro Herrera <alvherre@commandprompt.com> writes:

David E. Wheeler wrote:

Plus lots of stuff on pgFoundry. It's a problem that needs to be
solved. Surely someone, somewhere, has solved this problem, no?

Dump & reload?

The point is it's *not* solved in the context of using pg_migrator.

Yes, that's my point too, against David's argument that "surely someone
must have solved it". What we have here is a new problem, so it's not
so clear that there's any solution at all (yet).

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

#24David E. Wheeler
david@kineticode.com
In reply to: Alvaro Herrera (#23)
Re: latest hstore patch

On Oct 2, 2009, at 10:04 AM, Alvaro Herrera wrote:

The point is it's *not* solved in the context of using pg_migrator.

Yes, that's my point too, against David's argument that "surely
someone
must have solved it". What we have here is a new problem, so it's not
so clear that there's any solution at all (yet).

Yeah, I didn't mean that someone must've solved it for PostgreSQL, but
that this sort of problem must have been solved before, wherever
binary data storage is an issue.

Best,

David

#25Bruce Momjian
bruce@momjian.us
In reply to: David E. Wheeler (#21)
Re: latest hstore patch

David E. Wheeler wrote:

On Oct 2, 2009, at 9:43 AM, Alvaro Herrera wrote:

Plus lots of stuff on pgFoundry. It's a problem that needs to be
solved. Surely someone, somewhere, has solved this problem, no?

Dump & reload?

Hahahahaha. No, really. "Dump & reload" is a phrase that end users
will not put up with for much longer.

Well, if it is just changed syntax, we could wack around the system
catalogs. If storage changes, we have to dump/reload that data type.

--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

#26David E. Wheeler
david@kineticode.com
In reply to: Bruce Momjian (#25)
Re: latest hstore patch

On Oct 2, 2009, at 11:14 AM, Bruce Momjian wrote:

Well, if it is just changed syntax, we could wack around the system
catalogs. If storage changes, we have to dump/reload that data type.

Andrew solved this problem for hstore by making the new version able
to read the old representation. It will also update to the new
representation when you update a value.

Best,

David

#27Bruce Momjian
bruce@momjian.us
In reply to: David E. Wheeler (#26)
Re: latest hstore patch

David E. Wheeler wrote:

On Oct 2, 2009, at 11:14 AM, Bruce Momjian wrote:

Well, if it is just changed syntax, we could wack around the system
catalogs. If storage changes, we have to dump/reload that data type.

Andrew solved this problem for hstore by making the new version able
to read the old representation. It will also update to the new
representation when you update a value.

Nice job.

--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

#28Dimitri Fontaine
dfontaine@hi-media.com
In reply to: David E. Wheeler (#24)
Re: latest hstore patch

"David E. Wheeler" <david@kineticode.com> writes:

On Oct 2, 2009, at 10:04 AM, Alvaro Herrera wrote:

Yes, that's my point too, against David's argument that "surely someone
must have solved it". What we have here is a new problem, so it's not
so clear that there's any solution at all (yet).

Yeah, I didn't mean that someone must've solved it for PostgreSQL, but that
this sort of problem must have been solved before, wherever binary data
storage is an issue.

In the extension proposal you can find the idea of an upgrade hook
function called with current and new version of the extension as
arguments. This allows for the extension authors to provide the data
conversion support. We'd in fact want pg_migrator to find any columm
using a datatype offered by the extension and for each of them run:

UPDATE t SET col = ext_upgrade_function(current_version, new_version, col);

A way to indicate that no ondisk change has been made will be a nice
optimisation, allowing to entirely skip the UPDATE step. Those
information should be easy to get from each extension's metadata (which
can point to functions, like ext_ondisk_change(version, version)) and
from pg_depend (any user column hosting an extension provided datatype
should have a tuple there, right?).

The reactions to this part of the proposal where not very warm, in
particular some where concerned that we still have a table rewrite here,
which pg_migrator tries hard to avoid, AFAIUI. But upgrading ondisk
format without rewriting table content is not something I feel able to
help provide.

Regards,
--
dim

PS: the original proposal for the hook let the upgrade function find
which columns to upgrade, on reflexion it's not that friendly...

#29Andrew Gierth
andrew@tao11.riddles.org.uk
In reply to: Bruce Momjian (#18)
Re: latest hstore patch

"Bruce" == Bruce Momjian <bruce@momjian.us> writes:

There's still the issue of how to get the improved module
definition (new functions etc) into a migrated database. That's
not specific to hstore in any way though, it would affect any
contrib module that had added stuff in a new release.

Bruce> Most modules just install functions, which are easily
Bruce> uninstalled/reinstalled. A data type like hstore is more
Bruce> complicated assuming it is the data type that is changing and
Bruce> not the support functions.

For hstore, the various changes (and their solutions if any) are roughly
these:

1) new functions and operators - these don't present a migration issue
other than that they won't be available in a migrated db unless added,
which can be done after the fact with CREATE FUNCTION / CREATE OPERATOR
as in the install script. (This issue is the same for dump/restore
upgrades if the new version is not installed prior to the restore)

2) new internal C names for some functions - this is addressed in hstore
by defining both the new and old names, so no migration issue there
(running an after the fact CREATE OR REPLACE FUNCTION, as in the install
script, will remove the references to the old names; but even that much
isn't necessary unless there's actually a naming conflict)

3) Change in the representation of the underlying data. This is handled
by having the code recognize the old format and convert it on the fly;
this isn't ideal, but it does work.

4) Change in the SQL-level definition of the data type (specifically,
the new code adds SEND and RECEIVE functions which weren't previously
present). This is a hard one; currently, even for a dump/restore
upgrade, this requires that you run the new version's .sql file before
restoring the dump, otherwise you get the old type definition with
those functions missing, and there's no convenient way to add them
back. A migration upgrade would have the same issue.

5) Changes to operator classes; the new version adds two new
opclasses, which is easy, but it also adds new operators to two
opclasses defined in the old version, and there's no ALTER or CREATE
OR REPLACE for those. Again, with a dump/restore upgrade this is
fixable by installing the new version before restoring; if you don't
do that, there's no convenient way to enable access to the new
functionality short of dropping the old opclasses (and all the indexes
that use them) and recreating them.

It's really items (4) and (5) (and similar ones, such as changes to
operator definitions, and other SQL-level objects that don't have an
OR REPLACE option) that currently present an obstacle for all module
authors. (3) is something that's more of a case-by-case problem which
can be tackled within the module itself.

--
Andrew.