/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to you under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.calcite.util;

import org.checkerframework.checker.nullness.qual.Nullable;

/**
 * A collection of terms.
 *
 * <p>(This is not a real class. It is here so that terms which do not map to
 * classes can be referenced in Javadoc.)
 */
public interface Glossary {
  //~ Static fields/initializers ---------------------------------------------

  // CHECKSTYLE: OFF
  /**
   * This table shows how and where the Gang of Four patterns are applied.
   * The table uses information from the GoF book and from a course on
   * advanced object design taught by Craig Larman.
   *
   * <p>The patterns are in three groups depicting frequency of use. The
   * patterns in light green are used
   * <i>frequently</i>. Those in yellow have
   * <i>moderate</i> use. Patterns in red are
   * <i>infrequently</i> used. The GoF column gives the original Gang Of Four
   * category for the pattern. The Problem and Pattern columns are from
   * Craig's refinement of the type of problems they apply to and a refinement
   * of the original three pattern categories.
   *
   * <table style="border-spacing:0px;padding:3px;border:1px">
   * <caption>
   *   <a href="http://www.onr.com/user/loeffler/java/references.html#gof">
   *   <b>Gang of Four Patterns</b></a>
   * </caption>
   * <tr>
   * <!-- Headers for each column -->
   *
   * <th>Pattern Name</th>
   * <th style="text-align:middle"><a href="#category">GOF Category</a></th>
   * <th style="text-align:middle">Problem</th>
   * <th style="text-align:middle">Pattern</th>
   * <th style="text-align:middle">Often Uses</th>
   * <th style="text-align:middle">Related To</th>
   * </tr>
   *
   * <!-- Frequently used patterns have a lime background -->
   * <tr>
   * <td style="background-color:lime"><a href="#AbstractFactoryPattern">Abstract Factory</a>
   * </td>
   * <td style="background-color:teal;color:white">Creational</td>
   * <td>Creating Instances</td>
   * <td>Class/Interface Definition plus Inheritance</td>
   * <td><a href="#FactoryMethodPattern">Factory Method</a><br>
   * <a href="#PrototypePattern">Prototype</a><br>
   * <a href="#SingletonPattern">Singleton</a> with <a href="#FacadePattern">
   * Facade</a></td>
   * <td><a href="#FactoryMethodPattern">Factory Method</a><br>
   * <a href="#PrototypePattern">Prototype</a><br>
   * <a href="#SingletonPattern">Singleton</a></td>
   * </tr>
   *
   * <tr>
   * <td style="background-color:lime"><a href="#ObjectAdapterPattern">Object Adapter</a>
   * </td>
   * <td style="background-color:silver">Structural</td>
   * <td>Interface</td>
   * <td>Wrap One</td>
   * <td style="text-align:middle">-</td>
   * <td><a href="#BridgePattern">Bridge</a><br>
   * <a href="#DecoratorPattern">Decorator</a><br>
   * <a href="#ProxyPattern">Proxy</a></td>
   * </tr>
   * <tr>
   * <td style="background-color:lime"><a href="#CommandPattern">Command</a></td>
   * <td style="background-color:maroon;color:white">Behavioral</td>
   * <td>Organization or Communication of Work<br>
   * Action/Response</td>
   * <td>Behavior Objects</td>
   * <td><a href="#CompositePattern">Composite</a></td>
   * <td><a href="#CompositePattern">Composite</a><br>
   * <a href="#MementoPattern">Memento</a><br>
   * <a href="#PrototypePattern">Prototype</a></td>
   * </tr>
   * <tr>
   * <td style="background-color:lime"><a href="#CompositePattern">Composite</a></td>
   * <td style="background-color:silver">Structural</td>
   * <td>Structural Decomposition of Objects or Subsystems</td>
   * <td>Wrap Many</td>
   * <td style="text-align:middle">-</td>
   * <td><a href="#DecoratorPattern">Decorator</a><br>
   * <a href="#IteratorPattern">Iterator</a><br>
   * <a href="#VisitorPattern">Visitor</a></td>
   * </tr>
   * <tr>
   * <td style="background-color:lime"><a href="#DecoratorPattern">Decorator</a></td>
   * <td style="background-color:silver">Structural</td>
   * <td>Instance Behavior</td>
   * <td>Wrap One</td>
   * <td style="text-align:middle">-</td>
   * <td><a href="#ObjectAdapterPattern">Object Adapter</a><br>
   * <a href="#CompositePattern">Composite</a><br>
   * <a href="#StrategyPattern">Strategy</a></td>
   * </tr>
   * <tr>
   * <td style="background-color:lime"><a href="#FacadePattern">Facade</a></td>
   * <td style="background-color:silver">Structural</td>
   * <td>Access Control<br>
   * &nbsp;
   * <hr>
   *
   * <p>Structural Decomposition of Objects or Subsystems</td>
   * <td>Wrap Many</td>
   * <td><a href="#SingletonPattern">Singleton</a> with <a
   * href="#AbstractFactoryPattern">Abstract Factory</a></td>
   * <td><a href="#AbstractFactoryPattern">Abstract Factory</a><br>
   * <a href="#MediatorPattern">Mediator</a></td>
   * </tr>
   * <tr>
   * <td style="background-color:lime"><a href="#FlyweightPattern">Flyweight</a></td>
   * <td style="background-color:silver">Structural</td>
   * <td>Shared Resource Handling</td>
   * <td>Object State or Values</td>
   * <td style="text-align:middle">-</td>
   * <td><a href="#SingletonPattern">Singleton</a><br>
   * <a href="#StatePattern">State</a><br>
   * <a href="#StrategyPattern">Strategy</a><br>
   * Shareable</td>
   * </tr>
   * <tr>
   * <td style="background-color:lime"><a href="#IteratorPattern">Iterator</a></td>
   * <td style="background-color:maroon;color:white">Behavioral</td>
   * <td>Traversal Algorithm<br>
   * &nbsp;
   * <hr>
   *
   * <p>Access Control</td>
   * <td>Low Coupling</td>
   * <td style="text-align:middle">-</td>
   * <td><a href="#CompositePattern">Composite</a><br>
   * <a href="#FactoryMethodPattern">Factory Method</a><br>
   * <a href="#MementoPattern">Memento</a></td>
   * </tr>
   * <tr>
   * <td style="background-color:lime"><a href="#ObserverPattern">Observer</a></td>
   * <td style="background-color:maroon;color:white">Behavioral</td>
   * <td>Event Response<br>
   * &nbsp;
   * <hr>
   *
   * <p>Organization or Communication of Work</td>
   * <td>Low Coupling</td>
   * <td style="text-align:middle">-</td>
   * <td><a href="#MediatorPattern">Mediator</a><br>
   * <a href="#SingletonPattern">Singleton</a></td>
   * </tr>
   * <tr>
   * <td style="background-color:lime"><a href="#ProxyPattern">Proxy</a></td>
   * <td style="background-color:silver">Structural</td>
   * <td>Access Control</td>
   * <td>Wrap One</td>
   * <td style="text-align:middle">-</td>
   * <td><a href="#ObjectAdapterPattern">Adapter</a><br>
   * <a href="#DecoratorPattern">Decorator</a></td>
   * </tr>
   * <tr>
   * <td style="background-color:lime"><a href="#SingletonPattern">Singleton</a></td>
   * <td style="background-color:teal;color:white">Creational</td>
   * <td>Access Control</td>
   * <td>Other</td>
   * <td style="text-align:middle">-</td>
   * <td><a href="#AbstractFactoryPattern">Abstract Factory</a><br>
   * <a href="#BuilderPattern">Builder</a><br>
   * <a href="#PrototypePattern">Prototype</a></td>
   * </tr>
   * <tr>
   * <td style="background-color:lime"><a href="#StatePattern">State</a></td>
   * <td style="background-color:maroon;color:white">Behavioral</td>
   * <td>Instance Behavior</td>
   * <td>Object State or Values</td>
   * <td><a href="#FlyweightPattern">Flyweight</a></td>
   * <td><a href="#FlyweightPattern">Flyweight</a><br>
   * <a href="#SingletonPattern">Singleton</a></td>
   * </tr>
   * <tr>
   * <td style="background-color:lime"><a href="#StrategyPattern">Strategy</a></td>
   * <td style="background-color:maroon;color:white">Behavioral</td>
   * <td>Single Algorithm</td>
   * <td>Behavior Objects</td>
   * <td style="text-align:middle">-</td>
   * <td><a href="#FlyweightPattern">Flyweight</a><br>
   * <a href="#StatePattern">State</a><br>
   * <a href="#TemplateMethodPattern">Template Method</a></td>
   * </tr>
   * <tr>
   * <td style="background-color:lime"><a href="#TemplateMethodPattern">Template Method</a>
   * </td>
   * <td style="background-color:maroon;color:white">Behavioral</td>
   * <td>Single Algorithm</td>
   * <td>Class or Interface Definition plus Inheritance</td>
   * <td style="text-align:middle">-</td>
   * <td><a href="#StrategyPattern">Strategy</a></td>
   * </tr>
   * <!-- Moderately use patterns have a yellow background -->
   * <tr>
   * <td style="background-color:yellow"><a href="#ClassAdapterPattern">Class Adapter</a>
   * </td>
   * <td style="background-color:silver">Structural</td>
   * <td>Interface</td>
   * <td>Class or Interface Definition plus Inheritance</td>
   * <td style="text-align:middle">-</td>
   * <td><a href="#BridgePattern">Bridge</a><br>
   * <a href="#DecoratorPattern">Decorator</a><br>
   * <a href="#ProxyPattern">Proxy</a></td>
   * </tr>
   * <tr>
   * <td style="background-color:yellow"><a href="#BridgePattern">Bridge</a></td>
   * <td style="background-color:silver">Structural</td>
   * <td>Implementation</td>
   * <td>Wrap One</td>
   * <td style="text-align:middle">-</td>
   * <td><a href="#AbstractFactoryPattern">Abstract Factory</a><br>
   * <a href="#ClassAdapterPattern">Class Adaptor</a></td>
   * </tr>
   * <tr>
   * <td style="background-color:yellow"><a href="#BuilderPattern">Builder</a></td>
   * <td style="background-color:teal;color:white">Creational</td>
   * <td>Creating Structures</td>
   * <td>Class or Interface Definition plus Inheritance</td>
   * <td style="text-align:middle">-</td>
   * <td><a href="#AbstractFactoryPattern">Abstract Factory</a><br>
   * <a href="#CompositePattern">Composite</a></td>
   * </tr>
   * <tr>
   * <td style="background-color:yellow"><a href="#ChainOfResponsibilityPattern">Chain of
   * Responsibility</a></td>
   * <td style="background-color:maroon;color:white">Behavioral</td>
   * <td>Single Algorithm<br>
   * &nbsp;
   * <hr>
   *
   * <p>Organization or Communication of Work</td>
   * <td>Low Coupling</td>
   * <td style="text-align:middle">-</td>
   * <td><a href="#CompositePattern">Composite</a></td>
   * </tr>
   * <tr>
   * <td style="background-color:yellow"><a href="#FactoryMethodPattern">Factory Method</a>
   * </td>
   * <td style="background-color:teal;color:white">Creational</td>
   * <td>Creating Instances</td>
   * <td>Class or Interface Definition plus Inheritance</td>
   * <td><a href="#TemplateMethodPattern">Template Method</a></td>
   * <td><a href="#AbstractFactoryPattern">Abstract Factory</a><br>
   * <a href="#TemplateMethodPattern">Template Method</a><br>
   * <a href="#PrototypePattern">Prototype</a></td>
   * </tr>
   * <tr>
   * <td style="background-color:yellow"><a href="#MediatorPattern">Mediator</a></td>
   * <td style="background-color:maroon;color:white">Behavioral</td>
   * <td>Interaction between Objects<br>
   * &nbsp;
   * <hr>
   *
   * <p>Organization or Communication of Work</td>
   * <td>Low Coupling</td>
   * <td style="text-align:middle">-</td>
   * <td><a href="#FacadePattern">Facade</a><br>
   * <a href="#ObserverPattern">Observer</a></td>
   * </tr>
   * <tr>
   * <td style="background-color:yellow"><a href="#PrototypePattern">Prototype</a></td>
   * <td style="background-color:teal;color:white">Creational</td>
   * <td>Creating Instances</td>
   * <td>Other</td>
   * <td style="text-align:middle">-</td>
   * <td><a href="#PrototypePattern">Prototype</a><br>
   * <a href="#CompositePattern">Composite</a><br>
   * <a href="#DecoratorPattern">Decorator</a></td>
   * </tr>
   * <tr>
   * <td style="background-color:yellow"><a href="#VisitorPattern">Visitor</a></td>
   * <td style="background-color:maroon;color:white">Behavioral</td>
   * <td>Single Algorithm</td>
   * <td>Behavior Objects</td>
   * <td style="text-align:middle">-</td>
   * <td><a href="#CompositePattern">Composite</a><br>
   * <a href="#VisitorPattern">Visitor</a></td>
   * </tr>
   * <!-- Seldom used patterns have a red background -->
   * <tr>
   * <td style="background-color:red;color:white"><a href="#InterpreterPattern">
   * Interpreter</a></td>
   * <td style="background-color:maroon;color:white">Behavioral</td>
   * <td>Organization or Communication of Work</td>
   * <td>Other</td>
   * <td style="text-align:middle">-</td>
   * <td><a href="#CompositePattern">Composite</a><br>
   * <a href="#FlyweightPattern">Flyweight</a><br>
   * <a href="#IteratorPattern">Iterator</a><br>
   * <a href="#VisitorPattern">Visitor</a></td>
   * </tr>
   * <tr>
   * <td style="background-color:red;color:white"><a href="#MementoPattern">
   * Memento</a></td>
   * <td style="background-color:maroon;color:white">Behavioral</td>
   * <td>Instance Management</td>
   * <td>Object State or Values</td>
   * <td style="text-align:middle">-</td>
   * <td><a href="#CommandPattern">Command</a><br>
   * <a href="#IteratorPattern">Iterator</a></td>
   * </tr>
   * </table>
   */
  // CHECKSTYLE: ON
  @Nullable Glossary PATTERN = null;

