Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit43fa334

Browse files
committed
Test with Table Oid error
1 parent0bafb66 commit43fa334

File tree

3 files changed

+114
-34
lines changed

3 files changed

+114
-34
lines changed

‎exec_plan.c

Lines changed: 42 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ static PlannedStmt *HOOK_Planner_injection(Query *parse, int cursorOptions,
3636
ParamListInfoboundParams);
3737
staticvoidHOOK_ExecStart_injection(QueryDesc*queryDesc,inteflags);
3838
staticvoidHOOK_ExecEnd_injection(QueryDesc*queryDesc);
39-
staticchar*serialize_plan(PlannedStmt*pstmt,ParamListInfoboundParams,
39+
staticchar*serialize_plan(PlannedStmt*pstmt,ParamListInfoboundParams,
4040
constchar*querySourceText);
4141
staticvoidexecute_query(char*planString);
4242

@@ -91,12 +91,14 @@ HOOK_Utility_injection(PlannedStmt *pstmt,
9191

9292
if ((OidIsValid(get_extension_oid("execplan", true)))&&
9393
(node_number1==0)&&
94-
(nodeTag(parsetree)==T_CreateStmt))
94+
(nodeTag(parsetree)!=T_CopyStmt)&&
95+
(nodeTag(parsetree)!=T_CreateExtensionStmt)&&
96+
(context!=PROCESS_UTILITY_SUBCOMMAND))
9597
{
9698
charconninfo[1024];
9799
intstatus;
98100

99-
elog(LOG,"Send UTILITY query: %s",queryString);
101+
elog(LOG,"Send UTILITY query %d: %s",nodeTag(parsetree),queryString);
100102

101103
/* Connect to slave and send it a query plan */
102104
sprintf(conninfo,"host=localhost port=5433%c",'\0');
@@ -108,6 +110,8 @@ HOOK_Utility_injection(PlannedStmt *pstmt,
108110
if (status==0)
109111
elog(ERROR,"Query sending error: %s",PQerrorMessage(conn));
110112
}
113+
elseif (node_number1==0)
114+
elog(LOG,"UTILITY query without sending: %s",queryString);
111115

112116
if (next_ProcessUtility_hook)
113117
(*next_ProcessUtility_hook) (pstmt,queryString,context,params,
@@ -128,6 +132,9 @@ HOOK_Utility_injection(PlannedStmt *pstmt,
128132
}
129133
}
130134

135+
/*
136+
* INPUT: a base64-encoded serialized plan
137+
*/
131138
staticvoid
132139
execute_query(char*planString)
133140
{
@@ -142,7 +149,7 @@ execute_query(char *planString)
142149
elog(LOG,"Connection error. conninfo: %s",conninfo);
143150

144151
SQLCommand= (char*)palloc0(strlen(planString)+100);
145-
sprintf(SQLCommand,"SELECT pg_execute_plan('%s')",planString);
152+
sprintf(SQLCommand,"SELECT pg_execute_plan('%s');",planString);
146153
//elog(LOG, "query: %s", SQLCommand);
147154
status=PQsendQuery(conn,SQLCommand);
148155
if (status==0)
@@ -182,9 +189,10 @@ HOOK_ExecStart_injection(QueryDesc *queryDesc, int eflags)
182189
(node_number1==0)&&
183190
((parsetree==NULL)|| (nodeTag(parsetree)!=T_CreatedbStmt)))
184191
{
192+
char*exec_plan_query=serialize_plan(queryDesc->plannedstmt,queryDesc->params,
193+
queryDesc->sourceText);
185194
elog(LOG,"Send query: %s",queryDesc->sourceText);
186-
execute_query(serialize_plan(queryDesc->plannedstmt,queryDesc->params,
187-
queryDesc->sourceText));
195+
execute_query(exec_plan_query);
188196
}
189197
else
190198
{
@@ -217,7 +225,7 @@ HOOK_ExecEnd_injection(QueryDesc *queryDesc)
217225
standard_ExecutorEnd(queryDesc);
218226
}
219227

220-
#include"utils/fmgrprotos.h"
228+
#include"common/base64.h"
221229

222230
staticchar*
223231
serialize_plan(PlannedStmt*pstmt,ParamListInfoboundParams,
@@ -226,37 +234,36 @@ serialize_plan(PlannedStmt *pstmt, ParamListInfo boundParams,
226234
intsplan_len,
227235
sparams_len,
228236
qtext_len,
237+
tot_len,
229238
econtainer_len;
230239
char*serialized_plan,
231240
*container,
232-
*start_address,
233-
*econtainer;
241+
*econtainer,
242+
*start_address;
234243

235244
serialized_plan=nodeToString(pstmt);
236-
245+
//elog(LOG, "serialized_plan: %s", serialized_plan);
237246
/* We use len+1 bytes for include end-of-string symbol. */
238247
splan_len=strlen(serialized_plan)+1;
239248
qtext_len=strlen(querySourceText)+1;
240249

241250
sparams_len=EstimateParamListSpace(boundParams);
251+
tot_len=splan_len+sparams_len+qtext_len;
242252

243-
container= (char*)palloc0(splan_len+sparams_len+qtext_len);
244-
//elog(LOG, "Serialize sizes: plan: %d params: %d, numParams: %d", splan_len, sparams_len, boundParams->numParams);
245-
memcpy(container,serialized_plan,splan_len);
246-
start_address=container+splan_len;
247-
SerializeParamList(boundParams,&start_address);
253+
container= (char*)palloc0(tot_len);
254+
start_address=container;
248255

256+
memcpy(start_address,serialized_plan,splan_len);
257+
start_address+=splan_len;
258+
SerializeParamList(boundParams,&start_address);
249259
Assert(start_address==container+splan_len+sparams_len);
250260
memcpy(start_address,querySourceText,qtext_len);
251261

252-
econtainer_len=pg_base64_enc_len(container,splan_len+sparams_len+qtext_len);
253-
econtainer= (char*)palloc0(econtainer_len+1);
254-
if (econtainer_len!=pg_base64_encode(container,splan_len+sparams_len+
255-
qtext_len,econtainer))
256-
elog(LOG,"econtainer_len: %d %d",econtainer_len,pg_base64_encode(container,splan_len+sparams_len+
257-
qtext_len,econtainer));
258-
Assert(econtainer_len==pg_base64_encode(container,splan_len+sparams_len+
259-
qtext_len,econtainer));
262+
econtainer_len=pg_b64_enc_len(tot_len);
263+
econtainer= (char*)palloc0(econtainer_len+1);
264+
Assert(pg_b64_encode(container,tot_len,econtainer) <=econtainer_len);
265+
266+
/* In accordance with example from fe-auth-scram.c */
260267
econtainer[econtainer_len]='\0';
261268

262269
returnecontainer;
@@ -309,21 +316,22 @@ Datum
309316
pg_execute_plan(PG_FUNCTION_ARGS)
310317
{
311318
char*data=TextDatumGetCString(PG_GETARG_DATUM(0));
319+
char*decdata;
320+
intdecdata_len;
312321
PlannedStmt*pstmt;
313322
QueryDesc*queryDesc;
314323
char*queryString;
315324
ParamListInfoparamLI=NULL;
316-
intdec_tot_len;
317-
char*dcontainer,
318-
*start_addr;
319-
320-
/* Compute decoded size of bytea data */
321-
dec_tot_len=pg_base64_dec_len(data,strlen(data));
322-
dcontainer= (char*)palloc0(dec_tot_len);
323-
Assert(dec_tot_len==pg_base64_decode(data,strlen(data),dcontainer));
324-
325-
pstmt= (PlannedStmt*)stringToNode((char*)dcontainer);
326-
start_addr=dcontainer+strlen(dcontainer)+1;
325+
char*start_addr;
326+
327+
Assert(data!=NULL);
328+
decdata_len=pg_b64_dec_len(strlen(data));
329+
decdata= (char*)palloc(decdata_len);
330+
//elog(LOG, "Decode query");
331+
Assert(pg_b64_decode(data,strlen(data),decdata) <=decdata_len);
332+
//elog(LOG, "Decode query1");
333+
pstmt= (PlannedStmt*)stringToNode((char*)decdata);
334+
start_addr=decdata+strlen(decdata)+1;
327335
paramLI=RestoreParamList((char**)&start_addr);
328336
queryString=start_addr;
329337
//elog(LOG, "Decoded query: %s\n", start_addr);

‎scripts/pexec.sh

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
#!/bin/bash
2+
3+
. ./paths.sh
4+
U=`whoami`
5+
6+
pkill -e postgres
7+
ulimit -c unlimited
8+
9+
rm master.log
10+
rm slave.log
11+
rm -rf PGDATA_Master
12+
mkdir PGDATA_Master
13+
rm -rf PGDATA_Slave
14+
mkdir PGDATA_Slave
15+
16+
initdb -D PGDATA_Master
17+
initdb -D PGDATA_Slave
18+
19+
echo"shared_preload_libraries = 'execplan'">> PGDATA_Master/postgresql.conf
20+
echo"lc_messages='en_US.utf8'">> PGDATA_Master/postgresql.conf
21+
echo"shared_preload_libraries = 'execplan'">> PGDATA_Slave/postgresql.conf
22+
echo"lc_messages='en_US.utf8'">> PGDATA_Slave/postgresql.conf
23+
echo"pargres.node = 1">> PGDATA_Slave/postgresql.conf
24+
25+
pg_ctl -c -o"-p 5432" -D PGDATA_Master -l master.log start
26+
pg_ctl -c -o"-p 5433" -D PGDATA_Slave -l slave.log start
27+
28+
createdb -p 5432$U
29+
createdb -p 5433$U
30+
#exit
31+
psql -p 5432 -c"CREATE EXTENSION execplan;"
32+
psql -p 5433 -c"CREATE EXTENSION execplan;"
33+
psql -p 5432 -c"SELECT proname, oid FROM pg_proc WHERE proname LIKE 'pg_exec%';"
34+
psql -p 5432 -c"CREATE TABLE t1 (idSerial, bINT, PRIMARY KEY(id));"
35+
36+
#psql -p 5433 -c "CREATE TABLE t1 (idSerial, bINT, PRIMARY KEY(id));"
37+
38+
psql -p 5432 -f test.sql
39+
40+
psql -p 5432 -c"SELECT * FROM t1;"
41+
psql -p 5433 -c"SELECT * FROM t1;"
42+
43+
# pgbench test
44+
#pgbench -p 5433 -i -s 1
45+
# If we will plan query at master consistency will be guaranteed
46+
#psql -p 5433 -c "DELETE FROM pgbench_accounts;"
47+
#psql -p 5433 -c "DELETE FROM pgbench_branches;"
48+
#psql -p 5433 -c "DELETE FROM pgbench_tellers;"
49+
psql -p 5433 -c"CREATE TABLE t2 (id Serial, b INT, PRIMARY KEY(id));"
50+
pgbench -p 5432 -i -s 1
51+
52+
psql -c"select oid, relname from pg_class WHERE relname LIKE 'pgbench%';"
53+
psql -p 5433 -c"select oid, relname from pg_class WHERE relname LIKE 'pgbench%';"
54+
# Copy all tuples from pgbench_accounts
55+
#psql -p 5433 -c "INSERT INTO pgbench_accounts (SELECT * FROM pgbench_accounts) ON CONFLICT (aid) DO UPDATE SET abalance=pgbench_accounts.abalance;"
56+
psql -p 5432 -c"INSERT INTO pgbench_accounts (SELECT * FROM pgbench_accounts) ON CONFLICT (aid) DO NOTHING;"
57+
58+
#pgbench -t 1000 -j 4 -c 4
59+
60+
psql -p 5433 -c"SELECT count(*) FROM pgbench_accounts;"
61+
62+
#pg_ctl -D PGDATA_Master stop
63+
pg_ctl -D PGDATA_Slave stop
64+

‎scripts/test.sql

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
INSERT INTO t1 (b)VALUES (3);
2+
INSERT INTO t1 (b)VALUES (15);
3+
INSERT INTO t1 (id, b)VALUES (3,15);
4+
5+
-- Check params serialization
6+
PREPARE fooplan (numeric,numeric)ASINSERT INTO t1VALUES($1, $2);
7+
EXECUTE fooplan(13,200);
8+

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp