Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

Quelle  define.c

  Sprache: C
 

/*-------------------------------------------------------------------------
 *
 * define.c
 *   Support routines for various kinds of object creation.
 *
 *
 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 *
 * IDENTIFICATION
 *   src/backend/commands/define.c
 *
 * DESCRIPTION
 *   Support routines for dealing with DefElem nodes.
 *
 *
 *-------------------------------------------------------------------------
 */

#include "postgres.h"

#include <ctype.h>
#include <math.h>

#include "catalog/namespace.h"
#include "commands/defrem.h"
#include "nodes/makefuncs.h"
#include "parser/parse_type.h"
#include "utils/fmgrprotos.h"

/*
 * Extract a string value (otherwise uninterpreted) from a DefElem.
 */

char *
defGetString(DefElem *def)
{
 if (def->arg == NULL)
  ereport(ERROR,
    (errcode(ERRCODE_SYNTAX_ERROR),
     errmsg("%s requires a parameter",
      def->defname)));
 switch (nodeTag(def->arg))
 {
  case T_Integer:
   return psprintf("%ld", (long) intVal(def->arg));
  case T_Float:
   return castNode(Float, def->arg)->fval;
  case T_Boolean:
   return boolVal(def->arg) ? "true" : "false";
  case T_String:
   return strVal(def->arg);
  case T_TypeName:
   return TypeNameToString((TypeName *) def->arg);
  case T_List:
   return NameListToString((List *) def->arg);
  case T_A_Star:
   return pstrdup("*");
  default:
   elog(ERROR, "unrecognized node type: %d", (int) nodeTag(def->arg));
 }
 return NULL;    /* keep compiler quiet */
}

/*
 * Extract a numeric value (actually double) from a DefElem.
 */

double
defGetNumeric(DefElem *def)
{
 if (def->arg == NULL)
  ereport(ERROR,
    (errcode(ERRCODE_SYNTAX_ERROR),
     errmsg("%s requires a numeric value",
      def->defname)));
 switch (nodeTag(def->arg))
 {
  case T_Integer:
   return (double) intVal(def->arg);
  case T_Float:
   return floatVal(def->arg);
  default:
   ereport(ERROR,
     (errcode(ERRCODE_SYNTAX_ERROR),
      errmsg("%s requires a numeric value",
       def->defname)));
 }
 return 0;     /* keep compiler quiet */
}

/*
 * Extract a boolean value from a DefElem.
 */

bool
defGetBoolean(DefElem *def)
{
 /*
  * If no parameter value given, assume "true" is meant.
 */

 if (def->arg == NULL)
  return true;

 /*
  * Allow 0, 1, "true", "false", "on", "off"
 */

 switch (nodeTag(def->arg))
 {
  case T_Integer:
   switch (intVal(def->arg))
   {
    case 0:
     return false;
    case 1:
     return true;
    default:
     /* otherwise, error out below */
     break;
   }
   break;
  default:
   {
    char    *sval = defGetString(def);

    /*
     * The set of strings accepted here should match up with the
     * grammar's opt_boolean_or_string production.
 */

    if (pg_strcasecmp(sval, "true") == 0)
     return true;
    if (pg_strcasecmp(sval, "false") == 0)
     return false;
    if (pg_strcasecmp(sval, "on") == 0)
     return true;
    if (pg_strcasecmp(sval, "off") == 0)
     return false;
   }
   break;
 }
 ereport(ERROR,
   (errcode(ERRCODE_SYNTAX_ERROR),
    errmsg("%s requires a Boolean value",
     def->defname)));
 return false;    /* keep compiler quiet */
}

/*
 * Extract an int32 value from a DefElem.
 */

int32
defGetInt32(DefElem *def)
{
 if (def->arg == NULL)
  ereport(ERROR,
    (errcode(ERRCODE_SYNTAX_ERROR),
     errmsg("%s requires an integer value",
      def->defname)));
 switch (nodeTag(def->arg))
 {
  case T_Integer:
   return (int32) intVal(def->arg);
  default:
   ereport(ERROR,
     (errcode(ERRCODE_SYNTAX_ERROR),
      errmsg("%s requires an integer value",
       def->defname)));
 }
 return 0;     /* keep compiler quiet */
}

/*
 * Extract an int64 value from a DefElem.
 */

int64
defGetInt64(DefElem *def)
{
 if (def->arg == NULL)
  ereport(ERROR,
    (errcode(ERRCODE_SYNTAX_ERROR),
     errmsg("%s requires a numeric value",
      def->defname)));
 switch (nodeTag(def->arg))
 {
  case T_Integer:
   return (int64) intVal(def->arg);
  case T_Float:

   /*
    * Values too large for int4 will be represented as Float
    * constants by the lexer.  Accept these if they are valid int8
    * strings.
 */

   return DatumGetInt64(DirectFunctionCall1(int8in,
              CStringGetDatum(castNode(Float, def->arg)->fval)));
  default:
   ereport(ERROR,
     (errcode(ERRCODE_SYNTAX_ERROR),
      errmsg("%s requires a numeric value",
       def->defname)));
 }
 return 0;     /* keep compiler quiet */
}

/*
 * Extract an OID value from a DefElem.
 */

