128         HeapTupleData tmptup,
 
  131         bool            needsep = 
false;
 
  133         StringInfo      props = makeStringInfo();
 
  134         bool            geom_column_found = 
false;
 
  136         sep = use_line_feeds ? 
",\n " : 
", ";
 
  138         td = DatumGetHeapTupleHeader(composite);
 
  141         tupType = HeapTupleHeaderGetTypeId(td);
 
  142         tupTypmod = HeapTupleHeaderGetTypMod(td);
 
  143         tupdesc = lookup_rowtype_tupdesc(tupType, tupTypmod);
 
  146         tmptup.t_len = HeapTupleHeaderGetDatumLength(td);
 
  150         appendStringInfoString(
result, 
"{\"type\": \"Feature\", \"geometry\": ");
 
  152         for (i = 0; i < tupdesc->natts; i++)
 
  159                 Form_pg_attribute att = TupleDescAttr(tupdesc, i);
 
  160                 bool        is_geom_column = 
false;
 
  162                 if (att->attisdropped)
 
  165                 attname = NameStr(att->attname);
 
  167                 if (geom_column_name)
 
  168                         is_geom_column = (strcmp(attname, geom_column_name) == 0);
 
  170                         is_geom_column = (att->atttypid == geom_oid || att->atttypid == geog_oid);
 
  172                 if ((!geom_column_found) && is_geom_column)
 
  175                         geom_column_found = 
true;
 
  177                         val = heap_getattr(tuple, i + 1, tupdesc, &isnull);
 
  187                                                                                  Int32GetDatum(maxdecimaldigits))));
 
  191                                 appendStringInfoString(
result, 
"{\"type\": null}");
 
  197                                 appendStringInfoString(props, sep);
 
  200                         escape_json(props, attname);
 
  201                         appendStringInfoString(props, 
": ");
 
  203                         val = heap_getattr(tuple, i + 1, tupdesc, &isnull);
 
  208                                 outfuncoid = InvalidOid;
 
  213                         datum_to_json(val, isnull, props, tcategory, outfuncoid, 
false);
 
  217         if (!geom_column_found)
 
  219                                 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
 
  220                                  errmsg(
"geometry column is missing")));
 
  222         appendStringInfoString(
result, 
", \"properties\": {");
 
  223         appendStringInfo(
result, 
"%s", props->data);
 
  225         appendStringInfoString(
result, 
"}}");
 
  226         ReleaseTupleDesc(tupdesc);
 
char result[OUT_DOUBLE_BUFFER_SIZE]
static void json_categorize_type(Oid typoid, JsonTypeCategory *tcategory, Oid *outfuncoid)
Datum LWGEOM_asGeoJson(PG_FUNCTION_ARGS)
static void datum_to_json(Datum val, bool is_null, StringInfo result, JsonTypeCategory tcategory, Oid outfuncoid, bool key_scalar)