  /**
   * Provide an interface for creating families of related or dependent
   * objects without specifying their concrete classes. (See <a
   * href="http://c2.com/cgi/wiki?AbstractFactoryPattern">GoF</a>.)
   */
  @Nullable Glossary ABSTRACT_FACTORY_PATTERN = null;

  /**
   * Separate the construction of a complex object from its representation so
   * that the same construction process can create different representations.
   * (See <a href="http://c2.com/cgi/wiki?BuilderPattern">GoF</a>.)
   */
  @Nullable Glossary BUILDER_PATTERN = null;

  /**
   * Define an interface for creating an object, but let subclasses decide
   * which class to instantiate. Lets a class defer instantiation to
   * subclasses. (See <a href="http://c2.com/cgi/wiki?FactoryMethodPattern">
   * GoF</a>.)
   */
  @Nullable Glossary FACTORY_METHOD_PATTERN = null;

  /**
   * Specify the kinds of objects to create using a prototypical instance, and
   * create new objects by copying this prototype. (See <a
   * href="http://c2.com/cgi/wiki?PrototypePattern">GoF</a>.)
   */
  @Nullable Glossary PROTOTYPE_PATTERN = null;

  /**
   * Ensure a class only has one instance, and provide a global point of
   * access to it. (See <a href="http://c2.com/cgi/wiki?SingletonPattern">
   * GoF</a>.)
   *
   * <p>Note that a common way of implementing a singleton, the so-called <a
   * href="http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html">
   * double-checked locking pattern</a>, is fatally flawed in Java. Don't use
   * it!
   */
  @Nullable Glossary SINGLETON_PATTERN = null;

