|
8 | 8 | * |
9 | 9 | * |
10 | 10 | * IDENTIFICATION |
11 | | - * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.253 2010/01/02 16:58:13 momjian Exp $ |
| 11 | + * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.254 2010/01/19 01:35:31 tgl Exp $ |
12 | 12 | * |
13 | 13 | *------------------------------------------------------------------------- |
14 | 14 | */ |
@@ -200,7 +200,8 @@ static PreparedParamsData *exec_eval_using_params(PLpgSQL_execstate *estate, |
200 | 200 | List*params); |
201 | 201 | staticvoidfree_params_data(PreparedParamsData*ppd); |
202 | 202 | staticPortalexec_dynquery_with_params(PLpgSQL_execstate*estate, |
203 | | -PLpgSQL_expr*query,List*params); |
| 203 | +PLpgSQL_expr*dynquery,List*params, |
| 204 | +constchar*portalname,intcursorOptions); |
204 | 205 |
|
205 | 206 |
|
206 | 207 | /* ---------- |
@@ -2337,7 +2338,7 @@ exec_stmt_return_query(PLpgSQL_execstate *estate, |
2337 | 2338 | /* RETURN QUERY EXECUTE */ |
2338 | 2339 | Assert(stmt->dynquery!=NULL); |
2339 | 2340 | portal=exec_dynquery_with_params(estate,stmt->dynquery, |
2340 | | -stmt->params); |
| 2341 | +stmt->params,NULL,0); |
2341 | 2342 | } |
2342 | 2343 |
|
2343 | 2344 | tupmap=convert_tuples_by_position(portal->tupDesc, |
@@ -3133,7 +3134,8 @@ exec_stmt_dynfors(PLpgSQL_execstate *estate, PLpgSQL_stmt_dynfors *stmt) |
3133 | 3134 | Portalportal; |
3134 | 3135 | intrc; |
3135 | 3136 |
|
3136 | | -portal=exec_dynquery_with_params(estate,stmt->query,stmt->params); |
| 3137 | +portal=exec_dynquery_with_params(estate,stmt->query,stmt->params, |
| 3138 | +NULL,0); |
3137 | 3139 |
|
3138 | 3140 | /* |
3139 | 3141 | * Execute the loop |
@@ -3161,7 +3163,6 @@ exec_stmt_open(PLpgSQL_execstate *estate, PLpgSQL_stmt_open *stmt) |
3161 | 3163 | PLpgSQL_expr*query; |
3162 | 3164 | Portalportal; |
3163 | 3165 | ParamListInfoparamLI; |
3164 | | -boolisnull; |
3165 | 3166 |
|
3166 | 3167 | /* ---------- |
3167 | 3168 | * Get the cursor variable and if it has an assigned name, check |
@@ -3201,43 +3202,11 @@ exec_stmt_open(PLpgSQL_execstate *estate, PLpgSQL_stmt_open *stmt) |
3201 | 3202 | * This is an OPEN refcursor FOR EXECUTE ... |
3202 | 3203 | * ---------- |
3203 | 3204 | */ |
3204 | | -DatumqueryD; |
3205 | | -Oidrestype; |
3206 | | -char*querystr; |
3207 | | -SPIPlanPtrcurplan; |
3208 | | - |
3209 | | -/* ---------- |
3210 | | - * We evaluate the string expression after the |
3211 | | - * EXECUTE keyword. It's result is the querystring we have |
3212 | | - * to execute. |
3213 | | - * ---------- |
3214 | | - */ |
3215 | | -queryD=exec_eval_expr(estate,stmt->dynquery,&isnull,&restype); |
3216 | | -if (isnull) |
3217 | | -ereport(ERROR, |
3218 | | -(errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), |
3219 | | -errmsg("query string argument of EXECUTE is null"))); |
3220 | | - |
3221 | | -/* Get the C-String representation */ |
3222 | | -querystr=convert_value_to_string(queryD,restype); |
3223 | | - |
3224 | | -exec_eval_cleanup(estate); |
3225 | | - |
3226 | | -/* ---------- |
3227 | | - * Now we prepare a query plan for it and open a cursor |
3228 | | - * ---------- |
3229 | | - */ |
3230 | | -curplan=SPI_prepare_cursor(querystr,0,NULL,stmt->cursor_options); |
3231 | | -if (curplan==NULL) |
3232 | | -elog(ERROR,"SPI_prepare_cursor failed for \"%s\": %s", |
3233 | | -querystr,SPI_result_code_string(SPI_result)); |
3234 | | -portal=SPI_cursor_open(curname,curplan,NULL,NULL, |
3235 | | -estate->readonly_func); |
3236 | | -if (portal==NULL) |
3237 | | -elog(ERROR,"could not open cursor for query \"%s\": %s", |
3238 | | -querystr,SPI_result_code_string(SPI_result)); |
3239 | | -pfree(querystr); |
3240 | | -SPI_freeplan(curplan); |
| 3205 | +portal=exec_dynquery_with_params(estate, |
| 3206 | +stmt->dynquery, |
| 3207 | +stmt->params, |
| 3208 | +curname, |
| 3209 | +stmt->cursor_options); |
3241 | 3210 |
|
3242 | 3211 | /* |
3243 | 3212 | * If cursor variable was NULL, store the generated portal name in it |
@@ -5530,8 +5499,11 @@ free_params_data(PreparedParamsData *ppd) |
5530 | 5499 | * Open portal for dynamic query |
5531 | 5500 | */ |
5532 | 5501 | staticPortal |
5533 | | -exec_dynquery_with_params(PLpgSQL_execstate*estate,PLpgSQL_expr*dynquery, |
5534 | | -List*params) |
| 5502 | +exec_dynquery_with_params(PLpgSQL_execstate*estate, |
| 5503 | +PLpgSQL_expr*dynquery, |
| 5504 | +List*params, |
| 5505 | +constchar*portalname, |
| 5506 | +intcursorOptions) |
5535 | 5507 | { |
5536 | 5508 | Portalportal; |
5537 | 5509 | Datumquery; |
@@ -5564,20 +5536,22 @@ exec_dynquery_with_params(PLpgSQL_execstate *estate, PLpgSQL_expr *dynquery, |
5564 | 5536 | PreparedParamsData*ppd; |
5565 | 5537 |
|
5566 | 5538 | ppd=exec_eval_using_params(estate,params); |
5567 | | -portal=SPI_cursor_open_with_args(NULL, |
| 5539 | +portal=SPI_cursor_open_with_args(portalname, |
5568 | 5540 | querystr, |
5569 | 5541 | ppd->nargs,ppd->types, |
5570 | 5542 | ppd->values,ppd->nulls, |
5571 | | -estate->readonly_func,0); |
| 5543 | +estate->readonly_func, |
| 5544 | +cursorOptions); |
5572 | 5545 | free_params_data(ppd); |
5573 | 5546 | } |
5574 | 5547 | else |
5575 | 5548 | { |
5576 | | -portal=SPI_cursor_open_with_args(NULL, |
| 5549 | +portal=SPI_cursor_open_with_args(portalname, |
5577 | 5550 | querystr, |
5578 | 5551 | 0,NULL, |
5579 | 5552 | NULL,NULL, |
5580 | | -estate->readonly_func,0); |
| 5553 | +estate->readonly_func, |
| 5554 | +cursorOptions); |
5581 | 5555 | } |
5582 | 5556 |
|
5583 | 5557 | if (portal==NULL) |
|