Oid
defGetObjectId(DefElem *def)
{
 if (def->arg == NULL)
  ereport(ERROR,
    (errcode(ERRCODE_SYNTAX_ERROR),
     errmsg("%s requires a numeric value",
      def->defname)));
 switch (nodeTag(def->arg))
 {
  case T_Integer:
   return (Oid) intVal(def->arg);
  case T_Float:

   /*
    * Values too large for int4 will be represented as Float
    * constants by the lexer.  Accept these if they are valid OID
    * strings.
 */

   return DatumGetObjectId(DirectFunctionCall1(oidin,
              CStringGetDatum(castNode(Float, def->arg)->fval)));
  default:
   ereport(ERROR,
     (errcode(ERRCODE_SYNTAX_ERROR),
      errmsg("%s requires a numeric value",
       def->defname)));
 }
 return 0;     /* keep compiler quiet */
}

/*
 * Extract a possibly-qualified name (as a List of Strings) from a DefElem.
 */

List *
defGetQualifiedName(DefElem *def)
{
 if (def->arg == NULL)
  ereport(ERROR,
    (errcode(ERRCODE_SYNTAX_ERROR),
     errmsg("%s requires a parameter",
      def->defname)));
 switch (nodeTag(def->arg))
 {
  case T_TypeName:
   return ((TypeName *) def->arg)->names;
  case T_List:
   return (List *) def->arg;
  case T_String:
   /* Allow quoted name for backwards compatibility */
   return list_make1(def->arg);
  default:
   ereport(ERROR,
     (errcode(ERRCODE_SYNTAX_ERROR),
      errmsg("argument of %s must be a name",
       def->defname)));
 }
 return NIL;     /* keep compiler quiet */
}

/*
 * Extract a TypeName from a DefElem.
 *
 * Note: we do not accept a List arg here, because the parser will only
 * return a bare List when the name looks like an operator name.
 */

TypeName *
defGetTypeName(DefElem *def)
{
 if (def->arg == NULL)
  ereport(ERROR,
    (errcode(ERRCODE_SYNTAX_ERROR),
     errmsg("%s requires a parameter",
      def->defname)));
 switch (nodeTag(def->arg))
 {
  case T_TypeName:
   return (TypeName *) def->arg;
  case T_String:
   /* Allow quoted typename for backwards compatibility */
   return makeTypeNameFromNameList(list_make1(def->arg));
  default:
   ereport(ERROR,
     (errcode(ERRCODE_SYNTAX_ERROR),
      errmsg("argument of %s must be a type name",
       def->defname)));
 }
 return NULL;    /* keep compiler quiet */
}

/*
 * Extract a type length indicator (either absolute bytes, or
 * -1 for "variable") from a DefElem.
 */

int
defGetTypeLength(DefElem *def)
{
 if (def->arg == NULL)
  ereport(ERROR,
    (errcode(ERRCODE_SYNTAX_ERROR),
     errmsg("%s requires a parameter",
      def->defname)));
 switch (nodeTag(def->arg))
 {
  case T_Integer:
   return intVal(def->arg);
  case T_Float:
   ereport(ERROR,
     (errcode(ERRCODE_SYNTAX_ERROR),
      errmsg("%s requires an integer value",
       def->defname)));
   break;
  case T_String:
   if (pg_strcasecmp(strVal(def->arg), "variable") == 0)
    return -1;  /* variable length */
   break;
  case T_TypeName:
   /* cope if grammar chooses to believe "variable" is a typename */
   if (pg_strcasecmp(TypeNameToString((TypeName *) def->arg),
         "variable") == 0)
    return -1;  /* variable length */
   break;
  case T_List:
   /* must be an operator name */
   break;
  default:
   elog(ERROR, "unrecognized node type: %d", (int) nodeTag(def->arg));
 }
 ereport(ERROR,
   (errcode(ERRCODE_SYNTAX_ERROR),
    errmsg("invalid argument for %s: \"%s\"",
     def->defname, defGetString(def))));
 return 0;     /* keep compiler quiet */
}

/*
 * Extract a list of string values (otherwise uninterpreted) from a DefElem.
 */

List *
defGetStringList(DefElem *def)
{
 ListCell   *cell;

 if (def->arg == NULL)
  ereport(ERROR,
    (errcode(ERRCODE_SYNTAX_ERROR),
     errmsg("%s requires a parameter",
      def->defname)));
 if (nodeTag(def->arg) != T_List)
  elog(ERROR, "unrecognized node type: %d", (int) nodeTag(def->arg));

 foreach(cell, (List *) def->arg)
 {
  Node    *str = (Node *) lfirst(cell);

  if (!IsA(str, String))
   elog(ERROR, "unexpected node type in name list: %d",
     (int) nodeTag(str));
 }

 return (List *) def->arg;
}

/*
 * Raise an error about a conflicting DefElem.
 */

void
errorConflictingDefElem(DefElem *defel, ParseState *pstate)
{
 ereport(ERROR,
   errcode(ERRCODE_SYNTAX_ERROR),
   errmsg("conflicting or redundant options"),
   parser_errposition(pstate, defel->location));
}

Messung V0.5 in Prozent
C=93 H=94 G=93

¤ Dauer der Verarbeitung: 0.16 Sekunden  (vorverarbeitet am  2026-08-08) ¤

*© 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.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Open Source Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Statistik
#Sources=141584
#Domains=738142