  /**
   * Convert the interface of a class into another interface clients expect.
   * Lets classes work together that couldn't otherwise because of
   * incompatible interfaces. (See <a
   * href="http://c2.com/cgi/wiki?AdapterPattern">GoF</a>.)
   */
  @Nullable Glossary ADAPTER_PATTERN = null;

  /**
   * Decouple an abstraction from its implementation so that the two can very
   * independently. (See <a href="http://c2.com/cgi/wiki?BridgePattern">
   * GoF</a>.)
   */
  @Nullable Glossary BRIDGE_PATTERN = null;

  /**
   * Compose objects into tree structures to represent part-whole hierarchies.
   * Lets clients treat individual objects and compositions of objects
   * uniformly. (See <a href="http://c2.com/cgi/wiki?CompositePattern">
   * GoF</a>.)
   */
  @Nullable Glossary COMPOSITE_PATTERN = null;

  /**
   * Attach additional responsibilities to an object dynamically. Provides a
   * flexible alternative to subclassing for extending functionality. (See <a
   * href="http://c2.com/cgi/wiki?DecoratorPattern">GoF</a>.)
   */
  @Nullable Glossary DECORATOR_PATTERN = null;

  /**
   * Provide a unified interface to a set of interfaces in a subsystem.
   * Defines a higher-level interface that makes the subsystem easier to use.
   * (See <a href="http://c2.com/cgi/wiki?FacadePattern">GoF</a>.)
   */
  @Nullable Glossary FACADE_PATTERN = null;

