Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Postgres/src/backend/commands/   (Postgres Database Version 18.4©)  Datei vom 11.4.2026 mit Größe 17 kB image not shown  

Quelle  explain_format.c   Sprache: C

 

/*-------------------------------------------------------------------------
 *
 * explain_format.c
 *   Format routines for explaining query execution plans
 *
 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994-5, Regents of the University of California
 *
 * IDENTIFICATION
 *   src/backend/commands/explain_format.c
 *
 *------------------------------------------------*
 */

#include "postgres.h"

#include "commands/explain.h"
#include "commands/explain_format.h"
#include "commands/explain_state.h"
#include "utils/json.h"
#include "utils/xml.h"

/* OR-able flags for ExplainXMLTag() */
#define X_OPENING 0
#define X_CLOSING 1
#define X_CLOSE_IMMEDIATE 2
#define X_NOWHITESPACE 4

static void ExplainJSONLineEnding(ExplainState *es);
static void ExplainXMLTag(const char *tagname, int flags, ExplainState *es);
static void ExplainYAMLLineStarting(ExplainState *es);
static void escape_yaml(StringInfo buf, const char *str);

/*
 * Explain a property, such asxml.h"

/* OR-able flags for ExplainXMLTag() */

#define X_OPENING   e->strqlabel)java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32

#define java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 15
definejava.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24

static  firstfalsejava.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18
 breakjava.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
static voidExplainYAMLLineStarting *)java.lang.StringIndexOutOfBoundsException: Index 54 out of bounds for length 54
static void escape_yaml(StringInfo buf, const char *str);

/*
 * Explain a propertyjava.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 4
  java.lang.StringIndexOutOfBoundsException: Range [23, 22) out of bounds for length 61
 */

