323{
324 bool typisvarlena;
325
326
327 typoid = getBaseType(typoid);
328
329 *outfuncoid = InvalidOid;
330
331
332
333
334
335
336
337 switch (typoid)
338 {
339 case BOOLOID:
341 break;
342
343 case INT2OID:
344 case INT4OID:
345 case INT8OID:
346 case FLOAT4OID:
347 case FLOAT8OID:
348 case NUMERICOID:
349 getTypeOutputInfo(typoid, outfuncoid, &typisvarlena);
351 break;
352
353 case DATEOID:
355 break;
356
357 case TIMESTAMPOID:
359 break;
360
361 case TIMESTAMPTZOID:
363 break;
364
365 case JSONOID:
366 case JSONBOID:
367 getTypeOutputInfo(typoid, outfuncoid, &typisvarlena);
369 break;
370
371 default:
372
373 if (OidIsValid(get_element_type(typoid)) || typoid == ANYARRAYOID
374 || typoid == RECORDARRAYOID)
376 else if (type_is_rowtype(typoid))
378 else
379 {
380
382
383 if (typoid >= FirstNormalObjectId)
384 {
385 Oid castfunc;
386 CoercionPathType ctype;
387
388 ctype = find_coercion_pathway(JSONOID, typoid,
389 COERCION_EXPLICIT,
390 &castfunc);
391 if (ctype == COERCION_PATH_FUNC && OidIsValid(castfunc))
392 {
394 *outfuncoid = castfunc;
395 }
396 else
397 {
398
399 getTypeOutputInfo(typoid, outfuncoid, &typisvarlena);
400 }
401 }
402 else
403 {
404
405 getTypeOutputInfo(typoid, outfuncoid, &typisvarlena);
406 }
407 }
408 break;
409 }
410}