  /**
   * Use sharing to support large numbers of fine-grained objects efficiently.
   * (See <a href="http://c2.com/cgi/wiki?FlyweightPattern">GoF</a>.)
   */
  @Nullable Glossary FLYWEIGHT_PATTERN = null;

  /**
   * Provide a surrogate or placeholder for another object to control access
   * to it. (See <a href="http://c2.com/cgi/wiki?ProxyPattern">GoF</a>.)
   */
  @Nullable Glossary PROXY_PATTERN = null;

  /**
   * Avoid coupling the sender of a request to its receiver by giving more
   * than one object a chance to handle the request. Chain the receiving
   * objects and pass the request along the chain until an object handles it.
   * (See <a href="http://c2.com/cgi/wiki?ChainOfResponsibilityPattern">
   * GoF</a>.)
   */
  @Nullable Glossary CHAIN_OF_RESPONSIBILITY_PATTERN = null;

  /**
   * Encapsulate a request as an object, thereby letting you parameterize
   * clients with different requests, queue or log requests, and support
   * undoable operations. (See <a
   * href="http://c2.com/cgi/wiki?CommandPattern">GoF</a>.)
   */
  @Nullable Glossary COMMAND_PATTERN = null;

  /**
   * Given a language, define a representation for its grammar along with an
   * interpreter that uses the representation to interpret sentences in the
   * language. (See <a href="http://c2.com/cgi/wiki?InterpreterPattern">
   * GoF</a>.)
   */
  @Nullable Glossary INTERPRETER_PATTERN = null;

