|
29 | 29 | * MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
30 | 30 | *
|
31 | 31 | * IDENTIFICATION
|
32 |
| - * $Header: /cvsroot/pgsql/src/pl/plpython/plpython.c,v 1.32 2003/05/27 17:49:47 momjian Exp $ |
| 32 | + * $Header: /cvsroot/pgsql/src/pl/plpython/plpython.c,v 1.33 2003/06/11 18:33:39 tgl Exp $ |
33 | 33 | *
|
34 | 34 | *********************************************************************
|
35 | 35 | */
|
@@ -244,8 +244,8 @@ static void PLy_typeinfo_init(PLyTypeInfo *);
|
244 | 244 | static void PLy_typeinfo_dealloc(PLyTypeInfo *);
|
245 | 245 | static void PLy_output_datum_func(PLyTypeInfo *, Form_pg_type);
|
246 | 246 | static void PLy_output_datum_func2(PLyObToDatum *, Form_pg_type);
|
247 |
| -static void PLy_input_datum_func(PLyTypeInfo *, Form_pg_type); |
248 |
| -static void PLy_input_datum_func2(PLyDatumToOb *, Form_pg_type); |
| 247 | +static void PLy_input_datum_func(PLyTypeInfo *, Oid, Form_pg_type); |
| 248 | +static void PLy_input_datum_func2(PLyDatumToOb *, Oid, Form_pg_type); |
249 | 249 | static void PLy_output_tuple_funcs(PLyTypeInfo *, TupleDesc);
|
250 | 250 | static void PLy_input_tuple_funcs(PLyTypeInfo *, TupleDesc);
|
251 | 251 |
|
@@ -1152,7 +1152,9 @@ PLy_procedure_create(FunctionCallInfo fcinfo, bool is_trigger,
|
1152 | 1152 | argTypeStruct = (Form_pg_type) GETSTRUCT(argTypeTup);
|
1153 | 1153 |
|
1154 | 1154 | if (argTypeStruct->typrelid == InvalidOid)
|
1155 |
| - PLy_input_datum_func(&(proc->args[i]), argTypeStruct); |
| 1155 | + PLy_input_datum_func(&(proc->args[i]), |
| 1156 | + procStruct->proargtypes[i], |
| 1157 | + argTypeStruct); |
1156 | 1158 | else
|
1157 | 1159 | {
|
1158 | 1160 | TupleTableSlot *slot = (TupleTableSlot *) fcinfo->arg[i];
|
@@ -1373,7 +1375,9 @@ PLy_input_tuple_funcs(PLyTypeInfo * arg, TupleDesc desc)
|
1373 | 1375 |
|
1374 | 1376 | typeStruct = (Form_pg_type) GETSTRUCT(typeTup);
|
1375 | 1377 |
|
1376 |
| - PLy_input_datum_func2(&(arg->in.r.atts[i]), typeStruct); |
| 1378 | + PLy_input_datum_func2(&(arg->in.r.atts[i]), |
| 1379 | + desc->attrs[i]->atttypid, |
| 1380 | + typeStruct); |
1377 | 1381 |
|
1378 | 1382 | ReleaseSysCache(typeTup);
|
1379 | 1383 | }
|
@@ -1439,85 +1443,46 @@ PLy_output_datum_func2(PLyObToDatum * arg, Form_pg_type typeStruct)
|
1439 | 1443 | }
|
1440 | 1444 |
|
1441 | 1445 | void
|
1442 |
| -PLy_input_datum_func(PLyTypeInfo * arg, Form_pg_type typeStruct) |
| 1446 | +PLy_input_datum_func(PLyTypeInfo * arg, Oid typeOid, Form_pg_type typeStruct) |
1443 | 1447 | {
|
1444 | 1448 | enter();
|
1445 | 1449 |
|
1446 | 1450 | if (arg->is_rel == 1)
|
1447 | 1451 | elog(FATAL, "plpython: PLyTypeInfo struct is initialized for Tuple");
|
1448 | 1452 | arg->is_rel = 0;
|
1449 |
| - PLy_input_datum_func2(&(arg->in.d), typeStruct); |
| 1453 | + PLy_input_datum_func2(&(arg->in.d), typeOid, typeStruct); |
1450 | 1454 | }
|
1451 | 1455 |
|
1452 | 1456 | void
|
1453 |
| -PLy_input_datum_func2(PLyDatumToOb * arg, Form_pg_type typeStruct) |
| 1457 | +PLy_input_datum_func2(PLyDatumToOb * arg, Oid typeOid, Form_pg_type typeStruct) |
1454 | 1458 | {
|
1455 |
| - char *type; |
1456 |
| - |
| 1459 | + /* Get the type's conversion information */ |
1457 | 1460 | perm_fmgr_info(typeStruct->typoutput, &arg->typfunc);
|
1458 | 1461 | arg->typelem = typeStruct->typelem;
|
1459 | 1462 | arg->typbyval = typeStruct->typbyval;
|
1460 | 1463 |
|
1461 |
| - /* |
1462 |
| - * hmmm, wierd. means this arg will always be converted to a python |
1463 |
| - * None |
1464 |
| - */ |
1465 |
| - if (!OidIsValid(typeStruct->typoutput)) |
1466 |
| - { |
1467 |
| - elog(ERROR, "plpython: (FIXME) typeStruct->typoutput is invalid"); |
1468 |
| - |
1469 |
| - arg->func = NULL; |
1470 |
| - return; |
1471 |
| - } |
1472 |
| - |
1473 |
| - type = NameStr(typeStruct->typname); |
1474 |
| - switch (type[0]) |
| 1464 | + /* Determine which kind of Python object we will convert to */ |
| 1465 | + switch (typeOid) |
1475 | 1466 | {
|
1476 |
| - case 'b': |
1477 |
| - { |
1478 |
| - if (strcasecmp("bool", type)) |
1479 |
| - { |
1480 |
| - arg->func = PLyBool_FromString; |
1481 |
| - return; |
1482 |
| - } |
1483 |
| - break; |
1484 |
| - } |
1485 |
| - case 'f': |
1486 |
| - { |
1487 |
| - if ((strncasecmp("float", type, 5) == 0) && |
1488 |
| - ((type[5] == '8') || (type[5] == '4'))) |
1489 |
| - { |
1490 |
| - arg->func = PLyFloat_FromString; |
1491 |
| - return; |
1492 |
| - } |
1493 |
| - break; |
1494 |
| - } |
1495 |
| - case 'i': |
1496 |
| - { |
1497 |
| - if ((strncasecmp("int", type, 3) == 0) && |
1498 |
| - ((type[3] == '4') || (type[3] == '2')) && |
1499 |
| - (type[4] == '\0')) |
1500 |
| - { |
1501 |
| - arg->func = PLyInt_FromString; |
1502 |
| - return; |
1503 |
| - } |
1504 |
| - else if (strcasecmp("int8", type) == 0) |
1505 |
| - arg->func = PLyLong_FromString; |
1506 |
| - break; |
1507 |
| - } |
1508 |
| - case 'n': |
1509 |
| - { |
1510 |
| - if (strcasecmp("numeric", type) == 0) |
1511 |
| - { |
1512 |
| - arg->func = PLyFloat_FromString; |
1513 |
| - return; |
1514 |
| - } |
1515 |
| - break; |
1516 |
| - } |
| 1467 | + case BOOLOID: |
| 1468 | + arg->func = PLyBool_FromString; |
| 1469 | + break; |
| 1470 | + case FLOAT4OID: |
| 1471 | + case FLOAT8OID: |
| 1472 | + case NUMERICOID: |
| 1473 | + arg->func = PLyFloat_FromString; |
| 1474 | + break; |
| 1475 | + case INT2OID: |
| 1476 | + case INT4OID: |
| 1477 | + arg->func = PLyInt_FromString; |
| 1478 | + break; |
| 1479 | + case INT8OID: |
| 1480 | + arg->func = PLyLong_FromString; |
| 1481 | + break; |
1517 | 1482 | default:
|
| 1483 | + arg->func = PLyString_FromString; |
1518 | 1484 | break;
|
1519 | 1485 | }
|
1520 |
| - arg->func = PLyString_FromString; |
1521 | 1486 | }
|
1522 | 1487 |
|
1523 | 1488 | void
|
|
0 commit comments