prestogres 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. data/.gitignore +4 -0
  2. data/Gemfile +2 -0
  3. data/Gemfile.lock +20 -0
  4. data/LICENSE +202 -0
  5. data/NOTICE +22 -0
  6. data/README.md +217 -0
  7. data/Rakefile +13 -0
  8. data/VERSION +1 -0
  9. data/bin/prestogres +254 -0
  10. data/config/pcp.conf.sample +28 -0
  11. data/config/pgpool.conf +678 -0
  12. data/config/pool_hba.conf +84 -0
  13. data/config/pool_passwd +0 -0
  14. data/config/postgresql.conf +2 -0
  15. data/ext/.gitignore +6 -0
  16. data/ext/depend +26 -0
  17. data/ext/extconf.rb +4 -0
  18. data/ext/prestogres_config.c +12 -0
  19. data/pgpool2/.gitignore +36 -0
  20. data/pgpool2/AUTHORS +4 -0
  21. data/pgpool2/COPYING +12 -0
  22. data/pgpool2/ChangeLog +1 -0
  23. data/pgpool2/INSTALL +1 -0
  24. data/pgpool2/Makefile.am +159 -0
  25. data/pgpool2/Makefile.in +1187 -0
  26. data/pgpool2/NEWS +4960 -0
  27. data/pgpool2/README +1 -0
  28. data/pgpool2/README.euc_jp +1 -0
  29. data/pgpool2/README.online-recovery +62 -0
  30. data/pgpool2/TODO +103 -0
  31. data/pgpool2/ac_func_accept_argtypes.m4 +85 -0
  32. data/pgpool2/aclocal.m4 +1088 -0
  33. data/pgpool2/c-compiler.m4 +134 -0
  34. data/pgpool2/c-library.m4 +325 -0
  35. data/pgpool2/child.c +2097 -0
  36. data/pgpool2/config.guess +1532 -0
  37. data/pgpool2/config.h.in +332 -0
  38. data/pgpool2/config.sub +1640 -0
  39. data/pgpool2/configure +15752 -0
  40. data/pgpool2/configure.in +392 -0
  41. data/pgpool2/depcomp +522 -0
  42. data/pgpool2/doc/basebackup.sh +17 -0
  43. data/pgpool2/doc/pgpool-de.html +4220 -0
  44. data/pgpool2/doc/pgpool-en.html +5738 -0
  45. data/pgpool2/doc/pgpool-fr.html +4118 -0
  46. data/pgpool2/doc/pgpool-ja.css +198 -0
  47. data/pgpool2/doc/pgpool-ja.html +11279 -0
  48. data/pgpool2/doc/pgpool-zh_cn.html +4445 -0
  49. data/pgpool2/doc/pgpool.css +280 -0
  50. data/pgpool2/doc/pgpool_remote_start +13 -0
  51. data/pgpool2/doc/recovery.conf.sample +117 -0
  52. data/pgpool2/doc/tutorial-en.html +707 -0
  53. data/pgpool2/doc/tutorial-ja.html +422 -0
  54. data/pgpool2/doc/tutorial-memqcache-en.html +325 -0
  55. data/pgpool2/doc/tutorial-memqcache-ja.html +370 -0
  56. data/pgpool2/doc/tutorial-memqcache-zh_cn.html +322 -0
  57. data/pgpool2/doc/tutorial-watchdog-en.html +306 -0
  58. data/pgpool2/doc/tutorial-watchdog-ja.html +343 -0
  59. data/pgpool2/doc/tutorial-watchdog-zh_cn.html +301 -0
  60. data/pgpool2/doc/tutorial-zh_cn.html +537 -0
  61. data/pgpool2/doc/watchdog.png +0 -0
  62. data/pgpool2/doc/wd-en.html +236 -0
  63. data/pgpool2/doc/wd-en.jpg +0 -0
  64. data/pgpool2/doc/wd-ja.html +219 -0
  65. data/pgpool2/doc/wd-ja.jpg +0 -0
  66. data/pgpool2/doc/wd-zh_cn.html +201 -0
  67. data/pgpool2/doc/where_to_send_queries.odg +0 -0
  68. data/pgpool2/doc/where_to_send_queries.pdf +0 -0
  69. data/pgpool2/general.m4 +166 -0
  70. data/pgpool2/getopt_long.c +200 -0
  71. data/pgpool2/getopt_long.h +44 -0
  72. data/pgpool2/install-sh +251 -0
  73. data/pgpool2/ltmain.sh +8406 -0
  74. data/pgpool2/m4/libtool.m4 +7360 -0
  75. data/pgpool2/m4/ltoptions.m4 +368 -0
  76. data/pgpool2/m4/ltsugar.m4 +123 -0
  77. data/pgpool2/m4/ltversion.m4 +23 -0
  78. data/pgpool2/m4/lt~obsolete.m4 +92 -0
  79. data/pgpool2/main.c +2971 -0
  80. data/pgpool2/md5.c +444 -0
  81. data/pgpool2/md5.h +28 -0
  82. data/pgpool2/missing +360 -0
  83. data/pgpool2/mkinstalldirs +40 -0
  84. data/pgpool2/parser/Makefile.am +50 -0
  85. data/pgpool2/parser/Makefile.in +559 -0
  86. data/pgpool2/parser/copyfuncs.c +3310 -0
  87. data/pgpool2/parser/gram.c +39100 -0
  88. data/pgpool2/parser/gram.h +940 -0
  89. data/pgpool2/parser/gram.y +13408 -0
  90. data/pgpool2/parser/gramparse.h +74 -0
  91. data/pgpool2/parser/keywords.c +32 -0
  92. data/pgpool2/parser/keywords.h +39 -0
  93. data/pgpool2/parser/kwlist.h +425 -0
  94. data/pgpool2/parser/kwlookup.c +88 -0
  95. data/pgpool2/parser/list.c +1156 -0
  96. data/pgpool2/parser/makefuncs.c +518 -0
  97. data/pgpool2/parser/makefuncs.h +83 -0
  98. data/pgpool2/parser/memnodes.h +79 -0
  99. data/pgpool2/parser/nodes.c +29 -0
  100. data/pgpool2/parser/nodes.h +609 -0
  101. data/pgpool2/parser/outfuncs.c +5790 -0
  102. data/pgpool2/parser/parsenodes.h +2615 -0
  103. data/pgpool2/parser/parser.c +262 -0
  104. data/pgpool2/parser/parser.h +46 -0
  105. data/pgpool2/parser/pg_class.h +158 -0
  106. data/pgpool2/parser/pg_config_manual.h +273 -0
  107. data/pgpool2/parser/pg_list.h +352 -0
  108. data/pgpool2/parser/pg_trigger.h +147 -0
  109. data/pgpool2/parser/pg_wchar.h +492 -0
  110. data/pgpool2/parser/pool_memory.c +342 -0
  111. data/pgpool2/parser/pool_memory.h +77 -0
  112. data/pgpool2/parser/pool_parser.h +222 -0
  113. data/pgpool2/parser/pool_string.c +121 -0
  114. data/pgpool2/parser/pool_string.h +37 -0
  115. data/pgpool2/parser/primnodes.h +1280 -0
  116. data/pgpool2/parser/scan.c +4094 -0
  117. data/pgpool2/parser/scan.l +1451 -0
  118. data/pgpool2/parser/scanner.h +120 -0
  119. data/pgpool2/parser/scansup.c +221 -0
  120. data/pgpool2/parser/scansup.h +28 -0
  121. data/pgpool2/parser/snprintf.c +1102 -0
  122. data/pgpool2/parser/stringinfo.c +294 -0
  123. data/pgpool2/parser/stringinfo.h +178 -0
  124. data/pgpool2/parser/value.c +78 -0
  125. data/pgpool2/parser/value.h +62 -0
  126. data/pgpool2/parser/wchar.c +2048 -0
  127. data/pgpool2/pcp.conf.sample +28 -0
  128. data/pgpool2/pcp/Makefile.am +40 -0
  129. data/pgpool2/pcp/Makefile.in +771 -0
  130. data/pgpool2/pcp/libpcp_ext.h +250 -0
  131. data/pgpool2/pcp/md5.c +444 -0
  132. data/pgpool2/pcp/md5.h +28 -0
  133. data/pgpool2/pcp/pcp.c +1652 -0
  134. data/pgpool2/pcp/pcp.h +61 -0
  135. data/pgpool2/pcp/pcp_attach_node.c +172 -0
  136. data/pgpool2/pcp/pcp_detach_node.c +185 -0
  137. data/pgpool2/pcp/pcp_error.c +87 -0
  138. data/pgpool2/pcp/pcp_node_count.c +160 -0
  139. data/pgpool2/pcp/pcp_node_info.c +198 -0
  140. data/pgpool2/pcp/pcp_pool_status.c +166 -0
  141. data/pgpool2/pcp/pcp_proc_count.c +166 -0
  142. data/pgpool2/pcp/pcp_proc_info.c +261 -0
  143. data/pgpool2/pcp/pcp_promote_node.c +185 -0
  144. data/pgpool2/pcp/pcp_recovery_node.c +172 -0
  145. data/pgpool2/pcp/pcp_stop_pgpool.c +179 -0
  146. data/pgpool2/pcp/pcp_stream.c +385 -0
  147. data/pgpool2/pcp/pcp_stream.h +52 -0
  148. data/pgpool2/pcp/pcp_systemdb_info.c +194 -0
  149. data/pgpool2/pcp/pcp_watchdog_info.c +211 -0
  150. data/pgpool2/pcp_child.c +1493 -0
  151. data/pgpool2/pg_md5.c +305 -0
  152. data/pgpool2/pgpool.8.in +121 -0
  153. data/pgpool2/pgpool.conf +553 -0
  154. data/pgpool2/pgpool.conf.sample +666 -0
  155. data/pgpool2/pgpool.conf.sample-master-slave +665 -0
  156. data/pgpool2/pgpool.conf.sample-replication +664 -0
  157. data/pgpool2/pgpool.conf.sample-stream +664 -0
  158. data/pgpool2/pgpool.spec +264 -0
  159. data/pgpool2/pgpool_adm/TODO +7 -0
  160. data/pgpool2/pgpool_adm/pgpool_adm--1.0.sql +85 -0
  161. data/pgpool2/pgpool_adm/pgpool_adm.c +558 -0
  162. data/pgpool2/pgpool_adm/pgpool_adm.control +5 -0
  163. data/pgpool2/pgpool_adm/pgpool_adm.h +46 -0
  164. data/pgpool2/pgpool_adm/pgpool_adm.sql.in +85 -0
  165. data/pgpool2/pool.h +655 -0
  166. data/pgpool2/pool_auth.c +1390 -0
  167. data/pgpool2/pool_config.c +5007 -0
  168. data/pgpool2/pool_config.h +284 -0
  169. data/pgpool2/pool_config.l +3281 -0
  170. data/pgpool2/pool_config_md5.c +29 -0
  171. data/pgpool2/pool_connection_pool.c +812 -0
  172. data/pgpool2/pool_error.c +242 -0
  173. data/pgpool2/pool_globals.c +27 -0
  174. data/pgpool2/pool_hba.c +1723 -0
  175. data/pgpool2/pool_hba.conf.sample +67 -0
  176. data/pgpool2/pool_ip.c +567 -0
  177. data/pgpool2/pool_ip.h +65 -0
  178. data/pgpool2/pool_ipc.h +38 -0
  179. data/pgpool2/pool_lobj.c +242 -0
  180. data/pgpool2/pool_lobj.h +32 -0
  181. data/pgpool2/pool_memqcache.c +3818 -0
  182. data/pgpool2/pool_memqcache.h +268 -0
  183. data/pgpool2/pool_params.c +163 -0
  184. data/pgpool2/pool_passwd.c +249 -0
  185. data/pgpool2/pool_passwd.h +41 -0
  186. data/pgpool2/pool_path.c +193 -0
  187. data/pgpool2/pool_path.h +81 -0
  188. data/pgpool2/pool_process_context.c +247 -0
  189. data/pgpool2/pool_process_context.h +62 -0
  190. data/pgpool2/pool_process_query.c +5001 -0
  191. data/pgpool2/pool_process_reporting.c +1671 -0
  192. data/pgpool2/pool_process_reporting.h +44 -0
  193. data/pgpool2/pool_proto2.c +671 -0
  194. data/pgpool2/pool_proto_modules.c +3524 -0
  195. data/pgpool2/pool_proto_modules.h +185 -0
  196. data/pgpool2/pool_query_cache.c +1020 -0
  197. data/pgpool2/pool_query_context.c +1871 -0
  198. data/pgpool2/pool_query_context.h +105 -0
  199. data/pgpool2/pool_relcache.c +284 -0
  200. data/pgpool2/pool_relcache.h +78 -0
  201. data/pgpool2/pool_rewrite_outfuncs.c +9060 -0
  202. data/pgpool2/pool_rewrite_query.c +715 -0
  203. data/pgpool2/pool_rewrite_query.h +192 -0
  204. data/pgpool2/pool_select_walker.c +1150 -0
  205. data/pgpool2/pool_select_walker.h +68 -0
  206. data/pgpool2/pool_sema.c +161 -0
  207. data/pgpool2/pool_session_context.c +952 -0
  208. data/pgpool2/pool_session_context.h +203 -0
  209. data/pgpool2/pool_shmem.c +185 -0
  210. data/pgpool2/pool_signal.c +158 -0
  211. data/pgpool2/pool_signal.h +61 -0
  212. data/pgpool2/pool_ssl.c +339 -0
  213. data/pgpool2/pool_stream.c +962 -0
  214. data/pgpool2/pool_stream.h +61 -0
  215. data/pgpool2/pool_system.c +659 -0
  216. data/pgpool2/pool_timestamp.c +1215 -0
  217. data/pgpool2/pool_timestamp.h +38 -0
  218. data/pgpool2/pool_type.h +171 -0
  219. data/pgpool2/pool_worker_child.c +384 -0
  220. data/pgpool2/ps_status.c +404 -0
  221. data/pgpool2/recovery.c +435 -0
  222. data/pgpool2/redhat/pgpool.conf.sample.patch +52 -0
  223. data/pgpool2/redhat/pgpool.init +201 -0
  224. data/pgpool2/redhat/pgpool.sysconfig +7 -0
  225. data/pgpool2/redhat/rpm_installer/basebackup-replication.sh +53 -0
  226. data/pgpool2/redhat/rpm_installer/basebackup-stream.sh +55 -0
  227. data/pgpool2/redhat/rpm_installer/config_for_script +17 -0
  228. data/pgpool2/redhat/rpm_installer/failover.sh +64 -0
  229. data/pgpool2/redhat/rpm_installer/getsources.sh +141 -0
  230. data/pgpool2/redhat/rpm_installer/install.sh +1363 -0
  231. data/pgpool2/redhat/rpm_installer/pgpool_recovery_pitr +47 -0
  232. data/pgpool2/redhat/rpm_installer/pgpool_remote_start +15 -0
  233. data/pgpool2/redhat/rpm_installer/recovery.conf +4 -0
  234. data/pgpool2/redhat/rpm_installer/uninstall.sh +57 -0
  235. data/pgpool2/sample/dist_def_pgbench.sql +73 -0
  236. data/pgpool2/sample/pgpool.pam +3 -0
  237. data/pgpool2/sample/pgpool_recovery +20 -0
  238. data/pgpool2/sample/pgpool_recovery_pitr +19 -0
  239. data/pgpool2/sample/pgpool_remote_start +13 -0
  240. data/pgpool2/sample/replicate_def_pgbench.sql +18 -0
  241. data/pgpool2/sql/insert_lock.sql +15 -0
  242. data/pgpool2/sql/pgpool-recovery/pgpool-recovery.c +280 -0
  243. data/pgpool2/sql/pgpool-recovery/pgpool-recovery.sql.in +19 -0
  244. data/pgpool2/sql/pgpool-recovery/pgpool_recovery--1.0.sql +24 -0
  245. data/pgpool2/sql/pgpool-recovery/pgpool_recovery.control +5 -0
  246. data/pgpool2/sql/pgpool-recovery/uninstall_pgpool-recovery.sql +3 -0
  247. data/pgpool2/sql/pgpool-regclass/pgpool-regclass.c +206 -0
  248. data/pgpool2/sql/pgpool-regclass/pgpool-regclass.sql.in +4 -0
  249. data/pgpool2/sql/pgpool-regclass/pgpool_regclass--1.0.sql +7 -0
  250. data/pgpool2/sql/pgpool-regclass/pgpool_regclass.control +5 -0
  251. data/pgpool2/sql/pgpool-regclass/uninstall_pgpool-regclass.sql +1 -0
  252. data/pgpool2/sql/system_db.sql +38 -0
  253. data/pgpool2/strlcpy.c +85 -0
  254. data/pgpool2/test/C/test_extended.c +98 -0
  255. data/pgpool2/test/jdbc/.cvsignore +2 -0
  256. data/pgpool2/test/jdbc/AutoCommitTest.java +45 -0
  257. data/pgpool2/test/jdbc/BatchTest.java +55 -0
  258. data/pgpool2/test/jdbc/ColumnTest.java +60 -0
  259. data/pgpool2/test/jdbc/CreateTempTableTest.java +48 -0
  260. data/pgpool2/test/jdbc/InsertTest.java +34 -0
  261. data/pgpool2/test/jdbc/LockTest.java +36 -0
  262. data/pgpool2/test/jdbc/PgpoolTest.java +75 -0
  263. data/pgpool2/test/jdbc/README.euc_jp +73 -0
  264. data/pgpool2/test/jdbc/RunTest.java +83 -0
  265. data/pgpool2/test/jdbc/SelectTest.java +37 -0
  266. data/pgpool2/test/jdbc/UpdateTest.java +32 -0
  267. data/pgpool2/test/jdbc/expected/CreateTempTable +1 -0
  268. data/pgpool2/test/jdbc/expected/autocommit +10 -0
  269. data/pgpool2/test/jdbc/expected/batch +1 -0
  270. data/pgpool2/test/jdbc/expected/column +100 -0
  271. data/pgpool2/test/jdbc/expected/insert +1 -0
  272. data/pgpool2/test/jdbc/expected/lock +100 -0
  273. data/pgpool2/test/jdbc/expected/select +2 -0
  274. data/pgpool2/test/jdbc/expected/update +1 -0
  275. data/pgpool2/test/jdbc/pgpool.properties +7 -0
  276. data/pgpool2/test/jdbc/prepare.sql +54 -0
  277. data/pgpool2/test/jdbc/run.sh +6 -0
  278. data/pgpool2/test/parser/.cvsignore +6 -0
  279. data/pgpool2/test/parser/README +32 -0
  280. data/pgpool2/test/parser/expected/copy.out +17 -0
  281. data/pgpool2/test/parser/expected/create.out +64 -0
  282. data/pgpool2/test/parser/expected/cursor.out +37 -0
  283. data/pgpool2/test/parser/expected/delete.out +10 -0
  284. data/pgpool2/test/parser/expected/drop.out +12 -0
  285. data/pgpool2/test/parser/expected/insert.out +13 -0
  286. data/pgpool2/test/parser/expected/misc.out +28 -0
  287. data/pgpool2/test/parser/expected/prepare.out +4 -0
  288. data/pgpool2/test/parser/expected/privileges.out +31 -0
  289. data/pgpool2/test/parser/expected/scanner.out +30 -0
  290. data/pgpool2/test/parser/expected/select.out +89 -0
  291. data/pgpool2/test/parser/expected/transaction.out +38 -0
  292. data/pgpool2/test/parser/expected/update.out +11 -0
  293. data/pgpool2/test/parser/expected/v84.out +37 -0
  294. data/pgpool2/test/parser/expected/v90.out +25 -0
  295. data/pgpool2/test/parser/expected/var.out +22 -0
  296. data/pgpool2/test/parser/input/alter.sql +2 -0
  297. data/pgpool2/test/parser/input/copy.sql +17 -0
  298. data/pgpool2/test/parser/input/create.sql +64 -0
  299. data/pgpool2/test/parser/input/cursor.sql +37 -0
  300. data/pgpool2/test/parser/input/delete.sql +10 -0
  301. data/pgpool2/test/parser/input/drop.sql +12 -0
  302. data/pgpool2/test/parser/input/insert.sql +13 -0
  303. data/pgpool2/test/parser/input/misc.sql +28 -0
  304. data/pgpool2/test/parser/input/prepare.sql +4 -0
  305. data/pgpool2/test/parser/input/privileges.sql +31 -0
  306. data/pgpool2/test/parser/input/scanner.sql +34 -0
  307. data/pgpool2/test/parser/input/select.sql +89 -0
  308. data/pgpool2/test/parser/input/transaction.sql +38 -0
  309. data/pgpool2/test/parser/input/update.sql +11 -0
  310. data/pgpool2/test/parser/input/v84.sql +37 -0
  311. data/pgpool2/test/parser/input/v90.sql +38 -0
  312. data/pgpool2/test/parser/input/var.sql +22 -0
  313. data/pgpool2/test/parser/main.c +96 -0
  314. data/pgpool2/test/parser/parse_schedule +16 -0
  315. data/pgpool2/test/parser/pool.h +13 -0
  316. data/pgpool2/test/parser/run-test +62 -0
  317. data/pgpool2/test/pdo-test/README.euc_jp +58 -0
  318. data/pgpool2/test/pdo-test/SQLlist/test1.sql +3 -0
  319. data/pgpool2/test/pdo-test/SQLlist/test2.sql +3 -0
  320. data/pgpool2/test/pdo-test/collections.inc +11 -0
  321. data/pgpool2/test/pdo-test/def.inc +7 -0
  322. data/pgpool2/test/pdo-test/log.txt +0 -0
  323. data/pgpool2/test/pdo-test/mod/database.inc +36 -0
  324. data/pgpool2/test/pdo-test/mod/def.inc +0 -0
  325. data/pgpool2/test/pdo-test/mod/errorhandler.inc +27 -0
  326. data/pgpool2/test/pdo-test/pdotest.php +11 -0
  327. data/pgpool2/test/pdo-test/regsql.inc +56 -0
  328. data/pgpool2/test/pgpool_setup +898 -0
  329. data/pgpool2/test/regression/README +39 -0
  330. data/pgpool2/test/regression/clean.sh +21 -0
  331. data/pgpool2/test/regression/libs.sh +16 -0
  332. data/pgpool2/test/regression/regress.sh +166 -0
  333. data/pgpool2/test/regression/tests/001.load_balance/test.sh +128 -0
  334. data/pgpool2/test/regression/tests/002.native_replication/PgTester.java +47 -0
  335. data/pgpool2/test/regression/tests/002.native_replication/create.sql +6 -0
  336. data/pgpool2/test/regression/tests/002.native_replication/test.sh +71 -0
  337. data/pgpool2/test/regression/tests/003.failover/expected.r +6 -0
  338. data/pgpool2/test/regression/tests/003.failover/expected.s +6 -0
  339. data/pgpool2/test/regression/tests/003.failover/test.sh +45 -0
  340. data/pgpool2/test/regression/tests/004.watchdog/master.conf +12 -0
  341. data/pgpool2/test/regression/tests/004.watchdog/standby.conf +19 -0
  342. data/pgpool2/test/regression/tests/004.watchdog/test.sh +52 -0
  343. data/pgpool2/test/regression/tests/050.bug58/test.sh +50 -0
  344. data/pgpool2/test/regression/tests/051.bug60/bug.sql +12 -0
  345. data/pgpool2/test/regression/tests/051.bug60/database-clean.sql +6 -0
  346. data/pgpool2/test/regression/tests/051.bug60/database-setup.sql +28 -0
  347. data/pgpool2/test/regression/tests/051.bug60/test.sh +79 -0
  348. data/pgpool2/test/regression/tests/052.do_query/test.sh +44 -0
  349. data/pgpool2/test/regression/tests/053.insert_lock_hangs/test.sh +81 -0
  350. data/pgpool2/test/regression/tests/054.postgres_fdw/test.sh +67 -0
  351. data/pgpool2/test/regression/tests/055.backend_all_down/test.sh +52 -0
  352. data/pgpool2/test/regression/tests/056.bug63/jdbctest2.java +66 -0
  353. data/pgpool2/test/regression/tests/056.bug63/test.sh +47 -0
  354. data/pgpool2/test/regression/tests/057.bug61/test.sh +40 -0
  355. data/pgpool2/test/regression/tests/058.bug68/jdbctest3.java +45 -0
  356. data/pgpool2/test/regression/tests/058.bug68/test.sh +47 -0
  357. data/pgpool2/test/timestamp/expected/insert.out +16 -0
  358. data/pgpool2/test/timestamp/expected/misc.out +3 -0
  359. data/pgpool2/test/timestamp/expected/update.out +6 -0
  360. data/pgpool2/test/timestamp/input/insert.sql +16 -0
  361. data/pgpool2/test/timestamp/input/misc.sql +3 -0
  362. data/pgpool2/test/timestamp/input/update.sql +6 -0
  363. data/pgpool2/test/timestamp/main.c +129 -0
  364. data/pgpool2/test/timestamp/parse_schedule +3 -0
  365. data/pgpool2/test/timestamp/run-test +69 -0
  366. data/pgpool2/version.h +1 -0
  367. data/pgpool2/watchdog/Makefile.am +17 -0
  368. data/pgpool2/watchdog/Makefile.in +505 -0
  369. data/pgpool2/watchdog/test/stab.c +266 -0
  370. data/pgpool2/watchdog/test/test.c +85 -0
  371. data/pgpool2/watchdog/test/wd_child_t.c +87 -0
  372. data/pgpool2/watchdog/test/wd_lifecheck_t.c +87 -0
  373. data/pgpool2/watchdog/test/wd_packet_t.c +87 -0
  374. data/pgpool2/watchdog/test/wd_ping_t.c +20 -0
  375. data/pgpool2/watchdog/watchdog.c +408 -0
  376. data/pgpool2/watchdog/watchdog.h +209 -0
  377. data/pgpool2/watchdog/wd_child.c +444 -0
  378. data/pgpool2/watchdog/wd_ext.h +123 -0
  379. data/pgpool2/watchdog/wd_heartbeat.c +577 -0
  380. data/pgpool2/watchdog/wd_if.c +216 -0
  381. data/pgpool2/watchdog/wd_init.c +126 -0
  382. data/pgpool2/watchdog/wd_interlock.c +347 -0
  383. data/pgpool2/watchdog/wd_lifecheck.c +512 -0
  384. data/pgpool2/watchdog/wd_list.c +429 -0
  385. data/pgpool2/watchdog/wd_packet.c +1159 -0
  386. data/pgpool2/watchdog/wd_ping.c +330 -0
  387. data/pgpool2/ylwrap +223 -0
  388. data/pgsql/presto_client.py +346 -0
  389. data/pgsql/prestogres.py +156 -0
  390. data/pgsql/setup_functions.sql +21 -0
  391. data/pgsql/setup_language.sql +3 -0
  392. data/prestogres.gemspec +23 -0
  393. metadata +496 -0