  /**
   * Provide a way to access the elements of an aggregate object sequentially
   * without exposing its underlying representation. (See <a
   * href="http://c2.com/cgi/wiki?IteratorPattern">GoF</a>.)
   */
  @Nullable Glossary ITERATOR_PATTERN = null;

  /**
   * Define an object that encapsulates how a set of objects interact.
   * Promotes loose coupling by keeping objects from referring to each other
   * explicitly, and it lets you vary their interaction independently. (See <a
   * href="http://c2.com/cgi/wiki?MediatorPattern">GoF</a>.)
   */
  @Nullable Glossary MEDIATOR_PATTERN = null;

  /**
   * Without violating encapsulation, capture and externalize an objects's
   * internal state so that the object can be restored to this state later.
   * (See <a href="http://c2.com/cgi/wiki?MementoPattern">GoF</a>.)
   */
  @Nullable Glossary MEMENTO_PATTERN = null;

  /**
   * Define a one-to-many dependency between objects so that when one object
   * changes state, all its dependents are notified and updated automatically.
   * (See <a href="http://c2.com/cgi/wiki?ObserverPattern">GoF</a>.)
   */
  @Nullable Glossary OBSERVER_PATTERN = null;

  /**
   * Allow an object to alter its behavior when its internal state changes.
   * The object will appear to change its class. (See <a
   * href="http://c2.com/cgi/wiki?StatePattern">GoF</a>.)
   */
  @Nullable Glossary STATE_PATTERN = null;

  /**
   * Define a family of algorithms, encapsulate each one, and make them
   * interchangeable. Lets the algorithm vary independently from clients that
   * use it. (See <a href="http://c2.com/cgi/wiki?StrategyPattern">GoF</a>.)
   */
  @Nullable Glossary STRATEGY_PATTERN = null;

  /**
   * Define the skeleton of an algorithm in an operation, deferring some steps
   * to subclasses. Lets subclasses redefine certain steps of an algorithm
   * without changing the algorithm's structure. (See <a
   * href="http://c2.com/cgi/wiki?TemplateMethodPattern">GoF</a>.)
   */
  @Nullable Glossary TEMPLATE_METHOD_PATTERN = null;

