|
8 | 8 | *
|
9 | 9 | *
|
10 | 10 | * IDENTIFICATION
|
11 |
| - * $Header: /cvsroot/pgsql/src/backend/executor/execQual.c,v 1.109 2002/11/15 02:50:06 momjian Exp $ |
| 11 | + * $Header: /cvsroot/pgsql/src/backend/executor/execQual.c,v 1.110 2002/11/25 21:29:35 tgl Exp $ |
12 | 12 | *
|
13 | 13 | *-------------------------------------------------------------------------
|
14 | 14 | */
|
@@ -392,123 +392,89 @@ ExecEvalVar(Var *variable, ExprContext *econtext, bool *isNull)
|
392 | 392 | * Returns the value of a parameter. A param node contains
|
393 | 393 | * something like ($.name) and the expression context contains
|
394 | 394 | * the current parameter bindings (name = "sam") (age = 34)...
|
395 |
| - * so our job is to replace the param node with the datum |
396 |
| - * containing the appropriate information ("sam"). |
| 395 | + * so our job is to find and return the appropriate datum ("sam"). |
397 | 396 | *
|
398 | 397 | * Q: if we have a parameter ($.foo) without a binding, i.e.
|
399 | 398 | * there is no (foo = xxx) in the parameter list info,
|
400 | 399 | * is this a fatal error or should this be a "not available"
|
401 |
| - * (in which case we shoud return a Const node with the |
402 |
| - * isnull flag) ? -cim 10/13/89 |
403 |
| - * |
404 |
| - * Minor modification: Param nodes now have an extra field, |
405 |
| - * `paramkind' which specifies the type of parameter |
406 |
| - * (see params.h). So while searching the paramList for |
407 |
| - * a paramname/value pair, we have also to check for `kind'. |
408 |
| - * |
409 |
| - * NOTE: The last entry in `paramList' is always an |
410 |
| - * entry with kind == PARAM_INVALID. |
| 400 | + * (in which case we could return NULL)? -cim 10/13/89 |
411 | 401 | * ----------------------------------------------------------------
|
412 | 402 | */
|
413 | 403 | Datum
|
414 | 404 | ExecEvalParam(Param *expression, ExprContext *econtext, bool *isNull)
|
415 | 405 | {
|
416 |
| - char *thisParameterName; |
417 |
| - int thisParameterKind = expression->paramkind; |
418 |
| - AttrNumber thisParameterId = expression->paramid; |
419 |
| - int matchFound; |
420 |
| - ParamListInfo paramList; |
| 406 | + int thisParamKind = expression->paramkind; |
| 407 | + AttrNumber thisParamId = expression->paramid; |
421 | 408 |
|
422 |
| - if (thisParameterKind == PARAM_EXEC) |
| 409 | + if (thisParamKind == PARAM_EXEC) |
423 | 410 | {
|
| 411 | + /* |
| 412 | + * PARAM_EXEC params (internal executor parameters) are stored in |
| 413 | + * the ecxt_param_exec_vals array, and can be accessed by array index. |
| 414 | + */ |
424 | 415 | ParamExecData *prm;
|
425 | 416 |
|
426 |
| - prm = &(econtext->ecxt_param_exec_vals[thisParameterId]); |
| 417 | + prm = &(econtext->ecxt_param_exec_vals[thisParamId]); |
427 | 418 | if (prm->execPlan != NULL)
|
428 | 419 | {
|
| 420 | + /* Parameter not evaluated yet, so go do it */ |
429 | 421 | ExecSetParamPlan(prm->execPlan, econtext);
|
430 | 422 | /* ExecSetParamPlan should have processed this param... */
|
431 | 423 | Assert(prm->execPlan == NULL);
|
432 | 424 | }
|
433 | 425 | *isNull = prm->isnull;
|
434 | 426 | return prm->value;
|
435 | 427 | }
|
436 |
| - |
437 |
| - thisParameterName = expression->paramname; |
438 |
| - paramList = econtext->ecxt_param_list_info; |
439 |
| - |
440 |
| - *isNull = false; |
441 |
| - |
442 |
| - /* |
443 |
| - * search the list with the parameter info to find a matching name. An |
444 |
| - * entry with an InvalidName denotes the last element in the array. |
445 |
| - */ |
446 |
| - matchFound = 0; |
447 |
| - if (paramList != NULL) |
| 428 | + else |
448 | 429 | {
|
449 | 430 | /*
|
450 |
| - * search for an entry in 'paramList' that matches the |
451 |
| - * `expression'. |
| 431 | + * All other parameter types must be sought in ecxt_param_list_info. |
| 432 | + * NOTE: The last entry in the param array is always an |
| 433 | + * entry with kind == PARAM_INVALID. |
452 | 434 | */
|
453 |
| - while (paramList->kind != PARAM_INVALID && !matchFound) |
| 435 | + ParamListInfo paramList = econtext->ecxt_param_list_info; |
| 436 | + char *thisParamName = expression->paramname; |
| 437 | + bool matchFound = false; |
| 438 | + |
| 439 | + if (paramList != NULL) |
454 | 440 | {
|
455 |
| - switch (thisParameterKind) |
| 441 | + while (paramList->kind != PARAM_INVALID && !matchFound) |
456 | 442 | {
|
457 |
| - case PARAM_NAMED: |
458 |
| - if (thisParameterKind == paramList->kind && |
459 |
| - strcmp(paramList->name, thisParameterName) == 0) |
460 |
| - matchFound = 1; |
461 |
| - break; |
462 |
| - case PARAM_NUM: |
463 |
| - if (thisParameterKind == paramList->kind && |
464 |
| - paramList->id == thisParameterId) |
465 |
| - matchFound = 1; |
466 |
| - break; |
467 |
| - case PARAM_OLD: |
468 |
| - case PARAM_NEW: |
469 |
| - if (thisParameterKind == paramList->kind && |
470 |
| - paramList->id == thisParameterId) |
| 443 | + if (thisParamKind == paramList->kind) |
| 444 | + { |
| 445 | + switch (thisParamKind) |
471 | 446 | {
|
472 |
| - matchFound = 1; |
473 |
| - |
474 |
| - /* |
475 |
| - * sanity check |
476 |
| - */ |
477 |
| - if (strcmp(paramList->name, thisParameterName) != 0) |
478 |
| - { |
479 |
| - elog(ERROR, |
480 |
| - "ExecEvalParam: new/old params with same id & diff names"); |
481 |
| - } |
| 447 | + case PARAM_NAMED: |
| 448 | + if (strcmp(paramList->name, thisParamName) == 0) |
| 449 | + matchFound = true; |
| 450 | + break; |
| 451 | + case PARAM_NUM: |
| 452 | + if (paramList->id == thisParamId) |
| 453 | + matchFound = true; |
| 454 | + break; |
| 455 | + default: |
| 456 | + elog(ERROR, "ExecEvalParam: invalid paramkind %d", |
| 457 | + thisParamKind); |
482 | 458 | }
|
483 |
| - break; |
484 |
| - default: |
| 459 | + } |
| 460 | + if (!matchFound) |
| 461 | + paramList++; |
| 462 | + } /* while */ |
| 463 | + } /* if */ |
485 | 464 |
|
486 |
| - /* |
487 |
| - * oops! this is not supposed to happen! |
488 |
| - */ |
489 |
| - elog(ERROR, "ExecEvalParam: invalid paramkind %d", |
490 |
| - thisParameterKind); |
491 |
| - } |
492 |
| - if (!matchFound) |
493 |
| - paramList++; |
494 |
| - } /* while */ |
495 |
| - } /* if */ |
| 465 | + if (!matchFound) |
| 466 | + { |
| 467 | + if (thisParamKind == PARAM_NAMED) |
| 468 | + elog(ERROR, "ExecEvalParam: Unknown value for parameter %s", |
| 469 | + thisParamName); |
| 470 | + else |
| 471 | + elog(ERROR, "ExecEvalParam: Unknown value for parameter %d", |
| 472 | + thisParamId); |
| 473 | + } |
496 | 474 |
|
497 |
| - if (!matchFound) |
498 |
| - { |
499 |
| - /* |
500 |
| - * ooops! we couldn't find this parameter in the parameter list. |
501 |
| - * Signal an error |
502 |
| - */ |
503 |
| - elog(ERROR, "ExecEvalParam: Unknown value for parameter %s", |
504 |
| - thisParameterName); |
| 475 | + *isNull = paramList->isnull; |
| 476 | + return paramList->value; |
505 | 477 | }
|
506 |
| - |
507 |
| - /* |
508 |
| - * return the value. |
509 |
| - */ |
510 |
| - *isNull = paramList->isnull; |
511 |
| - return paramList->value; |
512 | 478 | }
|
513 | 479 |
|
514 | 480 |
|
|
0 commit comments