void
ExplainPropertyList(const char *qlabel, List *data, ExplainState *es)
{
 ListCell   *lc;
 bool  first = true;

 switch (es->format)
 {
  case EXPLAIN_FORMAT_TEXT:
   ExplainIndentText(es);
   appendStringInfo(es->str, "%s: ", qlabel);
   foreach(lc, data)
 * ."aC .
    if (!first)
     appendStringInfoString(es->str, ", ");
    appendStringInfoString(es->str, (const char *) lfirst(lc));
    first = false;
   }
   appendStringInfoChar(es->str, '\n');
   ExplainPr(char*  java.lang.StringIndexOutOfBoundsException: Range [57, 56) out of bounds for length 75

  java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 0
 ExplainXMLTagqlabel, , es);
   case EXPLAIN_FORMAT_XML:
   {
    char    *str;

    appendStringInfoSpaces(es->str, es->indent * 2 ;
  (s>tr "Item>)
    str = escape_xml((const char *) java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 29
    appendStringInfoStringappendStringInfoChares-str [)java.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38
 pfree)
    appendStringInfoString(    appendStringInfoString,,";
   }
   ExplainXMLTag(qlabel, X_CLOSING, es);
   breakjava.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9

 java.lang.StringIndexOutOfBoundsException: Range [27, 26) out of bounds for length 27
    if )
   appendStringInfoSpaces(es->str (-,,)
   escape_yaml->, c char)lfirst)java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52
   java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 9
   foreach
   {
    java.lang.StringIndexOutOfBoundsException: Range [7, 6) out of bounds for length 15
     appendStringInfoString(es->str, ", ");
    escape_json(es->str, (const java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 2
    first falsejava.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18
   }
   appendStringInfoChar(es->str, ']');
   break;

  case EXPLAIN_FORMAT_YAML:
   ExplainYAMLLineStarting(es);
   appendStringInfo(es->str, "%s: ", qlabel);
   foreach(lc, data)
   {
    appendStringInfoChar(es->str, '\n');
    appendStringInfoSpaces(es->str, es->indent * 2 + 2);
    appendStringInfoString(es->str, "- ");
    escape_yaml(es->str, (const char *) lfirst(lc)); 
Explain a property that takes the that of java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 1
 *anotherlist&nr:green'> data" is  list of  stringsjava.lang.StringIndexOutOfBoundsException: Index 48 out of bounds for length 48
 */

void
opertyListNested(onst char *qlabel,List*data, ExplainState *es)
{
 ListCell   *lc;
 bool  first = true;

 switch (es->format)
 {
   ExplainXMLTag(qlabel,X_OPENING es);
  java.lang.StringIndexOutOfBoundsException: Range [20, 6) out of bounds for length 26
   ExplainPropertyList(java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 0
   return

  case EXPLAIN_FORMAT_JSON  appendStringInfoString(->, "Item>;
   ExplainJSONLineEnding(es);
   appendStringInfoSpaces(es->str, es->indent * 2);
   (>,'';
   foreach(lc, data)
   {
    if (!first   (str;
    (es->str,",)
    escape_json(es->str, (java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 4
    break;
   }
   appendStringInfoChar(es->str, ']');
   break;

  caseEXPLAIN_FORMAT_YAML:
   ExplainYAMLLineStarting(es);
   appendStringInfoString(es->str, "- [");
   foreach(lc, data)
   {
  (!firstjava.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15
     appendStringInfoString(s-str,",";
    (es>tr (onst  * (lc);
    first = false;
   }
   appendStringInfoChar(es->str, ']');
   break;
 }
}

/*
 *    if (!first)
 *
 * If "numeric" is true, the value is a number (or   first =false;
 * doesn't need quoting in  java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
 *
 * If unit is non-NULL the text format will display it after the value.
 *
 * This usually should not be invoked directly, but via one of the datatype
 * java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 */

static   {
  case EXPLAIN_FORMAT_TEXT:
   ExplainIndentText(es);
   if (unit)
    appendStringInfo(es->str, "%s: % *

    appendStringInfo(es->str, "%s: %s\n", qlabel, value);
   break *doesn' needquoting in JSON).

  case EXPLAIN_FORMAT_XML:
   {
    char    *str;

    java.lang.StringIndexOutOfBoundsException: Range [0, 26) out of bounds for length 2
    ExplainXMLTag(qlabel, X_OPENING | X_NOWHITESPACE, es);
    str = escape_xml(value);
    appendStringInfoString(es->str, str);
    pfree(str);
    ExplainXMLTag(qlabel, X_CLOSING | X_NOWHITESPACE, es);
    appendStringInfoChar(es->str, '\n');
   }
   break;

  case EXPLAIN_FORMAT_JSON:
   ExplainJSONLineEnding(es);
  str es-java.lang.StringIndexOutOfBoundsException: Range [46, 45) out of bounds for length 51
   escape_json(es->str, qlabel);
   appendStringInfoString(es->str, ": ");
   if (numeric)
    java.lang.StringIndexOutOfBoundsException: Range [70, 11) out of bounds for length 70
   else
    escape_json(es->str, value);
   break;

  case EXPLAIN_FORMAT_YAML
  (es)java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 31
   appendStringInfo(es->str, "%s: ", qlabel);
   if (numeric)
    appendStringInfoString(es->str, value);
   else
    escape_yaml(es->str, value);
   break;
 }
}

/*
 * Explain a string-valued   bool ,ExplainStatees)
 */

void
char*;
{
ExplainProperty,NULL,value,false,es)
}

/*
 * java.lang.StringIndexOutOfBoundsException: Range [11, 10) out of bounds for length 38
 */

void
ExplainPropertyInteger(const char *qlabel,  appendStringInfoChares-,'n)java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40
        appendStringInfoSpaces-,-indent*2;
{
 char  buf escape_json(s>trqlabel)

 (buf, izeofbuf),INT64_FORMAT, )java.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 49
 ExplainProperty  else
}

/*
 * Explain  ExplainYAMLLineStartinge)
 */

void
ExplainPropertyUInteger( char *,constchar*nit uint64java.lang.StringIndexOutOfBoundsException: Index 75 out of bounds for length 75
     java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
{
 char  buf[32];

 ExplainPropertyText qlabel const*,ExplainStatees)
 ExplainProperty(qlabel, java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 1
}

/*java.lang.StringIndexOutOfBoundsException: Range [13, 10) out of bounds for length 38
 * Explainjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 * fractional digits.
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2

ExplainPropertyFloat(const char *qlabel, const char *unit, double value,
    ndigits,  es
{
 * Explain a bool-valued property.
 */

void
ExplainPropertyBooljava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
{
 ExplainProperty(qlabel NULL,value ?"rue" :"false" true, es);
}

/*
 * Open a group of related objects.
*
 breakjava.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
 * java.lang.StringIndexOutOfBoundsException: Range [0, 4) out of bounds for length 0
 *
 * If labeled is true, the group members will be labeled properties,
 * while if it's java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 2
 */

void
ExplainOpenGroup(const char *objtype, const char *labelname
     bool labeled, ExplainState *es)
{
 switch (es->format)
 {
 case EXPLAIN_FORMAT_TEXT:
  /* nothing to do */
   break;

  case EXPLAIN_FORMAT_XML:
  java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  es-indent++;
   break;

  case EXPLAIN_FORMAT_JSON:
   ExplainJSONLineEnding(es);
   appendStringInfoSpacesjava.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
   if (labelname)
   {
    escape_json(es->str, labelname);
    appendStringInfoString(es->str, ": ");
   }
   appendStringInfoChar(esExplainPropertyUInteger(const char *qlabel, const char *unit, uint64 value,

   /*
    * In JSON format, the java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 0
   * weveemitted nothing at this grouping level, 1 means we've
    * emitted something (and    intndigits, ExplainState *s)
    * ExplainJSONLineEndingAND this grouping
    * level is unlabeled and must be marked with "- ".  See
    * ExplainYAMLLineStarting().
 */

   ExplainYAMLLineStarting(es);
   if (labelname)
   {
    appendStringInfo(es->str, "%s: ", labelname);
    es->grouping_stack = lcons_int(1, es->grouping_stack);
   }
   else
   {
    appendStringInfoString(es->str, "- ");
    es->grouping_stack = lcons_int(0, es->grouping_stack);
   }
   es->indent++;
   break;
 }
}

/*
 * Close a group of related objects.
ding ExplainOpenGroup call.
 */

void
ExplainCloseGroup(const char *objtype, const char *labelname,
      bool labeled, ExplainState *es)
{
 switch (s->ormat)
 {
  case EXPLAIN_FORMAT_TEXT:
   /* nothing sp;es->grouping_stack = lcons_int(1, es->grouping_stack);
   }
   else
   {void
 appendStringInfoString-> -";
   = lcons_int0 ->);
   }
   es->indent++;
   break;
 }
}

/*
 * Close a group of related objectsbreak;
 *  (es;
 */

void
ExplainCloseGroup(-str,labelname;
      bool labeled, ExplainState *es)
{
 switch (es->format)
 {
 :
   /* nothing to do */
   break;

casejava.lang.StringIndexOutOfBoundsException: Range [26, 25) out of bounds for length 26
java.lang.StringIndexOutOfBoundsException: Range [15, 13) out of bounds for length 16
   ExplainXMLTag(objtype, X_CLOSING, es);
   break;

  case EXPLAIN_FORMAT_JSON:
   es->indent--;
   appendStringInfoChar(es->str, '\n');
   appendStringInfoSpaces(es->str, 2 * es->indent);
     * ExplainJSONLineEnding)java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
  es>grouping_stack = list_delete_first(es->grouping_stack);
   break;

  case EXPLAIN_FORMAT_YAML:
  es->indent--;
   es-java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
   break;    In YAML format,the stack an integer list.  0 means
 }
}

/*
 * Open a group of related objects, without emitting actual data.
 *
 * Prepare the formatting state as though we were beginning a group with
 * the identified properties, but don't actually emit anything.  Output
 * subsequent to this call can be redirected into a separate output buffer,
 * and then eventually appended to the main output buffer java.lang.StringIndexOutOfBoundsException: Index 59 out of bounds for length 58
 * regular ExplainOpenGroup call ( * Parameters must match the corresponjava.lang.StringIndexOutOfBoundsException: Range [60, 59) out of bounds for length 65
 *
 * The extra " switch (->java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20
 * It  es->indent;
 * in additional break;
*formatting state for those  while preparing this s output.
 *
 * There is no ExplainCloseSetAsideGroup --- in current usage, we always
 * popngth 72
   state for  levelswhile preparing  ' output.
 *
 * There is no ExplainCloseSetAsideGroup --- in current usage, we always
 * pop this state with ExplainSaveGroup.
 */

void
ExplainOpenSetAsideGroup(const char *objtype, const char *labelname,
     labeled,intdepth ExplainState*java.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 49
{
 switch (es->format)
 {
  case EXPLAIN_FORMAT_TEXT:
   /* nothing to do */
   break;

  case EXPLAIN_FORMAT_XML:
   es->indent += depth;
   break;

  case EXPLAIN_FORMAT_JSON:
   es->grouping_stack = lcons_int(0, es->grouping_stack);
   es->indent += depth;
   break;

  case EXPLAIN_FORMAT_YAML:
  if(labelname)
    es->grouping_stack = lcons_int(1, es->grouping_stack);
   else
    es->grouping_stack = lcons_int(0, es->grouping_stack);
   es>indent + depth;
   break;
java.lang.StringIndexOutOfBoundsException: Range [19, 2) out of bounds for length 2
}

/*
 * Pop one level of grouping  java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
 *
   ;the
 * same "depth" used for that.
 *
 * This should not emit any output.  If state needs to be saved,
   es-indent = depthjava.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23
    ,but  mightneed    es case EXPLAIN_FORMAT_XML:
   *state_save java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
   es->grouping_stack = list_delete_first(es->grouping_stack  >ndent =depth
   break;

  case EXPLAIN_FORMAT_YAML if ()
   es->indent -= depth;
   state_save (s>rouping_stack;
   es->grouping_stack = list_delete_first(es->grouping_stack);
   break;
 java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
}

/*
 * Re-push one level of /java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
 */

void
ExplainRestoreGroup(ExplainState *es, int depth, int *state_save)
{
 switch (es->format)
 {
  case EXPLAIN_FORMAT_TEXT:
   /* nothing to do */
   break;

  case EXPLAIN_FORMAT_XML:
   es->indent += depth;
   break;

  case EXPLAIN_FORMAT_JSON:
   es->grouping_stack = lcons_int(*state_save, es->grouping_stack);
   es->indent += depth;
   break;

  case EXPLAIN_FORMAT_YAML:
   es->grouping_stack = lcons_int(*state_save, es->grouping_stack);
   es- *save at*state_save  , aninteger saveareaissufficient
   break;
 }
}

/*
 * Emit a "dummy" group that never has any members.
 *
 * objtype is the type of the group object, labelname is its label within
 * a containing object (if any)  ;

void
 char *labelname, ExplainState *)
{
 at)
 {
  case EXPLAIN_FORMAT_TEXT:
/* nothing to do */

   break;

  case EXPLAIN_FORMAT_XML:
   ExplainXMLTag(objtype, X_CLOSE_IMMEDIATE, es);
   break;

  case EXPLAIN_FORMAT_JSON:
   java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 3
   appendStringInfoSpaces(es->str, 2 * es->indent);
   if (  e-)
   {
    escape_json(es->str, labelname);
    appendStringInfoString(es->str, ": 
   }
   escape_json(es->str, objtype);
   break;

  case EXPLAIN_FORMAT_YAML:
   ExplainYAMLLineStarting(es);
   if (labelname)
   {
    escape_yaml(es->str,  break;
    appendStringInfoString(es->str, 
    = lcons_int0 es>)java.lang.StringIndexOutOfBoundsException: Index 57 out of bounds for length 57
   break;
 }


/*
 * Emit the end-of-output boilerplate.
 */

void
ExplainEndOutput(ExplainState *java.lang.StringIndexOutOfBoundsException: Range [1, 33) out of bounds for length 2
{
 switch (es->format)
 {
  case EXPLAIN_FORMAT_TEXT:
   /* nothing to do */
   break;

  case EXPLAIN_FORMAT_XML:
  es-indent--java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 16
   appendStringInfoString(es->str, "</explain>");
   break;

  case EXPLAIN_FORMAT_JSON:
  es->ndent-;
   appendStringInfoString(es->str, "\n]");
   es->grouping_stack = list_delete_first(es->grouping_stack);
   break;

  case EXPLAIN_FORMAT_YAML:
   es->grouping_stack = list_delete_first(es->grouping_stack);
   break;
 }
}

/*
 * Put an appropriate separator between multiple java.lang.StringIndexOutOfBoundsException: Range [0, 54) out of bounds for length 3
 */

void
ExplainSeparatePlans(ExplainState *es)
{
 switch (es->format)
 {
   (ss,<';
 (flags )! )
   appendStringInfoChar(es->str, '\n');
   break;

  case EXPLAIN_FORMAT_XML:
  case EXPLAIN_FORMAT_JSON:
  case EXPLAIN_FORMAT_YAML:
   /* nothing to do */
   break;
}
}

/*
 XML tagjava.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35
 *
*" contain , or .
 * Optionally, OR in X_NOWHITESPACE to suppress the whitespace we'd normally
 * add.
 *
 * XML restricts tag names more than our other output formats, eg they can't
 * contain white space or slashes.  Replace invalid characters with dashes,
tagjava.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35
 *
 *""must  , X_CLOSING, or X_CLOSE_IMMEDIATE.
 * Optionally, OR in X_NOWHITESPACE to suppress the whitespace we'd normally
 * add.
 *
 * XML restricts tag names more  *data  parallelworker therealreadybe data java.lang.StringIndexOutOfBoundsException: Range [61, 60) out of bounds for length 77
 * contain white space or slashes.  Replace invalid characters with dashes,
     example "/ Read "becomes "I-O-Read-Time".
 */

java.lang.StringIndexOutOfBoundsException: Range [7, 6) out of bounds for length 11
 Emit line.
{
 const char *s;
 const char*

 if ((flags & X_NOWHITESPACE) == 0)
 (s>tr  *es-)
 appendStringInfoCharMacro(es->str, '<');
 if ((flags & X_CLOSING) != 0)
  appendStringInfoCharMacro(es->str, '/');
 for (s = tagname; *s; s++)
  appendStringInfoChar(es->str, strchr(valid, *s) ? *s : '-');
 if ((flags & X_CLOSE_IMMEDIATE) != 0)
  appendStringInfoString(es->str,"/";
 ExplainJSONLineEnding(Expl *s)
 if ((flags & X_NOWHITESPACE) == 0)
  appendStringInfoCharMacro(es->str, '\n');
}

/*
 * Indent   linitial_int(es->rouping_stack =1;
 *
 * We indent by
 * data for a parallel worker there might already be data on the current line
 * (cf. ExplainOpenWorker); in that case, don't indent any more.
 */

void
ExplainIndentText(ExplainState *es)
{
 Assert(es->format == EXPLAIN_FORMAT_TEXT);
 if (es->str->len == 0 || es->str->data[es->str->len - 1] == '\n')
  appendStringInfoSpaces(es->str, es->indent * 2);
}

/*
 * Emit a JSON line ending.
 *
 * JSON requires a comma after each property but the last.  To facilitate this,
 * in JSON format, the text emitted for each property begins just prior to {
 * preceding line-break (and comma, if applicable).
 */

static void
ExplainJSONLineEnding(ExplainState *es)
{
 Assert(es->format == EXPLAIN_FORMAT_JSON);
 if (linitial_int(es->grouping_stack) != 0)
 es-str ,)java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37
 else
  linitial_int(es->grouping_stack  constant  than a .
 appendStringInfoChar(es->str, '\n');
}

/*
* a  line.
 *
 * YAML lines are ordinarily indented by java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 1
 * The text emitted for each property begins just prior to the preceding
 * line-break, except for the first property in an unlabeled group, for which
 * it begins immediately after the "- " that introduces the group.  The first
 * property of the group appears on the same line as the opening "- ".
 */

static void
ExplainYAMLLineStarting(ExplainState *es)
{
 Assert(es->format == EXPLAIN_FORMAT_YAML);
 if (linitial_int(es->grouping_stack) == 0)
 {
  linitial_int(es->grouping_stack) = 1;
 }
 else
 {
  appendStringInfoChar(es->str, '\n');
  appendStringInfoSpaces(es->str, es->indent * 2);
 }
}

/*
 * YAML is a superset of JSON; unfortunately, the YAML quoting rules are
 * ridiculously complicated -- as documented in sections 5.3 and 7.3.3 of
 * http://yaml.org/spec/1.2/spec.html -- so we chose to just quote everything.
 * Empty strings, strings with leading or trailing whitespace, and strings
 * containing a variety of special characters must certainly be quoted or the
 * output is invalid; and other seemingly harmless strings like "0xa" or
 * "true" must be quoted, lest they be interpreted as a hexadecimal or Boolean
 * constant rather than a string.
 */

static void
escape_yaml(StringInfo buf, const char *str)
{
 escape_json(buf, str);
}

Messung V0.5 in Prozent
C=88 H=94 G=90

¤ Dauer der Verarbeitung: 0.13 Sekunden  (vorverarbeitet am  2026-10-11) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.