  /**
   * Represent an operation to be performed on the elements of an object
   * structure. Lets you define a new operation without changing the classes
   * of the elements on which it operates. (See <a
   * href="http://c2.com/cgi/wiki?VisitorPattern">GoF</a>.)
   */
  @Nullable Glossary VISITOR_PATTERN = null;

  /**
   * The official SQL-92 standard (ISO/IEC 9075:1992). To reference this
   * standard from methods that implement its rules, use the &#64;sql.92
   * custom block tag in Javadoc comments; for the tag body, use the format
   * <code>&lt;SectionId&gt; [ ItemType &lt;ItemId&gt; ]</code>, where
   *
   * <ul>
   * <li><code>SectionId</code> is the numbered or named section in the table
   * of contents, e.g. "Section 4.18.9" or "Annex A"
   * <li><code>ItemType</code> is one of { Table, Syntax Rule, Access Rule,
   * General Rule, or Leveling Rule }
   * <li><code>ItemId</code> is a dotted path expression to the specific item
   * </ul>
   *
   * <p>For example,
   *
   * <blockquote><pre><code>&#64;sql.92 Section 11.4 Syntax Rule 7.c
   * </code></pre></blockquote>
   *
   * <p>is a well-formed reference to the rule for the default character set to
   * use for column definitions of character type.
   *
   * <p>Note that this tag is a block tag (like &#64;see) and cannot be used
   * inline.
   */
  @Nullable Glossary SQL92 = null;

  /**
   * The official SQL:1999 standard (ISO/IEC 9075:1999), which is broken up
   * into five parts. To reference this standard from methods that implement
   * its rules, use the &#64;sql.99 custom block tag in Javadoc comments; for
   * the tag body, use the format <code>&lt;PartId&gt; &lt;SectionId&gt; [
   * ItemType &lt;ItemId&gt; ]</code>, where
   *
   * <ul>
   * <li><code>PartId</code> is the numbered part (up to Part 5)
   * <li><code>SectionId</code> is the numbered or named section in the part's
   * table of contents, e.g. "Section 4.18.9" or "Annex A"
   * <li><code>ItemType</code> is one of { Table, Syntax Rule, Access Rule,
   * General Rule, or Conformance Rule }
   * <li><code>ItemId</code> is a dotted path expression to the specific item
   * </ul>
   *
   * <p>For example,
   *
   * <blockquote><pre><code>&#64;sql.99 Part 2 Section 11.4 Syntax Rule 7.b
   * </code></pre></blockquote>
   *
   * <p>is a well-formed reference to the rule for the default character set to
   * use for column definitions of character type.
   *
   * <p>Note that this tag is a block tag (like &#64;see) and cannot be used
   * inline.
   */
  @Nullable Glossary SQL99 = null;

  /**
   * The official SQL:2003 standard (ISO/IEC 9075:2003), which is broken up
   * into numerous parts. To reference this standard from methods that
   * implement its rules, use the &#64;sql.2003 custom block tag in Javadoc
   * comments; for the tag body, use the format <code>&lt;PartId&gt;
   * &lt;SectionId&gt; [ ItemType &lt;ItemId&gt; ]</code>, where
   *
   * <ul>
   * <li><code>PartId</code> is the numbered part
   * <li><code>SectionId</code> is the numbered or named section in the part's
   * table of contents, e.g. "Section 4.11.2" or "Annex A"
   * <li><code>ItemType</code> is one of { Table, Syntax Rule, Access Rule,
   * General Rule, or Conformance Rule }
   * <li><code>ItemId</code> is a dotted path expression to the specific item
   * </ul>
   *
   * <p>For example,
   *
   * <blockquote><pre><code>&#64;sql.2003 Part 2 Section 11.4 Syntax Rule 10.b
   * </code></pre></blockquote>
   *
   * <p>is a well-formed reference to the rule for the default character set to
   * use for column definitions of character type.
   *
   * <p>Note that this tag is a block tag (like &#64;see) and cannot be used
   * inline.
   */
  @Nullable Glossary SQL2003 = null;
}