@@ -0,0 +1,715 @@
1
+ /* -*-pgsql-c-*- */
2
+ /*
3
+ * $Header$
4
+ *
5
+ * pgpool: a language independent connection pool server for PostgreSQL
6
+ * written by Tatsuo Ishii
7
+ *
8
+ * Copyright (c) 2003-2010 PgPool Global Development Group
9
+ *
10
+ * Permission to use, copy, modify, and distribute this software and
11
+ * its documentation for any purpose and without fee is hereby
12
+ * granted, provided that the above copyright notice appear in all
13
+ * copies and that both that copyright notice and this permission
14
+ * notice appear in supporting documentation, and that the name of the
15
+ * author not be used in advertising or publicity pertaining to
16
+ * distribution of the software without specific, written prior
17
+ * permission. The author makes no representations about the
18
+ * suitability of this software for any purpose. It is provided "as
19
+ * is" without express or implied warranty.
20
+ *
21
+ * pool_rewrite_query.c: rewrite_query
22
+ *
23
+ */
24
+
25
+ #include "pool.h"
26
+ #include "pool_config.h"
27
+ #include "pool_rewrite_query.h"
28
+ #include "pool_proto_modules.h"
29
+ #include "pool_session_context.h"
30
+
31
+ #include <string.h>
32
+ #include <errno.h>
33
+ #include <stdlib.h>
34
+
35
+ static int getInsertRule(ListCell *lc,List *list_t ,DistDefInfo *info, int div_key_num);
36
+ static void examInsertStmt(Node *node,POOL_CONNECTION_POOL *backend,RewriteQuery *message);
37
+ static void examSelectStmt(Node *node,POOL_CONNECTION_POOL *backend,RewriteQuery *message);
38
+ static char *delimistr(char *str);
39
+ static int direct_parallel_query(RewriteQuery *message);
40
+ static void initMessage(RewriteQuery *message);
41
+ static void initdblink(ConInfoTodblink *dblink, POOL_CONNECTION_POOL *backend);
42
+ static void analyze_debug(RewriteQuery *message);
43
+
44
+
45
+ /* create error message */
46
+ char *pool_error_message(char *message)
47
+ {
48
+ String *str;
49
+
50
+ str = init_string("");
51
+ string_append_char(str,message);
52
+ return str->data;
53
+ }
54
+
55
+ /*
56
+ * search DistDefInfo(this info is build in starting process
57
+ * and get node id where a query send.
58
+ */
59
+ static int getInsertRule(ListCell *lc,List *list_t ,DistDefInfo *info,int div_key_num)
60
+ {
61
+ int loop_counter = 0;
62
+ int node_number = -1;
63
+ ListCell *cell;
64
+
65
+ if(list_t->length != 1)
66
+ return -1;
67
+
68
+ cell = list_head(list_t);
69
+
70
+ if(!cell && !IsA(cell,List))
71
+ return 1;
72
+
73
+ foreach(lc,lfirst(cell))
74
+ {
75
+ A_Const *constant;
76
+ Value value;
77
+ void *obj = NULL;
78
+
79
+ obj = lfirst(lc);
80
+
81
+ /* it supports casting syntax such as "A::B::C" */
82
+ while (obj && IsA(obj, TypeCast))
83
+ {
84
+ TypeCast *type = (TypeCast *) obj;
85
+ obj = type->arg;
86
+ }
87
+
88
+ if(!obj || !IsA(obj, A_Const))
89
+ return -1;
90
+
91
+ if (loop_counter == div_key_num)
92
+ {
93
+ constant = (A_Const *) obj;
94
+ value = constant->val;
95
+ if (value.type == T_Integer)
96
+ {
97
+ char temp[16];
98
+ sprintf(temp,"%ld",value.val.ival);
99
+ node_number = pool_get_id(info,temp);
100
+ break;
101
+ }
102
+ else
103
+ {
104
+ if(value.val.str)
105
+ node_number = pool_get_id(info, value.val.str);
106
+ else
107
+ return -1;
108
+ break;
109
+ }
110
+ }
111
+ loop_counter++;
112
+ }
113
+ /* if node_number is -1, cannot get return value from pool_get_id() */
114
+ return node_number;
115
+ }
116
+
117
+ /*
118
+ * This function processes the decision whether to
119
+ * distribute the insert sentence to the node.
120
+ */
121
+ static void examInsertStmt(Node *node,POOL_CONNECTION_POOL *backend, RewriteQuery *message)
122
+ {
123
+ RangeVar *table;
124
+ int cell_num;
125
+ int node_number;
126
+ DistDefInfo *info = NULL;
127
+ ListCell *lc = NULL;
128
+ List *list_t = NULL;
129
+ int div_key_num = 0;
130
+ int dist_def_flag = 0;
131
+ InsertStmt *insert = (InsertStmt *) node;
132
+
133
+ message->type = node->type;
134
+
135
+
136
+ /* insert target table */
137
+ table = insert->relation;
138
+ if (!table)
139
+ {
140
+ /* send error message to frontend */
141
+ message->r_code = INSERT_SQL_RESTRICTION;
142
+ message->r_node = -1;
143
+ message->rewrite_query = pool_error_message("cannot find table name");
144
+ return;
145
+ }
146
+
147
+ /* pool_debug("exam_InsertStmt insert table_name %s:",table->relname); */
148
+
149
+ info = pool_get_dist_def_info(MASTER_CONNECTION(backend)->sp->database,
150
+ table->schemaname,
151
+ table->relname);
152
+
153
+ if (!info)
154
+ {
155
+ /* send error message to frontend */
156
+ message->r_code = INSERT_DIST_NO_RULE;
157
+ return;
158
+ }
159
+
160
+ /* the source SELECT ? */
161
+ if (insert->selectStmt && ((SelectStmt *)insert->selectStmt)->targetList)
162
+ {
163
+ /* send error message to frontend */
164
+ message->r_code = INSERT_SQL_RESTRICTION;
165
+ message->r_node = -1;
166
+ message->rewrite_query = pool_error_message("cannot use SelectStmt in InsertStmt");
167
+ return;
168
+ }
169
+
170
+ list_t = (List *)(((SelectStmt *)insert->selectStmt)->valuesLists);
171
+
172
+ if (!list_t)
173
+ {
174
+ /* send error message to frontend */
175
+ message->r_code = INSERT_SQL_RESTRICTION;
176
+ message->r_node = -1;
177
+ message->rewrite_query = pool_error_message("cannot find target List");
178
+ return;
179
+ }
180
+
181
+ /* number of target list */
182
+
183
+ if(list_t->length == 1 && IsA(lfirst(list_head(list_t)),List))
184
+ {
185
+ cell_num = ((List *) lfirst(list_head(list_t)))->length;
186
+ }
187
+ else
188
+ {
189
+ /* send error message to frontend */
190
+ message->r_code = INSERT_SQL_RESTRICTION;
191
+ message->r_node = -1;
192
+ message->rewrite_query = pool_error_message("cannot analyze this InsertStmt");
193
+ return;
194
+ }
195
+
196
+
197
+ /* Is the target columns ?*/
198
+ if (!insert->cols)
199
+ {
200
+ div_key_num = info->dist_key_col_id;
201
+ dist_def_flag = 1;
202
+
203
+ pool_debug("cell number %d, div key num %d, div_key columname %s",cell_num,div_key_num,info->col_list[div_key_num]);
204
+
205
+ if (cell_num < div_key_num)
206
+ {
207
+ /* send error message to frontend */
208
+ message->r_code = INSERT_SQL_RESTRICTION;
209
+ message->r_node = -1;
210
+ message->rewrite_query = pool_error_message("cannot find dividing key in InsertStmt");
211
+ return;
212
+ }
213
+
214
+ }
215
+ else
216
+ {
217
+ List *list_cols = (List *) insert->cols;
218
+
219
+ foreach(lc, list_cols)
220
+ {
221
+ Node *n;
222
+ ResTarget *target;
223
+ n = lfirst(lc);
224
+ target = (ResTarget *) n;
225
+ if (strcmp(target->name,info->dist_key_col_name) == 0)
226
+ {
227
+ dist_def_flag = 1;
228
+ break;
229
+ }
230
+ div_key_num++;
231
+ }
232
+
233
+ if (cell_num < div_key_num)
234
+ {
235
+ /* send error message to frontend */
236
+ message->r_code = INSERT_SQL_RESTRICTION;
237
+ message->r_node = -1;
238
+ message->rewrite_query = pool_error_message("cannot find dividing key in InsertStmt");
239
+ return;
240
+ }
241
+ }
242
+
243
+ if (dist_def_flag != 1)
244
+ {
245
+ /* send error message to frontend */
246
+ message->r_code = INSERT_SQL_RESTRICTION;
247
+ message->r_node = -1;
248
+ message->rewrite_query = pool_error_message("cannot find dividing key in InsertStmt");
249
+ return;
250
+ }
251
+
252
+ /* this loop get insert one args of divide rule */
253
+ node_number = getInsertRule(lc, list_t, info, div_key_num);
254
+
255
+ if (node_number < 0)
256
+ {
257
+ /* send error message to frontend */
258
+ message->r_code = INSERT_SQL_RESTRICTION;
259
+ message->r_node = -1;
260
+ message->rewrite_query = pool_error_message("cannot get node_id from system db");
261
+ return;
262
+ }
263
+
264
+ pool_debug("insert node_number =%d",node_number);
265
+ message->r_code = 0;
266
+ message->r_node = node_number;
267
+ message->rewrite_query = nodeToString(node);
268
+ }
269
+
270
+ /* start of rewriting query */
271
+ static void examSelectStmt(Node *node,POOL_CONNECTION_POOL *backend,RewriteQuery *message)
272
+ {
273
+ static ConInfoTodblink dblink;
274
+
275
+ /* initialize dblink info */
276
+ initdblink(&dblink,backend);
277
+
278
+ /* initialize message */
279
+ initMessage(message);
280
+ message->type = node->type;
281
+ message->r_code = SELECT_DEFAULT;
282
+
283
+ /* do rewrite query */
284
+ nodeToRewriteString(message,&dblink,node);
285
+ }
286
+
287
+ /* initialize Message */
288
+ static void initMessage(RewriteQuery *message)
289
+ {
290
+ message->r_code = 0;
291
+ message->r_node = 0;
292
+ message->column = 0;
293
+ message->virtual_num = 0;
294
+ message->is_pg_catalog = false;
295
+ message->is_loadbalance = false;
296
+ message->is_parallel = false;
297
+ message->table_relname = NULL;
298
+ message->table_alias = NULL;
299
+ message->dbname = NULL;
300
+ message->schemaname = NULL;
301
+ message->rewrite_query = NULL;
302
+ message->rewritelock = -1;
303
+ message->ignore_rewrite = -1;
304
+ message->ret_num = 0;
305
+ }
306
+
307
+ /* set dblink info */
308
+ static void initdblink(ConInfoTodblink *dblink,POOL_CONNECTION_POOL *backend)
309
+ {
310
+ dblink->dbname = MASTER_CONNECTION(backend)->sp->database;
311
+ dblink->hostaddr = pool_config->pgpool2_hostname;
312
+ dblink->user = MASTER_CONNECTION(backend)->sp->user;
313
+ dblink->port = pool_config->port;
314
+ dblink->password = MASTER_CONNECTION(backend)->con->password;
315
+ }
316
+
317
+ /* reference of pg_catalog or not */
318
+ int IsSelectpgcatalog(Node *node,POOL_CONNECTION_POOL *backend)
319
+ {
320
+ static ConInfoTodblink dblink;
321
+ static RewriteQuery message;
322
+
323
+ /* initialize dblink info */
324
+ initdblink(&dblink,backend);
325
+
326
+ /* initialize message */
327
+ initMessage(&message);
328
+
329
+ message.type = node->type;
330
+
331
+ initdblink(&dblink,backend);
332
+
333
+ if(message.is_pg_catalog)
334
+ {
335
+ pool_debug("Isselectpgcatalog %d",message.is_pg_catalog);
336
+ return 1;
337
+ }
338
+ else
339
+ {
340
+ return 0;
341
+ }
342
+ }
343
+
344
+ /*
345
+ * SELECT statement or INSERT statement is special,
346
+ * peculiar process is needed in parallel mode.
347
+ */
348
+ RewriteQuery *rewrite_query_stmt(Node *node,POOL_CONNECTION *frontend,POOL_CONNECTION_POOL *backend,RewriteQuery *message)
349
+ {
350
+ switch(node->type)
351
+ {
352
+ case T_SelectStmt:
353
+ {
354
+ SelectStmt *stmt = (SelectStmt *)node;
355
+
356
+ /* Because "SELECT INTO" cannot be used in a parallel mode,
357
+ * the error message is generated and send "ready for query" to frontend.
358
+ */
359
+ if(stmt->intoClause)
360
+ {
361
+ pool_send_error_message(frontend, MAJOR(backend), "XX000",
362
+ "pgpool2 sql restriction",
363
+ "cannot use select into ...", "", __FILE__,
364
+ __LINE__);
365
+
366
+
367
+ pool_send_readyforquery(frontend);
368
+ message->status=POOL_CONTINUE;
369
+ break;
370
+ }
371
+
372
+ /*
373
+ * The Query is actually rewritten based on analytical information on the Query.
374
+ */
375
+ examSelectStmt(node,backend,message);
376
+
377
+ if (message->r_code != SELECT_PGCATALOG &&
378
+ message->r_code != SELECT_RELATION_ERROR)
379
+ {
380
+ /*
381
+ * The rewritten Query is transmitted to system db,
382
+ * and execution status is received.
383
+ */
384
+ POOL_CONNECTION_POOL_SLOT *system_db = pool_system_db_connection();
385
+ message->status = OneNode_do_command(frontend,
386
+ system_db->con,
387
+ message->rewrite_query,
388
+ backend->info->database);
389
+ }
390
+ else
391
+ {
392
+ if(TSTATE(backend, MASTER_NODE_ID) == 'T' &&
393
+ message->r_code == SELECT_RELATION_ERROR)
394
+ {
395
+ /*
396
+ * In the case of message->r_code == SELECT_RELATION_ERROR and in the transaction,
397
+ * Transmit the Query to all back ends, and to abort transaction.
398
+ */
399
+ pool_debug("pool_rewrite_stmt(select): Inside transaction. abort transaction");
400
+ message->rewrite_query = nodeToString(node);
401
+ message->status = pool_parallel_exec(frontend,backend,message->rewrite_query,node,true);
402
+ }
403
+ else
404
+ {
405
+ /*
406
+ * Other cases of message->r_code == SELECT_RELATION_ERROR
407
+ * or SELECT_PG_CATALOG,
408
+ * Transmit the Query to Master node and receive status.
409
+ */
410
+ pool_debug("pool_rewrite_stmt: executed by Master");
411
+ message->rewrite_query = nodeToString(node);
412
+ message->status = OneNode_do_command(frontend,
413
+ MASTER(backend),
414
+ message->rewrite_query,
415
+ backend->info->database);
416
+ }
417
+ }
418
+ pool_debug("pool_rewrite_stmt: select message_code %d",message->r_code);
419
+ }
420
+ break;
421
+
422
+ case T_InsertStmt:
423
+
424
+ /* The distribution of the INSERT sentence. */
425
+ examInsertStmt(node,backend,message);
426
+
427
+ if(message->r_code == 0 )
428
+ {
429
+ /* send the INSERT sentence */
430
+ message->status = OneNode_do_command(frontend,
431
+ CONNECTION(backend,message->r_node),
432
+ message->rewrite_query,
433
+ backend->info->database);
434
+ }
435
+ else if (message->r_code == INSERT_SQL_RESTRICTION)
436
+ {
437
+ /* Restriction case of INSERT sentence */
438
+ pool_send_error_message(frontend, MAJOR(backend), "XX000",
439
+ "pgpool2 sql restriction",
440
+ message->rewrite_query, "", __FILE__,
441
+ __LINE__);
442
+
443
+ if(TSTATE(backend, MASTER_NODE_ID) == 'T')
444
+ {
445
+ /* In Transaction, send the invalid message to backend to abort this transaction */
446
+ pool_debug("rewrite_query_stmt(insert): Inside transaction. Abort transaction");
447
+ message->status = pool_parallel_exec(frontend,backend, "POOL_RESET_TSTATE",node,false);
448
+ }
449
+ else
450
+ {
451
+ /* return "ready for query" to frontend */
452
+ pool_send_readyforquery(frontend);
453
+ message->status=POOL_CONTINUE;
454
+ }
455
+ }
456
+ break;
457
+ #if 0
458
+ case T_UpdateStmt:
459
+ /* Improve UpdateStmt for complex query */
460
+ break;
461
+ #endif
462
+ default:
463
+ message->type = node->type;
464
+ message->status = POOL_CONTINUE;
465
+ break;
466
+ }
467
+
468
+ pool_debug("pool_rewrite_stmt: query rule %d",node->type);
469
+
470
+ return message;
471
+ }
472
+
473
+ #define POOL_PARALLEL "pool_parallel"
474
+ #define POOL_LOADBALANCE "pool_loadbalance"
475
+
476
+ /*
477
+ * After analyzing query, check the analyze[0]->state.
478
+ * if the analyze[0]->state ==`P`, this query can be executed
479
+ * on parallel engine.
480
+ */
481
+ static int direct_parallel_query(RewriteQuery *message)
482
+ {
483
+ if(message && message->analyze[0] && message->analyze[0]->state == 'P')
484
+ return 1;
485
+ else
486
+ return 0;
487
+ }
488
+
489
+
490
+ /* escape delimiter character */
491
+ static char *delimistr(char *str)
492
+ {
493
+ char *result;
494
+ int i,j = 0;
495
+ int len = strlen(str);
496
+
497
+ result = palloc(len -1);
498
+
499
+ for(i = 0; i < len; i++)
500
+ {
501
+ char c = (unsigned char) str[i];
502
+ if((i != 0) && (i != len -1))
503
+ {
504
+ if(c=='\'' && (char) str[i+1]=='\'')
505
+ i++;
506
+ result[j] = c;
507
+ j++;
508
+ }
509
+ }
510
+
511
+ result[j] = '\0';
512
+
513
+ return result;
514
+ }
515
+
516
+ /* for debug */
517
+ void analyze_debug(RewriteQuery *message)
518
+ {
519
+ int analyze_num,i;
520
+ analyze_num = message->analyze_num;
521
+
522
+ for(i = 0; i< analyze_num; i++)
523
+ {
524
+ AnalyzeSelect *analyze = message->analyze[i];
525
+ pool_debug("analyze_debug :select no(%d), last select(%d), last_part(%d), state(%c)",
526
+ analyze->now_select,analyze->last_select,analyze->call_part,analyze->state);
527
+ }
528
+ }
529
+
530
+ /*
531
+ * This function checks the KEYWORD(POOL_PARALLEL,POOL_LOADBALANCE)
532
+ * if the special function(like pool_parallel() or pool_loadbalance())
533
+ * is used, mark the r_code,is_parallel and is_loadbalance.
534
+ * In other cases, It is necessary to analyze the Query.
535
+ */
536
+ RewriteQuery *is_parallel_query(Node *node, POOL_CONNECTION_POOL *backend)
537
+ {
538
+ static RewriteQuery message;
539
+ static ConInfoTodblink dblink;
540
+
541
+ initMessage(&message);
542
+
543
+ if (IsA(node, SelectStmt))
544
+ {
545
+ SelectStmt *stmt;
546
+ Node *n;
547
+ int direct_ok;
548
+
549
+ stmt = (SelectStmt *) node;
550
+
551
+ /* Check the special function is used in this query*/
552
+ if (!(stmt->distinctClause || stmt->intoClause ||
553
+ stmt->fromClause || stmt->groupClause || stmt->havingClause ||
554
+ stmt->sortClause || stmt->limitOffset || stmt->limitCount ||
555
+ stmt->lockingClause || stmt->larg || stmt->rarg) &&
556
+ (n = lfirst(list_head(stmt->targetList))) && IsA(n, ResTarget))
557
+ {
558
+ ResTarget *target = (ResTarget *) n;
559
+
560
+ if (target->val && IsA(target->val, FuncCall))
561
+ {
562
+ FuncCall *func = (FuncCall *) target->val;
563
+ if (list_length(func->funcname) == 1 && func->args)
564
+ {
565
+ Node *func_args = (Node *) lfirst(list_head(func->args));
566
+ message.rewrite_query = delimistr(nodeToString(func_args));
567
+
568
+ /* pool_parallel() is used in this query */
569
+ if(strcmp(strVal(lfirst(list_head(func->funcname))),
570
+ POOL_PARALLEL) == 0)
571
+ {
572
+ message.r_code = SEND_PARALLEL_ENGINE;
573
+ message.is_parallel = true;
574
+ message.is_loadbalance = false;
575
+ pool_debug("can pool_parallel_exec %s",message.rewrite_query);
576
+ return &message;
577
+ }
578
+ else /* pool_loadbalance() is used in this query */
579
+ if(strcmp(strVal(lfirst(list_head(func->funcname))),
580
+ POOL_LOADBALANCE) == 0)
581
+ {
582
+ message.r_code = SEND_LOADBALANCE_ENGINE;
583
+ message.is_loadbalance = true;
584
+ message.is_parallel = false;
585
+ pool_debug("can loadbalance_mode %s",message.rewrite_query);
586
+ return &message;
587
+ }
588
+ }
589
+ }
590
+ }
591
+
592
+ /* ANALYZE QUERY */
593
+ message.r_code = SELECT_ANALYZE;
594
+ message.is_loadbalance = true;
595
+
596
+ initdblink(&dblink,backend);
597
+ nodeToRewriteString(&message,&dblink,node);
598
+
599
+ if(message.is_pg_catalog)
600
+ {
601
+ message.is_loadbalance = false;
602
+ message.is_parallel = false;
603
+ pool_debug("is_parallel_query: query is done by loadbalance(pgcatalog)");
604
+ return &message;
605
+ }
606
+
607
+ if(message.is_loadbalance)
608
+ {
609
+ message.is_parallel = false;
610
+ pool_debug("is_parallel_query: query is done by loadbalance");
611
+ return &message;
612
+ }
613
+
614
+ /* Analyzing Query Start */
615
+ analyze_debug(&message);
616
+
617
+ /* After the analyzing query,
618
+ * this query can be executed as parallel exec, is_parallel flag is turned on
619
+ */
620
+ direct_ok = direct_parallel_query(&message);
621
+ if(direct_ok == 1)
622
+ {
623
+ message.rewrite_query = nodeToString(node);
624
+ message.is_parallel = true;
625
+ message.is_loadbalance = false;
626
+ pool_debug("can pool_parallel_exec %s",message.rewrite_query);
627
+ return &message;
628
+ }
629
+ }
630
+ else if (IsA(node, CopyStmt))
631
+ {
632
+ /* For Copy Statement, check the table name, mark the is_parallel flag. */
633
+ CopyStmt *stmt = (CopyStmt *)node;
634
+
635
+ if (stmt->is_from == FALSE && stmt->filename == NULL)
636
+ {
637
+ RangeVar *relation = (RangeVar *)stmt->relation;
638
+
639
+ /* check on distribution table or replicate table */
640
+
641
+ if(pool_get_dist_def_info (MASTER_CONNECTION(backend)->sp->database, relation->schemaname, relation->relname))
642
+ {
643
+ message.rewrite_query = nodeToString(stmt);
644
+ message.is_parallel = true;
645
+ message.is_loadbalance = false;
646
+ message.r_code = SEND_PARALLEL_ENGINE;
647
+ }
648
+ }
649
+ }
650
+
651
+ return &message;
652
+ }
653
+
654
+ POOL_STATUS pool_do_parallel_query(POOL_CONNECTION *frontend,
655
+ POOL_CONNECTION_POOL *backend,
656
+ Node *node, bool *parallel, char **string, int *len)
657
+ {
658
+ /* The Query is analyzed first in a parallel mode(in_parallel_query),
659
+ * and, next, the Query is rewritten(rewrite_query_stmt).
660
+ */
661
+
662
+ /* analyze the query */
663
+ RewriteQuery *r_query = is_parallel_query(node,backend);
664
+
665
+ if(r_query->is_loadbalance)
666
+ {
667
+ /* Usual processing of pgpool is done by using the rewritten Query
668
+ * if judged a possible load-balancing as a result of analyzing
669
+ * the Query.
670
+ * Of course, the load is distributed only for load_balance_mode=true.
671
+ */
672
+ if(r_query->r_code == SEND_LOADBALANCE_ENGINE)
673
+ {
674
+ /* use rewritten query */
675
+ *string = r_query->rewrite_query;
676
+ /* change query length */
677
+ *len = strlen(*string)+1;
678
+ }
679
+ pool_debug("pool_do_parallel_query: load balancing query: %s",*string);
680
+ }
681
+ else if (r_query->is_parallel)
682
+ {
683
+ /*
684
+ * For the Query that the parallel processing is possible.
685
+ * Call parallel exe engine and return status to the upper layer.
686
+ */
687
+ POOL_STATUS stats = pool_parallel_exec(frontend,backend,r_query->rewrite_query, node,true);
688
+ pool_unset_query_in_progress();
689
+ return stats;
690
+ }
691
+ else if(!r_query->is_pg_catalog)
692
+ {
693
+ /* rewrite query and execute */
694
+ r_query = rewrite_query_stmt(node,frontend,backend,r_query);
695
+ if(r_query->type == T_InsertStmt)
696
+ {
697
+ /* free_parser(); */
698
+
699
+ if(r_query->r_code != INSERT_DIST_NO_RULE) {
700
+ pool_unset_query_in_progress();
701
+ pool_set_skip_reading_from_backends();
702
+ return r_query->status;
703
+ }
704
+ }
705
+ else if(r_query->type == T_SelectStmt)
706
+ {
707
+ pool_unset_query_in_progress();
708
+ pool_set_skip_reading_from_backends();
709
+ return r_query->status;
710
+ }
711
+ }
712
+
713
+ *parallel = false;
714
+ return POOL_CONTINUE;
715
+ }