All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jaxdb.jsql.Command Maven / Gradle / Ivy

/* Copyright (c) 2021 JAX-DB
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * You should have received a copy of The MIT License (MIT) along with this
 * program. If not, see .
 */

package org.jaxdb.jsql;

import static org.libj.lang.Assertions.*;

import java.io.Closeable;
import java.io.IOException;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.UUID;

import org.jaxdb.jsql.Callbacks.OnCommit;
import org.jaxdb.jsql.Callbacks.OnExecute;
import org.jaxdb.jsql.Callbacks.OnNotify;
import org.jaxdb.jsql.Callbacks.OnRollback;
import org.jaxdb.jsql.keyword.Case;
import org.jaxdb.jsql.keyword.Delete.DELETE;
import org.jaxdb.jsql.keyword.Delete._DELETE;
import org.jaxdb.jsql.keyword.Insert.INSERT;
import org.jaxdb.jsql.keyword.Insert._INSERT;
import org.jaxdb.jsql.keyword.Keyword;
import org.jaxdb.jsql.keyword.Update.SET;
import org.jaxdb.jsql.keyword.Update.UPDATE;
import org.jaxdb.vendor.DbVendor;
import org.libj.lang.Throwables;
import org.libj.lang.UUIDs;
import org.libj.sql.AuditConnection;
import org.libj.sql.AuditStatement;
import org.libj.sql.ResultSets;
import org.libj.sql.exception.SQLExceptions;
import org.libj.util.ArrayUtil;
import org.libj.util.function.ToBooleanFunction;

abstract class Command extends Keyword implements Closeable {
  @SuppressWarnings("unchecked")
  public final E onExecute(final OnExecute onExecute) {
    getCallbacks().addOnExecute(onExecute);
    return (E)this;
  }

  private boolean closed;
  Callbacks callbacks;

  Callbacks getCallbacks() {
    return callbacks == null ? callbacks = new Callbacks() : callbacks;
  }

  void assertNotClosed() {
    if (closed)
      throw new IllegalStateException("statement is closed");
  }

  @Override
  public void close() {
    closed = true;
  }

  abstract static class Modification extends Command {
    data.Table entity;

    private Modification(final data.Table entity) {
      this.entity = entity;
    }

    final void revertEntity() {
      if (entity != null)
        entity.revert();
    }

    @Override
    public final void close() {
      super.close();
      if (entity != null)
        entity._commitEntity$();
    }

    String sessionId;

    @SuppressWarnings("unchecked")
    public final C onCommit(final OnCommit onCommit) {
      getCallbacks().addOnCommit(onCommit);
      return (C)this;
    }

    @SuppressWarnings("unchecked")
    public final R onRollback(final OnRollback onRollback) {
      getCallbacks().addOnRollback(onRollback);
      return (R)this;
    }
  }

  private static final data.Column[] emptyColumns = {};

  private static data.Column[] recurseColumns(final data.Column[] columns, final ToBooleanFunction> predicate, final int length, final int index, final int depth) {
    if (index == length)
      return depth == 0 ? emptyColumns : new data.Column[depth];

    final data.Column column = columns[index];
    final boolean include = predicate.applyAsBoolean(column);
    if (!include)
      return recurseColumns(columns, predicate, length, index + 1, depth);

    final data.Column[] results = recurseColumns(columns, predicate, length, index + 1, depth + 1);
    results[depth] = column;
    return results;
  }

  static final class Insert extends Command.Modification implements _INSERT, keyword.Insert.CONFLICT_ACTION_NOTIFY, keyword.Insert.ON_CONFLICT {
    private data.Column[] columns;
    private data.Column[] primaries;
    final data.Column[] autos;
    private keyword.Select.untyped.SELECT select;
    private boolean isOnConflict;
    private data.Column[] onConflictColumns;
    private boolean doUpdate;

    Insert(final data.Table entity) {
      super(entity);
      this.columns = null;
      this.autos = recurseColumns(entity._auto$, c -> c.setByCur != data.Column.SetBy.USER, entity._auto$.length, 0, 0);
    }

    Insert(final data.Column column, final data.Column[] columns) {
      super(null);
      this.columns = ArrayUtil.splice(columns, 0, 0, column);
      final data.Table table = this.columns[0].getTable();
      for (int i = 1, i$ = this.columns.length; i < i$; ++i) // [A]
        if (!this.columns[i].getTable().equals(table))
          throw new IllegalArgumentException("All columns must belong to the same Table");

      this.primaries = recurseColumns(this.columns, c -> c.primaryIndexType != null, this.columns.length, 0, 0);
      this.autos = recurseColumns(this.columns, c -> c.setByCur != data.Column.SetBy.USER && c.generateOnInsert == GenerateOn.AUTO_GENERATED, this.columns.length, 0, 0);
    }

    @Override
    public keyword.Insert.CONFLICT_ACTION_NOTIFY onNotify(final OnNotify onNotify) {
      if (sessionId == null)
        sessionId = UUIDs.toString32(UUID.randomUUID());

      getCallbacks().addOnNotify(sessionId, onNotify);
      return this;
    }

    @Override
    public keyword.Insert.CONFLICT_ACTION_NOTIFY onNotify(final boolean onNotify) {
      if (sessionId == null)
        sessionId = UUIDs.toString32(UUID.randomUUID());

      getCallbacks().addOnNotify(sessionId, onNotify);
      return this;
    }

    @Override
    public INSERT VALUES(final keyword.Select.untyped.SELECT select) {
      this.select = select;
      return this;
    }

    @Override
    public keyword.Insert.ON_CONFLICT ON_CONFLICT() {
      isOnConflict = true;
      if (entity != null)
        onConflictColumns = entity._primary$;
      else if (primaries != null)
        onConflictColumns = primaries;

      return this;
    }

    @Override
    public keyword.Insert.CONFLICT_ACTION DO_UPDATE() {
      doUpdate = true;
      return this;
    }

    @Override
    public keyword.Insert.CONFLICT_ACTION DO_NOTHING() {
      doUpdate = false;
      return this;
    }

    @Override
    final data.Table getTable() {
      if (entity != null)
        return entity;

      if (columns != null)
        return entity = columns[0].getTable();

      throw new UnsupportedOperationException("Expected insert.entities != null || insert.select != null");
    }

    @Override
    final data.Column getColumn() {
      throw new UnsupportedOperationException();
    }

    @Override
    void compile(final Compilation compilation, final boolean isExpression) throws IOException, SQLException {
      final data.Column[] columns = this.columns != null ? this.columns : entity._column$;
      final Compiler compiler = compilation.compiler;
      if (isOnConflict)
        compiler.compileInsertOnConflict(columns, select, onConflictColumns, doUpdate, compilation);
      else if (select != null)
        compiler.compileInsertSelect(columns, select, false, compilation);
      else
        compiler.compileInsert(columns, false, compilation);
    }
  }

  static final class Update extends Command.Modification implements SET, keyword.Update.UPDATE_NOTIFY {
    private ArrayList sets;
    private Condition where;

    Update(final data.Table entity) {
      super(entity);
    }

    @Override
    public keyword.Update.UPDATE_NOTIFY onNotify(final OnNotify onNotify) {
      if (sessionId == null)
        sessionId = UUIDs.toString32(UUID.randomUUID());

      getCallbacks().addOnNotify(sessionId, onNotify);
      return this;
    }

    @Override
    public keyword.Update.UPDATE_NOTIFY onNotify(final boolean onNotify) {
      if (sessionId == null)
        sessionId = UUIDs.toString32(UUID.randomUUID());

      getCallbacks().addOnNotify(sessionId, onNotify);
      return this;
    }

    private void initSets() {
      if (sets == null)
        sets = new ArrayList<>();
    }

    @Override
    public SET SET(final data.Column column, final type.Column to) {
      initSets();
      sets.add(column);
      sets.add((Subject)to);
      return this;
    }

    @Override
    public SET SET(final data.Column column, final T to) {
      initSets();
      sets.add(column);
      // FIXME: data.ENUM.NULL
      sets.add(to == null ? null : data.wrap(to));
      return this;
    }

    @Override
    public UPDATE WHERE(final Condition condition) {
      this.where = condition;
      return this;
    }

    @Override
    final data.Table getTable() {
      return entity;
    }

    @Override
    final data.Column getColumn() {
      throw new UnsupportedOperationException();
    }

    @Override
    final void compile(final Compilation compilation, final boolean isExpression) throws IOException, SQLException {
      final Compiler compiler = compilation.compiler;
      if (sets != null)
        compiler.compileUpdate(entity, sets, where, compilation);
      else
        compiler.compileUpdate(entity, compilation);
    }
  }

  static final class Delete extends Command.Modification implements _DELETE, keyword.Delete.DELETE_NOTIFY {
    private Condition where;

    Delete(final data.Table entity) {
      super(entity);
    }

    @Override
    public keyword.Delete.DELETE_NOTIFY onNotify(final OnNotify onNotify) {
      if (sessionId == null)
        sessionId = UUIDs.toString32(UUID.randomUUID());

      getCallbacks().addOnNotify(sessionId, onNotify);
      return this;
    }

    @Override
    public keyword.Delete.DELETE_NOTIFY onNotify(final boolean onNotify) {
      if (sessionId == null)
        sessionId = UUIDs.toString32(UUID.randomUUID());

      getCallbacks().addOnNotify(sessionId, onNotify);
      return this;
    }

    @Override
    public DELETE WHERE(final Condition where) {
      this.where = where;
      return this;
    }

    @Override
    final data.Table getTable() {
      return entity;
    }

    @Override
    final data.Column getColumn() {
      return where;
    }

    @Override
    void compile(final Compilation compilation, final boolean isExpression) throws IOException, SQLException {
      final Compiler compiler = compilation.compiler;
      if (where != null)
        compiler.compileDelete(entity, where, compilation);
      else
        compiler.compileDelete(entity, compilation);
    }
  }

  static final class Select {
    public static class untyped {
      abstract static class SELECT extends Command> implements keyword.Select.untyped._SELECT, keyword.Select.untyped.FROM, keyword.Select.untyped.GROUP_BY, keyword.Select.untyped.HAVING, keyword.Select.untyped.UNION, keyword.Select.untyped.JOIN, keyword.Select.untyped.ADV_JOIN, keyword.Select.untyped.ON, keyword.Select.untyped.ORDER_BY, keyword.Select.untyped.LIMIT, keyword.Select.untyped.OFFSET, keyword.Select.untyped.FOR, keyword.Select.untyped.NOWAIT, keyword.Select.untyped.SKIP_LOCKED, keyword.Select.untyped.WHERE {
        enum LockStrength {
          SHARE,
          UPDATE
        }

        enum LockOption {
          NOWAIT("NOWAIT"),
          SKIP_LOCKED("SKIP LOCKED");

          private final String name;

          private LockOption(final String name) {
            this.name = name;
          }

          @Override
          public String toString() {
            return name;
          }
        }

        enum JoinKind {
          INNER(""),
          CROSS(" CROSS"),
          NATURAL(" NATURAL"),
          LEFT(" LEFT OUTER"),
          RIGHT(" RIGHT OUTER"),
          FULL(" FULL OUTER");

          private final String keyword;

          private JoinKind(final String keyword) {
            this.keyword = keyword;
          }

          @Override
          public String toString() {
            return keyword;
          }
        }

        private boolean tableCalled;
        private data.Table table;

        final boolean distinct;
        final type.Entity[] entities;

        private boolean fromCalled;
        private data.Table[] from;

        ArrayList joins;
        ArrayList> on;

        data.Entity[] groupBy;
        Condition having;

        ArrayList unions;

        data.Column[] orderBy;
        int[] orderByIndexes;

        int limit = -1;
        int offset = -1;

        LockStrength forLockStrength;
        Subject[] forSubjects;
        LockOption forLockOption;

        private boolean isObjectQuery;
        private boolean whereCalled;
        private Condition where;

        boolean isEntityOnlySelect;
        boolean isConditionalSelect = false;

        SELECT(final boolean distinct, final type.Entity[] entities) {
          if (entities.length < 1)
            throw new IllegalArgumentException("entities.length < 1");

          assertNotNullArray(entities, "Argument to SELECT cannot be null (use type.?.NULL instead)");

          this.entities = entities;
          this.distinct = distinct;
        }

        @Override
        public D AS(final D as) {
          ((data.Entity)as).wrap(new As(this, as, true));
          return as;
        }

        @Override
        public SELECT FROM(final data.Table ... from) {
          this.from = from;
          fromCalled = true;
          return this;
        }

        @Override
        public SELECT CROSS_JOIN(final data.Table table) {
          return JOIN(JoinKind.CROSS, table);
        }

        @Override
        public SELECT CROSS_JOIN(final keyword.Select.untyped.SELECT select) {
          return JOIN(JoinKind.CROSS, select);
        }

        @Override
        public SELECT NATURAL_JOIN(final data.Table table) {
          return JOIN(JoinKind.NATURAL, table);
        }

        @Override
        public SELECT NATURAL_JOIN(final keyword.Select.untyped.SELECT select) {
          return JOIN(JoinKind.NATURAL, select);
        }

        @Override
        public SELECT LEFT_JOIN(final data.Table table) {
          return JOIN(JoinKind.LEFT, table);
        }

        @Override
        public SELECT LEFT_JOIN(final keyword.Select.untyped.SELECT select) {
          return JOIN(JoinKind.LEFT, select);
        }

        @Override
        public SELECT RIGHT_JOIN(final data.Table table) {
          return JOIN(JoinKind.RIGHT, table);
        }

        @Override
        public SELECT RIGHT_JOIN(final keyword.Select.untyped.SELECT select) {
          return JOIN(JoinKind.RIGHT, select);
        }

        @Override
        public SELECT FULL_JOIN(final data.Table table) {
          return JOIN(JoinKind.FULL, table);
        }

        @Override
        public SELECT FULL_JOIN(final keyword.Select.untyped.SELECT select) {
          return JOIN(JoinKind.FULL, select);
        }

        @Override
        public SELECT JOIN(final data.Table table) {
          return JOIN(JoinKind.INNER, table);
        }

        @Override
        public SELECT JOIN(final keyword.Select.untyped.SELECT select) {
          return JOIN(JoinKind.INNER, select);
        }

        private SELECT JOIN(final JoinKind kind, final Object join) {
          ArrayList joins = this.joins;
          if (joins == null)
            joins = this.joins = new ArrayList<>();

          joins.add(kind);
          joins.add(join);
          return this;
        }

        @Override
        public SELECT ON(final Condition on) {
          if (this.on == null)
            this.on = new ArrayList<>();

          // Since ON is optional, for each JOIN without ON, add a null to this.on
          for (int i = 0, joinsSize = this.joins.size(), onSize = this.on.size(); i < joinsSize / 2 - onSize - 1; ++i) // [N]
            this.on.add(null);

          this.on.add(on);
          return this;
        }

        @Override
        public SELECT GROUP_BY(final data.Entity ... groupBy) {
          this.groupBy = groupBy;
          return this;
        }

        @Override
        public SELECT HAVING(final Condition having) {
          this.having = having;
          return this;
        }

        @Override
        public SELECT UNION(final keyword.Select.untyped.SELECT select) {
          UNION(Boolean.FALSE, select);
          return this;
        }

        @Override
        public SELECT UNION_ALL(final keyword.Select.untyped.SELECT select) {
          UNION(Boolean.TRUE, select);
          return this;
        }

        private SELECT UNION(final Boolean all, final keyword.Select.untyped.SELECT select) {
          if (this.unions == null)
            this.unions = new ArrayList<>();

          this.unions.add(all);
          this.unions.add(select);
          return this;
        }

        @Override
        public SELECT ORDER_BY(final data.Column ... columns) {
          this.orderBy = columns;
          return this;
        }

        @Override
        public SELECT LIMIT(final int rows) {
          this.limit = rows;
          return this;
        }

        @Override
        public SELECT OFFSET(final int rows) {
          this.offset = rows;
          return this;
        }

        @Override
        public SELECT FOR_SHARE(final data.Entity ... subjects) {
          return FOR(LockStrength.SHARE, subjects);
        }

        @Override
        public SELECT FOR_UPDATE(final data.Entity ... subjects) {
          return FOR(LockStrength.UPDATE, subjects);
        }

        private SELECT FOR(final LockStrength lockStrength, final data.Entity ... subjects) {
          this.forLockStrength = lockStrength;
          this.forSubjects = subjects;
          return this;
        }

        @Override
        public SELECT NOWAIT() {
          this.forLockOption = LockOption.NOWAIT;
          return this;
        }

        @Override
        public SELECT SKIP_LOCKED() {
          this.forLockOption = LockOption.SKIP_LOCKED;
          return this;
        }

        @Override
        public SELECT WHERE(final Condition where) {
          this.where = where;
          return this;
        }

        data.Column[] getPrimaryColumnsFromCondition(final Condition condition) {
          final ArrayList> columns = new ArrayList<>(); // FIXME: Is there a way to do this without an ArrayList?
          condition.collectColumns(columns);
          return columns.toArray(new data.Column[columns.size()]);
        }

        private Object[][] compile(final type.Entity[] entities, final int length, final int index, final int depth) {
          if (index == length)
            return new Object[depth][2];

          final type.Entity entity = entities[index];
          if (entity instanceof data.Table) {
            final data.Table table = (data.Table)entity;
            final int noColumns = table._column$.length;
            final Object[][] protoSubjectIndexes = compile(entities, length, index + 1, depth + noColumns);
            for (int i = 0; i < noColumns; ++i) { // [A]
              final Object[] array = protoSubjectIndexes[depth + i];
              array[0] = table._column$[i];
              array[1] = i;
            }

            return protoSubjectIndexes;
          }

          if (entity instanceof type.Column) {
            isEntityOnlySelect = false;
            final type.Column column = (type.Column)entity;
            final Object[][] protoSubjectIndexes = compile(entities, length, index + 1, depth + 1);
            final Object[] array = protoSubjectIndexes[depth];
            array[0] = column;
            array[1] = -1;
            return protoSubjectIndexes;
          }

          if (entity instanceof untyped.SELECT) {
            isEntityOnlySelect = false;
            final type.Entity[] selectEntities = ((untyped.SELECT)entity).entities;
            if (selectEntities.length != 1)
              throw new IllegalStateException("Expected 1 entity, but got " + selectEntities.length);

            final type.Entity selectEntity = selectEntities[0];
            if (!(selectEntity instanceof data.Column))
              throw new IllegalStateException("Expected data.Column, but got: " + selectEntity.getClass().getName());

            final Object[][] protoSubjectIndexes = compile(entities, length, index + 1, depth + 1);
            final Object[] array = protoSubjectIndexes[depth];
            array[0] = selectEntity;
            array[1] = -1;
            return protoSubjectIndexes;
          }

          throw new IllegalStateException("Unknown entity type: " + entity.getClass().getName());
        }

        void assertRowIteratorConsumed(final boolean endReached, final boolean isCacheable, final SQLException e, final boolean isCacheableRowIteratorFullConsume) throws SQLException {
          if (!endReached && isCacheable && isCacheableRowIteratorFullConsume) {
            final IllegalStateException ie = new IllegalStateException("RowIterator end not reached for cacheableRowIteratorFullConsume=true");
            if (e != null)
              ie.addSuppressed(e);

            throw ie;
          }

          if (e != null)
            throw SQLExceptions.toStrongType(e);
        }

        @SuppressWarnings("unchecked")
        RowIterator execute(final Schema schema, final Transaction transaction, Connector connector, Connection connection, boolean isPrepared, final Transaction.Isolation isolation, final QueryConfig contextQueryConfig) throws IOException, SQLException {
          assertNotClosed();

          Statement statement = null;
          try {
            if (transaction != null) {
              isPrepared = transaction.isPrepared();
              connection = transaction.getConnection();
            }
            else if (connection == null) {
              if (connector == null)
                connector = schema.getConnector();

              isPrepared = connector.isPrepared();
              connection = connector.getConnection(isolation);
              connection.setAutoCommit(true);
            }

            final DbVendor vendor = DbVendor.valueOf(connection.getMetaData());
            try (final Compilation compilation = new Compilation(this, vendor, isPrepared)) {
              final QueryConfig defaultQueryConfig = schema.defaultQueryConfig;

              isEntityOnlySelect = true;
              final Object[][] protoSubjectIndexes = compile(entities, entities.length, 0, 0);
              final boolean cacheSelectEntity = QueryConfig.getCacheSelectEntity(contextQueryConfig, defaultQueryConfig);
              compile(compilation, false, cacheSelectEntity);
              final Notifier notifier;
              final boolean isSelectAll;
              if (cacheSelectEntity) {
                notifier = schema.getCacheNotifier();
                isSelectAll = isEntityOnlySelect && !isConditionalSelect;
              }
              else {
                notifier = null;
                isSelectAll = false;
              }

              final int columnOffset = compilation.skipFirstColumn() ? 2 : 1;
              final Compiler compiler = compilation.compiler;

              final ResultSet resultSet = QueryConfig.executeQuery(contextQueryConfig, defaultQueryConfig, compilation, connection);
              if (callbacks != null)
                callbacks.onExecute(Statement.SUCCESS_NO_INFO);

              final Connector connectorFinal = connector;
              final Connection connectionFinal = connection;
              final Statement statementFinal = statement = resultSet.getStatement();
              final int noColumns = resultSet.getMetaData().getColumnCount() + 1 - columnOffset;
              return new RowIterator(resultSet, contextQueryConfig, defaultQueryConfig) {
                private final boolean isCacheableRowIteratorFullConsume = QueryConfig.getCacheableRowIteratorFullConsume(contextQueryConfig, defaultQueryConfig);
                private HashMap,data.Table> prototypes = new HashMap<>();
                private HashMap cachedTables = new HashMap<>();
                private data.Table currentTable;
                private boolean mustFetchRow = false;

                @Override
                public boolean nextRow() throws SQLException {
                  if (endReached)
                    return false;

                  try {
                    if (endReached = !resultSet.next()) {
                      if (isSelectAll)
                        table._commitSelectAll$();

                      return false;
                    }

                    mustFetchRow = true;
                  }
                  catch (SQLException e) {
                    e = Throwables.addSuppressed(e, suppressed);
                    suppressed = null;
                    throw SQLExceptions.toStrongType(e);
                  }

                  return true;
                }

                @Override
                public D nextEntity() throws SQLException {
                  fetchRow();
                  return super.nextEntity();
                }

                private void onSelect(final data.Table row) {
                  if (notifier != null && row.getCacheSelectEntity())
                    notifier.onSelect(row);
                }

                @SuppressWarnings("null")
                private void fetchRow() throws SQLException {
                  if (!mustFetchRow)
                    return;

                  final type.Entity[] row;
                  int index = 0;
                  data.Table table;
                  try {
                    row = new type.Entity[entities.length];
                    table = null;
                    for (int i = 0; i < noColumns; ++i) { // [A]
                      final Object[] protoSubjectIndex = protoSubjectIndexes[i];
                      final Subject protoSubject = (Subject)protoSubjectIndex[0];
                      final Integer protoIndex = (Integer)protoSubjectIndex[1];
                      if (currentTable != null && (currentTable != protoSubject.getTable() || protoIndex == -1)) {
                        data.Table cachedTable = cachedTables.get(table);
                        if (cachedTable == null) {
                          cachedTables.put(table, cachedTable = table);
                          prototypes.put(table.getClass(), table.newInstance());
                        }

                        row[index++] = cachedTable;
                        onSelect(cachedTable);
                      }

                      final data.Column column;
                      if (protoIndex != -1) {
                        currentTable = protoSubject.getTable();
                        if (currentTable._mutable$) {
                          table = currentTable;
                        }
                        else {
                          table = prototypes.get(currentTable.getClass());
                          if (table == null)
                            prototypes.put(currentTable.getClass(), table = currentTable.newInstance());
                        }

                        column = table._column$[protoIndex];
                      }
                      else {
                        table = null;
                        currentTable = null;
                        if (protoSubject instanceof data.Column) {
                          final data.Column col = (data.Column)protoSubject;
                          column = col._mutable$ ? col : col.clone();
                        }
                        else {
                          column = protoSubject.getColumn().clone();
                        }

                        row[index++] = column;
                      }

                      column.read(compiler, resultSet, i + columnOffset);
                    }
                  }
                  catch (SQLException e) {
                    e = Throwables.addSuppressed(e, suppressed);
                    suppressed = null;
                    throw SQLExceptions.toStrongType(e);
                  }

                  if (table != null) {
                    final data.Table cachedTable = cachedTables.getOrDefault(table, table);
                    row[index++] = cachedTable;
                    onSelect(cachedTable);
                  }

                  setRow((D[])row);
                  prototypes.clear();
                  currentTable = null;
                  mustFetchRow = false;
                }

                @Override
                public void close() throws SQLException {
                  SQLException e = Throwables.addSuppressed(suppressed, ResultSets.close(resultSet));
                  e = Throwables.addSuppressed(e, AuditStatement.close(statementFinal));
                  if (connectorFinal != null)
                    e = Throwables.addSuppressed(e, AuditConnection.close(connectionFinal));

                  prototypes = null;
                  cachedTables = null;
                  currentTable = null;

                  assertRowIteratorConsumed(endReached, isEntityOnlySelect, e, isCacheableRowIteratorFullConsume);
                }
              };
            }
          }
          catch (SQLException e) {
            if (statement != null)
              e = Throwables.addSuppressed(e, AuditStatement.close(statement));

            if (connector != null)
              e = Throwables.addSuppressed(e, AuditConnection.close(connection));

            throw SQLExceptions.toStrongType(e);
          }
          finally {
            close();
          }
        }

        @Override
        public final RowIterator execute(final Transaction transaction) throws IOException, SQLException {
          return execute(getSchema(), transaction, null, null, false, null, null);
        }

        @Override
        public final RowIterator execute(final Connector connector, final Transaction.Isolation isolation) throws IOException, SQLException {
          return execute(getSchema(), null, connector, null, false, isolation, null);
        }

        @Override
        public final RowIterator execute(final Connector connector) throws IOException, SQLException {
          return execute(getSchema(), null, connector, null, false, null, null);
        }

        @Override
        public final RowIterator execute(final Connection connection, final boolean isPrepared) throws IOException, SQLException {
          return execute(getSchema(), null, null, assertNotNull(connection), isPrepared, null, null);
        }

        @Override
        public final RowIterator execute(final Transaction.Isolation isolation) throws IOException, SQLException {
          final Schema schema = getSchema();
          return execute(schema, null, null, null, false, isolation, null);
        }

        @Override
        public RowIterator execute() throws IOException, SQLException {
          final Schema schema = getSchema();
          return execute(schema, null, null, null, false, null, null);
        }

        @Override
        public final RowIterator execute(final Transaction transaction, final QueryConfig config) throws IOException, SQLException {
          return execute(getSchema(), transaction, null, null, false, null, config);
        }

        @Override
        public final RowIterator execute(final Connector connector, final Transaction.Isolation isolation, final QueryConfig config) throws IOException, SQLException {
          return execute(getSchema(), null, connector, null, false, isolation, config);
        }

        @Override
        public final RowIterator execute(final Connector connector, final QueryConfig config) throws IOException, SQLException {
          return execute(getSchema(), null, connector, null, false, null, config);
        }

        @Override
        public final RowIterator execute(final Connection connection, final boolean isPrepared, final QueryConfig config) throws IOException, SQLException {
          return execute(getSchema(), null, null, assertNotNull(connection), isPrepared, null, null);
        }

        @Override
        public final RowIterator execute(final Transaction.Isolation isolation, final QueryConfig config) throws IOException, SQLException {
          final Schema schema = getSchema();
          return execute(schema, null, null, null, false, isolation, config);
        }

        @Override
        public RowIterator execute(final QueryConfig config) throws IOException, SQLException {
          final Schema schema = getSchema();
          return execute(schema, null, null, null, false, null, null);
        }

        @Override
        final data.Table getTable() {
          if (tableCalled)
            return table;

          tableCalled = true;
          // FIXME: Note that this returns the 1st table only! Is this what we want?!
          if (entities[0] instanceof Select.untyped.SELECT)
            return table = ((Select.untyped.SELECT)entities[0]).getTable();

          final data.Table[] from = from();
          return from != null ? table = from[0] : null;
        }

        @Override
        final data.Column getColumn() {
          if (entities.length == 1)
            return ((Subject)entities[0]).getColumn();

          throw new UnsupportedOperationException();
        }

        // FIXME: What is translateTypes for again?
        HashMap> translateTypes;

        data.Table[] from() {
          if (fromCalled)
            return from;

          fromCalled = true;
          from = getTables(entities, entities.length, 0, 0);
          if ((isObjectQuery = where == null) || from == null)
            for (final type.Entity entity : entities) // [A]
              isObjectQuery &= entity instanceof data.Table;

          return from;
        }

        private static data.Table[] getTables(final type.Entity[] subjects, final int length, final int index, final int depth) {
          if (index == length)
            return depth == 0 ? null : new data.Table[depth];

          final type.Entity entity = subjects[index];
          final data.Table table = ((Subject)entity).getTable();
          if (table == null)
            return getTables(subjects, length, index + 1, depth);

          final data.Table[] tables = getTables(subjects, length, index + 1, depth + 1);
          tables[depth] = table;
          return tables;
        }

        Condition where() {
          if (whereCalled)
            return where;

          whereCalled = true;
          if (isObjectQuery) {
            final Condition[] conditions = createObjectQueryConditions(entities, entities.length, 0, 0);
            if (conditions != null)
              where = conditions.length == 1 ? conditions[0] : DML.AND(conditions);
          }

          isConditionalSelect = where != null;
          return where;
        }

        private static Condition[] createObjectQueryConditions(final type.Entity[] entities, final int length, final int index, final int depth) {
          if (index == length)
            return depth == 0 ? null : new Condition[depth];

          final type.Entity entity = entities[index];
          if (entity instanceof data.Table) {
            final data.Column[] columns = ((data.Table)entity)._column$;
            final Condition[] columnConditions = createObjectQueryConditions(columns, columns.length, 0, 0);
            if (columnConditions == null)
              return createObjectQueryConditions(entities, length, index + 1, depth);

            final Condition[] entityConditions = createObjectQueryConditions(entities, length, index + 1, depth + 1);
            entityConditions[depth] = columnConditions.length == 1 ? columnConditions[0] : DML.AND(columnConditions);
            return entityConditions;
          }
          else if (entity instanceof Select.untyped.SELECT) {
            return createObjectQueryConditions(entities, length, index + 1, depth);
          }

          throw new UnsupportedOperationException("Unsupported entity of object query: " + entity.getClass().getName());
        }

        private static Condition[] createObjectQueryConditions(final data.Column[] columns, final int length, final int index, final int depth) {
          if (index == length)
            return depth == 0 ? null : new Condition[depth];

          final data.Column column = columns[index];
          final boolean wasSet = column.setByCur == data.Column.SetBy.USER || (column.primaryIndexType != null || column.isKeyForUpdate) && column.setByCur == data.Column.SetBy.SYSTEM;
          if (!wasSet)
            return createObjectQueryConditions(columns, length, index + 1, depth);

          final Condition[] conditions = createObjectQueryConditions(columns, length, index + 1, depth + 1);
          conditions[depth] = new ComparisonPredicate.Eq<>(column, column.get());
          return conditions;
        }

        @Override
        final void compile(final Compilation compilation, final boolean isExpression) throws IOException, SQLException {
          final Compiler compiler = compilation.compiler;
          final boolean useAliases = forLockStrength == null || forSubjects == null || forSubjects.length == 0 || compiler.aliasInForUpdate();
          compiler.assignAliases(from(), joins, compilation);
          compiler.compileSelect(this, useAliases, compilation);
          compiler.compileFrom(from, useAliases, compilation);
          if (joins != null)
            for (int i = 0, j = 0, i$ = joins.size(), j$ = on == null ? Integer.MIN_VALUE : on.size(); i < i$; j = i / 2) // [RA]
              compiler.compileJoin((JoinKind)joins.get(i++), joins.get(i++), j < j$ ? on.get(j) : null, compilation);

          compiler.compileWhere(where(), compilation);
          compiler.compileGroupByHaving(this, useAliases, compilation);
          compiler.compileUnion(this, compilation);
          compiler.compileOrderBy(this, compilation);
          compiler.compileLimitOffset(this, compilation);
          if (forLockStrength != null)
            compiler.compileFor(this, compilation);
        }

        void compile(final Compilation compilation, final boolean isExpression, final boolean cacheSelectEntity) throws IOException, SQLException {
          compile(compilation, isExpression);
          if (cacheSelectEntity && !isEntityOnlySelect)
            throw new IllegalStateException("QueryConfig.cacheSelectEntity=true can only be fulfilled for queries that exclusively select entities instead of individual columns");
        }
      }
    }

    public static class ARRAY {
      static class SELECT extends untyped.SELECT implements keyword.Select.ARRAY._SELECT, keyword.Select.ARRAY.FROM, keyword.Select.ARRAY.GROUP_BY, keyword.Select.ARRAY.HAVING, keyword.Select.ARRAY.UNION, keyword.Select.ARRAY.JOIN, keyword.Select.ARRAY.ADV_JOIN, keyword.Select.ARRAY.ON, keyword.Select.ARRAY.ORDER_BY, keyword.Select.ARRAY.LIMIT, keyword.Select.ARRAY.OFFSET, keyword.Select.ARRAY.FOR, keyword.Select.ARRAY.NOWAIT, keyword.Select.ARRAY.SKIP_LOCKED, keyword.Select.ARRAY.WHERE {
        SELECT(final boolean distinct, final type.Entity[] entities) {
          super(distinct, entities);
        }

        @Override
        public D AS(final D as) {
          ((data.Entity)as).wrap(new As(this, as, true));
          return as;
        }

        @Override
        public final SELECT FROM(final data.Table ... from) {
          super.FROM(from);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final data.Table table) {
          super.CROSS_JOIN(table);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final keyword.Select.untyped.SELECT select) {
          super.CROSS_JOIN(select);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final data.Table table) {
          super.NATURAL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.NATURAL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final data.Table table) {
          super.LEFT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.LEFT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final data.Table table) {
          super.RIGHT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.RIGHT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final data.Table table) {
          super.FULL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.FULL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT JOIN(final data.Table table) {
          super.JOIN(table);
          return this;
        }

        @Override
        public final SELECT JOIN(final keyword.Select.untyped.SELECT select) {
          super.JOIN(select);
          return this;
        }

        @Override
        public final SELECT ON(final Condition on) {
          super.ON(on);
          return this;
        }

        @Override
        public final SELECT GROUP_BY(final data.Entity ... groupBy) {
          super.GROUP_BY(groupBy);
          return this;
        }

        @Override
        public final SELECT HAVING(final Condition having) {
          super.HAVING(having);
          return this;
        }

        @Override
        public final SELECT UNION(final keyword.Select.ARRAY.SELECT select) {
          super.UNION(select);
          return this;
        }

        @Override
        public final SELECT UNION_ALL(final keyword.Select.ARRAY.SELECT select) {
          super.UNION_ALL(select);
          return this;
        }

        @Override
        public final SELECT ORDER_BY(final data.Column ... columns) {
          super.ORDER_BY(columns);
          return this;
        }

        @Override
        public final SELECT LIMIT(final int rows) {
          super.LIMIT(rows);
          return this;
        }

        @Override
        public final SELECT OFFSET(final int rows) {
          super.OFFSET(rows);
          return this;
        }

        @Override
        public final SELECT FOR_SHARE(final data.Entity ... subjects) {
          super.FOR_SHARE(subjects);
          return this;
        }

        @Override
        public final SELECT FOR_UPDATE(final data.Entity ... subjects) {
          super.FOR_UPDATE(subjects);
          return this;
        }

        @Override
        public final SELECT NOWAIT() {
          super.NOWAIT();
          return this;
        }

        @Override
        public final SELECT SKIP_LOCKED() {
          super.SKIP_LOCKED();
          return this;
        }

        @Override
        public final SELECT WHERE(final Condition where) {
          super.WHERE(where);
          return this;
        }
      }
    }

    public static class BIGINT {
      static class SELECT extends untyped.SELECT implements keyword.Select.BIGINT._SELECT, keyword.Select.BIGINT.FROM, keyword.Select.BIGINT.GROUP_BY, keyword.Select.BIGINT.HAVING, keyword.Select.BIGINT.UNION, keyword.Select.BIGINT.JOIN, keyword.Select.BIGINT.ADV_JOIN, keyword.Select.BIGINT.ON, keyword.Select.BIGINT.ORDER_BY, keyword.Select.BIGINT.LIMIT, keyword.Select.BIGINT.OFFSET, keyword.Select.BIGINT.FOR, keyword.Select.BIGINT.NOWAIT, keyword.Select.BIGINT.SKIP_LOCKED, keyword.Select.BIGINT.WHERE {
        SELECT(final boolean distinct, final type.Entity[] entities) {
          super(distinct, entities);
        }

        @Override
        public D AS(final D as) {
          ((data.Entity)as).wrap(new As(this, as, true));
          return as;
        }

        @Override
        public final SELECT FROM(final data.Table ... from) {
          super.FROM(from);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final data.Table table) {
          super.CROSS_JOIN(table);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final keyword.Select.untyped.SELECT select) {
          super.CROSS_JOIN(select);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final data.Table table) {
          super.NATURAL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.NATURAL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final data.Table table) {
          super.LEFT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.LEFT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final data.Table table) {
          super.RIGHT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.RIGHT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final data.Table table) {
          super.FULL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.FULL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT JOIN(final data.Table table) {
          super.JOIN(table);
          return this;
        }

        @Override
        public final SELECT JOIN(final keyword.Select.untyped.SELECT select) {
          super.JOIN(select);
          return this;
        }

        @Override
        public final SELECT ON(final Condition on) {
          super.ON(on);
          return this;
        }

        @Override
        public final SELECT GROUP_BY(final data.Entity ... groupBy) {
          super.GROUP_BY(groupBy);
          return this;
        }

        @Override
        public final SELECT HAVING(final Condition having) {
          super.HAVING(having);
          return this;
        }

        @Override
        public final SELECT UNION(final keyword.Select.BIGINT.SELECT select) {
          super.UNION(select);
          return this;
        }

        @Override
        public final SELECT UNION_ALL(final keyword.Select.BIGINT.SELECT select) {
          super.UNION_ALL(select);
          return this;
        }

        @Override
        public final SELECT ORDER_BY(final data.Column ... columns) {
          super.ORDER_BY(columns);
          return this;
        }

        @Override
        public final SELECT LIMIT(final int rows) {
          super.LIMIT(rows);
          return this;
        }

        @Override
        public final SELECT OFFSET(final int rows) {
          super.OFFSET(rows);
          return this;
        }

        @Override
        public final SELECT FOR_SHARE(final data.Entity ... subjects) {
          super.FOR_SHARE(subjects);
          return this;
        }

        @Override
        public final SELECT FOR_UPDATE(final data.Entity ... subjects) {
          super.FOR_UPDATE(subjects);
          return this;
        }

        @Override
        public final SELECT NOWAIT() {
          super.NOWAIT();
          return this;
        }

        @Override
        public final SELECT SKIP_LOCKED() {
          super.SKIP_LOCKED();
          return this;
        }

        @Override
        public final SELECT WHERE(final Condition where) {
          super.WHERE(where);
          return this;
        }
      }
    }

    public static class BINARY {
      static class SELECT extends untyped.SELECT implements keyword.Select.BINARY._SELECT, keyword.Select.BINARY.FROM, keyword.Select.BINARY.GROUP_BY, keyword.Select.BINARY.HAVING, keyword.Select.BINARY.UNION, keyword.Select.BINARY.JOIN, keyword.Select.BINARY.ADV_JOIN, keyword.Select.BINARY.ON, keyword.Select.BINARY.ORDER_BY, keyword.Select.BINARY.LIMIT, keyword.Select.BINARY.OFFSET, keyword.Select.BINARY.FOR, keyword.Select.BINARY.NOWAIT, keyword.Select.BINARY.SKIP_LOCKED, keyword.Select.BINARY.WHERE {
        SELECT(final boolean distinct, final type.Entity[] entities) {
          super(distinct, entities);
        }

        @Override
        public D AS(final D as) {
          ((data.Entity)as).wrap(new As(this, as, true));
          return as;
        }

        @Override
        public final SELECT FROM(final data.Table ... from) {
          super.FROM(from);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final data.Table table) {
          super.CROSS_JOIN(table);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final keyword.Select.untyped.SELECT select) {
          super.CROSS_JOIN(select);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final data.Table table) {
          super.NATURAL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.NATURAL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final data.Table table) {
          super.LEFT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.LEFT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final data.Table table) {
          super.RIGHT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.RIGHT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final data.Table table) {
          super.FULL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.FULL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT JOIN(final data.Table table) {
          super.JOIN(table);
          return this;
        }

        @Override
        public final SELECT JOIN(final keyword.Select.untyped.SELECT select) {
          super.JOIN(select);
          return this;
        }

        @Override
        public final SELECT ON(final Condition on) {
          super.ON(on);
          return this;
        }

        @Override
        public final SELECT GROUP_BY(final data.Entity ... groupBy) {
          super.GROUP_BY(groupBy);
          return this;
        }

        @Override
        public final SELECT HAVING(final Condition having) {
          super.HAVING(having);
          return this;
        }

        @Override
        public final SELECT UNION(final keyword.Select.BINARY.SELECT select) {
          super.UNION(select);
          return this;
        }

        @Override
        public final SELECT UNION_ALL(final keyword.Select.BINARY.SELECT select) {
          super.UNION_ALL(select);
          return this;
        }

        @Override
        public final SELECT ORDER_BY(final data.Column ... columns) {
          super.ORDER_BY(columns);
          return this;
        }

        @Override
        public final SELECT LIMIT(final int rows) {
          super.LIMIT(rows);
          return this;
        }

        @Override
        public final SELECT OFFSET(final int rows) {
          super.OFFSET(rows);
          return this;
        }

        @Override
        public final SELECT FOR_SHARE(final data.Entity ... subjects) {
          super.FOR_SHARE(subjects);
          return this;
        }

        @Override
        public final SELECT FOR_UPDATE(final data.Entity ... subjects) {
          super.FOR_UPDATE(subjects);
          return this;
        }

        @Override
        public final SELECT NOWAIT() {
          super.NOWAIT();
          return this;
        }

        @Override
        public final SELECT SKIP_LOCKED() {
          super.SKIP_LOCKED();
          return this;
        }

        @Override
        public final SELECT WHERE(final Condition where) {
          super.WHERE(where);
          return this;
        }
      }
    }

    public static class BLOB {
      static class SELECT extends untyped.SELECT implements keyword.Select.BLOB._SELECT, keyword.Select.BLOB.FROM, keyword.Select.BLOB.GROUP_BY, keyword.Select.BLOB.HAVING, keyword.Select.BLOB.UNION, keyword.Select.BLOB.JOIN, keyword.Select.BLOB.ADV_JOIN, keyword.Select.BLOB.ON, keyword.Select.BLOB.ORDER_BY, keyword.Select.BLOB.LIMIT, keyword.Select.BLOB.OFFSET, keyword.Select.BLOB.FOR, keyword.Select.BLOB.NOWAIT, keyword.Select.BLOB.SKIP_LOCKED, keyword.Select.BLOB.WHERE {
        SELECT(final boolean distinct, final type.Entity[] entities) {
          super(distinct, entities);
        }

        @Override
        public D AS(final D as) {
          ((data.Entity)as).wrap(new As(this, as, true));
          return as;
        }

        @Override
        public final SELECT FROM(final data.Table ... from) {
          super.FROM(from);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final data.Table table) {
          super.CROSS_JOIN(table);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final keyword.Select.untyped.SELECT select) {
          super.CROSS_JOIN(select);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final data.Table table) {
          super.NATURAL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.NATURAL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final data.Table table) {
          super.LEFT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.LEFT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final data.Table table) {
          super.RIGHT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.RIGHT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final data.Table table) {
          super.FULL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.FULL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT JOIN(final data.Table table) {
          super.JOIN(table);
          return this;
        }

        @Override
        public final SELECT JOIN(final keyword.Select.untyped.SELECT select) {
          super.JOIN(select);
          return this;
        }

        @Override
        public final SELECT ON(final Condition on) {
          super.ON(on);
          return this;
        }

        @Override
        public final SELECT GROUP_BY(final data.Entity ... groupBy) {
          super.GROUP_BY(groupBy);
          return this;
        }

        @Override
        public final SELECT HAVING(final Condition having) {
          super.HAVING(having);
          return this;
        }

        @Override
        public final SELECT UNION(final keyword.Select.BLOB.SELECT select) {
          super.UNION(select);
          return this;
        }

        @Override
        public final SELECT UNION_ALL(final keyword.Select.BLOB.SELECT select) {
          super.UNION_ALL(select);
          return this;
        }

        @Override
        public final SELECT ORDER_BY(final data.Column ... columns) {
          super.ORDER_BY(columns);
          return this;
        }

        @Override
        public final SELECT LIMIT(final int rows) {
          super.LIMIT(rows);
          return this;
        }

        @Override
        public final SELECT OFFSET(final int rows) {
          super.OFFSET(rows);
          return this;
        }

        @Override
        public final SELECT FOR_SHARE(final data.Entity ... subjects) {
          super.FOR_SHARE(subjects);
          return this;
        }

        @Override
        public final SELECT FOR_UPDATE(final data.Entity ... subjects) {
          super.FOR_UPDATE(subjects);
          return this;
        }

        @Override
        public final SELECT NOWAIT() {
          super.NOWAIT();
          return this;
        }

        @Override
        public final SELECT SKIP_LOCKED() {
          super.SKIP_LOCKED();
          return this;
        }

        @Override
        public final SELECT WHERE(final Condition where) {
          super.WHERE(where);
          return this;
        }
      }
    }

    public static class BOOLEAN {
      static class SELECT extends untyped.SELECT implements keyword.Select.BOOLEAN._SELECT, keyword.Select.BOOLEAN.FROM, keyword.Select.BOOLEAN.GROUP_BY, keyword.Select.BOOLEAN.HAVING, keyword.Select.BOOLEAN.UNION, keyword.Select.BOOLEAN.JOIN, keyword.Select.BOOLEAN.ADV_JOIN, keyword.Select.BOOLEAN.ON, keyword.Select.BOOLEAN.ORDER_BY, keyword.Select.BOOLEAN.LIMIT, keyword.Select.BOOLEAN.OFFSET, keyword.Select.BOOLEAN.FOR, keyword.Select.BOOLEAN.NOWAIT, keyword.Select.BOOLEAN.SKIP_LOCKED, keyword.Select.BOOLEAN.WHERE {
        SELECT(final boolean distinct, final type.Entity[] entities) {
          super(distinct, entities);
        }

        @Override
        public D AS(final D as) {
          ((data.Entity)as).wrap(new As(this, as, true));
          return as;
        }

        @Override
        public final SELECT FROM(final data.Table ... from) {
          super.FROM(from);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final data.Table table) {
          super.CROSS_JOIN(table);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final keyword.Select.untyped.SELECT select) {
          super.CROSS_JOIN(select);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final data.Table table) {
          super.NATURAL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.NATURAL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final data.Table table) {
          super.LEFT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.LEFT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final data.Table table) {
          super.RIGHT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.RIGHT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final data.Table table) {
          super.FULL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.FULL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT JOIN(final data.Table table) {
          super.JOIN(table);
          return this;
        }

        @Override
        public final SELECT JOIN(final keyword.Select.untyped.SELECT select) {
          super.JOIN(select);
          return this;
        }

        @Override
        public final SELECT ON(final Condition on) {
          super.ON(on);
          return this;
        }

        @Override
        public final SELECT GROUP_BY(final data.Entity ... groupBy) {
          super.GROUP_BY(groupBy);
          return this;
        }

        @Override
        public final SELECT HAVING(final Condition having) {
          super.HAVING(having);
          return this;
        }

        @Override
        public final SELECT UNION(final keyword.Select.BOOLEAN.SELECT select) {
          super.UNION(select);
          return this;
        }

        @Override
        public final SELECT UNION_ALL(final keyword.Select.BOOLEAN.SELECT select) {
          super.UNION_ALL(select);
          return this;
        }

        @Override
        public final SELECT ORDER_BY(final data.Column ... columns) {
          super.ORDER_BY(columns);
          return this;
        }

        @Override
        public final SELECT LIMIT(final int rows) {
          super.LIMIT(rows);
          return this;
        }

        @Override
        public final SELECT OFFSET(final int rows) {
          super.OFFSET(rows);
          return this;
        }

        @Override
        public final SELECT FOR_SHARE(final data.Entity ... subjects) {
          super.FOR_SHARE(subjects);
          return this;
        }

        @Override
        public final SELECT FOR_UPDATE(final data.Entity ... subjects) {
          super.FOR_UPDATE(subjects);
          return this;
        }

        @Override
        public final SELECT NOWAIT() {
          super.NOWAIT();
          return this;
        }

        @Override
        public final SELECT SKIP_LOCKED() {
          super.SKIP_LOCKED();
          return this;
        }

        @Override
        public final SELECT WHERE(final Condition where) {
          super.WHERE(where);
          return this;
        }
      }
    }

    public static class CHAR {
      static class SELECT extends untyped.SELECT implements keyword.Select.CHAR._SELECT, keyword.Select.CHAR.FROM, keyword.Select.CHAR.GROUP_BY, keyword.Select.CHAR.HAVING, keyword.Select.CHAR.UNION, keyword.Select.CHAR.JOIN, keyword.Select.CHAR.ADV_JOIN, keyword.Select.CHAR.ON, keyword.Select.CHAR.ORDER_BY, keyword.Select.CHAR.LIMIT, keyword.Select.CHAR.OFFSET, keyword.Select.CHAR.FOR, keyword.Select.CHAR.NOWAIT, keyword.Select.CHAR.SKIP_LOCKED, keyword.Select.CHAR.WHERE {
        SELECT(final boolean distinct, final type.Entity[] entities) {
          super(distinct, entities);
        }

        @Override
        public D AS(final D as) {
          ((data.Entity)as).wrap(new As(this, as, true));
          return as;
        }

        @Override
        public final SELECT FROM(final data.Table ... from) {
          super.FROM(from);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final data.Table table) {
          super.CROSS_JOIN(table);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final keyword.Select.untyped.SELECT select) {
          super.CROSS_JOIN(select);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final data.Table table) {
          super.NATURAL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.NATURAL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final data.Table table) {
          super.LEFT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.LEFT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final data.Table table) {
          super.RIGHT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.RIGHT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final data.Table table) {
          super.FULL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.FULL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT JOIN(final data.Table table) {
          super.JOIN(table);
          return this;
        }

        @Override
        public final SELECT JOIN(final keyword.Select.untyped.SELECT select) {
          super.JOIN(select);
          return this;
        }

        @Override
        public final SELECT ON(final Condition on) {
          super.ON(on);
          return this;
        }

        @Override
        public final SELECT GROUP_BY(final data.Entity ... groupBy) {
          super.GROUP_BY(groupBy);
          return this;
        }

        @Override
        public final SELECT HAVING(final Condition having) {
          super.HAVING(having);
          return this;
        }

        @Override
        public final SELECT UNION(final keyword.Select.CHAR.SELECT select) {
          super.UNION(select);
          return this;
        }

        @Override
        public final SELECT UNION_ALL(final keyword.Select.CHAR.SELECT select) {
          super.UNION_ALL(select);
          return this;
        }

        @Override
        public final SELECT ORDER_BY(final data.Column ... columns) {
          super.ORDER_BY(columns);
          return this;
        }

        @Override
        public final SELECT LIMIT(final int rows) {
          super.LIMIT(rows);
          return this;
        }

        @Override
        public final SELECT OFFSET(final int rows) {
          super.OFFSET(rows);
          return this;
        }

        @Override
        public final SELECT FOR_SHARE(final data.Entity ... subjects) {
          super.FOR_SHARE(subjects);
          return this;
        }

        @Override
        public final SELECT FOR_UPDATE(final data.Entity ... subjects) {
          super.FOR_UPDATE(subjects);
          return this;
        }

        @Override
        public final SELECT NOWAIT() {
          super.NOWAIT();
          return this;
        }

        @Override
        public final SELECT SKIP_LOCKED() {
          super.SKIP_LOCKED();
          return this;
        }

        @Override
        public final SELECT WHERE(final Condition where) {
          super.WHERE(where);
          return this;
        }
      }
    }

    public static class CLOB {
      static class SELECT extends untyped.SELECT implements keyword.Select.CLOB._SELECT, keyword.Select.CLOB.FROM, keyword.Select.CLOB.GROUP_BY, keyword.Select.CLOB.HAVING, keyword.Select.CLOB.UNION, keyword.Select.CLOB.JOIN, keyword.Select.CLOB.ADV_JOIN, keyword.Select.CLOB.ON, keyword.Select.CLOB.ORDER_BY, keyword.Select.CLOB.LIMIT, keyword.Select.CLOB.OFFSET, keyword.Select.CLOB.FOR, keyword.Select.CLOB.NOWAIT, keyword.Select.CLOB.SKIP_LOCKED, keyword.Select.CLOB.WHERE {
        SELECT(final boolean distinct, final type.Entity[] entities) {
          super(distinct, entities);
        }

        @Override
        public D AS(final D as) {
          ((data.Entity)as).wrap(new As(this, as, true));
          return as;
        }

        @Override
        public final SELECT FROM(final data.Table ... from) {
          super.FROM(from);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final data.Table table) {
          super.CROSS_JOIN(table);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final keyword.Select.untyped.SELECT select) {
          super.CROSS_JOIN(select);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final data.Table table) {
          super.NATURAL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.NATURAL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final data.Table table) {
          super.LEFT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.LEFT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final data.Table table) {
          super.RIGHT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.RIGHT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final data.Table table) {
          super.FULL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.FULL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT JOIN(final data.Table table) {
          super.JOIN(table);
          return this;
        }

        @Override
        public final SELECT JOIN(final keyword.Select.untyped.SELECT select) {
          super.JOIN(select);
          return this;
        }

        @Override
        public final SELECT ON(final Condition on) {
          super.ON(on);
          return this;
        }

        @Override
        public final SELECT GROUP_BY(final data.Entity ... groupBy) {
          super.GROUP_BY(groupBy);
          return this;
        }

        @Override
        public final SELECT HAVING(final Condition having) {
          super.HAVING(having);
          return this;
        }

        @Override
        public final SELECT UNION(final keyword.Select.CLOB.SELECT select) {
          super.UNION(select);
          return this;
        }

        @Override
        public final SELECT UNION_ALL(final keyword.Select.CLOB.SELECT select) {
          super.UNION_ALL(select);
          return this;
        }

        @Override
        public final SELECT ORDER_BY(final data.Column ... columns) {
          super.ORDER_BY(columns);
          return this;
        }

        @Override
        public final SELECT LIMIT(final int rows) {
          super.LIMIT(rows);
          return this;
        }

        @Override
        public final SELECT OFFSET(final int rows) {
          super.OFFSET(rows);
          return this;
        }

        @Override
        public final SELECT FOR_SHARE(final data.Entity ... subjects) {
          super.FOR_SHARE(subjects);
          return this;
        }

        @Override
        public final SELECT FOR_UPDATE(final data.Entity ... subjects) {
          super.FOR_UPDATE(subjects);
          return this;
        }

        @Override
        public final SELECT NOWAIT() {
          super.NOWAIT();
          return this;
        }

        @Override
        public final SELECT SKIP_LOCKED() {
          super.SKIP_LOCKED();
          return this;
        }

        @Override
        public final SELECT WHERE(final Condition where) {
          super.WHERE(where);
          return this;
        }
      }
    }

    public static class Column {
      static class SELECT extends untyped.SELECT implements keyword.Select.Column._SELECT, keyword.Select.Column.FROM, keyword.Select.Column.GROUP_BY, keyword.Select.Column.HAVING, keyword.Select.Column.UNION, keyword.Select.Column.JOIN, keyword.Select.Column.ADV_JOIN, keyword.Select.Column.ON, keyword.Select.Column.ORDER_BY, keyword.Select.Column.LIMIT, keyword.Select.Column.OFFSET, keyword.Select.Column.FOR, keyword.Select.Column.NOWAIT, keyword.Select.Column.SKIP_LOCKED, keyword.Select.Column.WHERE {
        SELECT(final boolean distinct, final type.Entity[] entities) {
          super(distinct, entities);
        }

        @Override
        public D AS(final D as) {
          ((data.Entity)as).wrap(new As(this, as, true));
          return as;
        }

        @Override
        public final SELECT FROM(final data.Table ... from) {
          super.FROM(from);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final data.Table table) {
          super.CROSS_JOIN(table);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final keyword.Select.untyped.SELECT select) {
          super.CROSS_JOIN(select);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final data.Table table) {
          super.NATURAL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.NATURAL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final data.Table table) {
          super.LEFT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.LEFT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final data.Table table) {
          super.RIGHT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.RIGHT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final data.Table table) {
          super.FULL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.FULL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT JOIN(final data.Table table) {
          super.JOIN(table);
          return this;
        }

        @Override
        public final SELECT JOIN(final keyword.Select.untyped.SELECT select) {
          super.JOIN(select);
          return this;
        }

        @Override
        public final SELECT ON(final Condition on) {
          super.ON(on);
          return this;
        }

        @Override
        public final SELECT GROUP_BY(final data.Entity ... groupBy) {
          super.GROUP_BY(groupBy);
          return this;
        }

        @Override
        public final SELECT HAVING(final Condition having) {
          super.HAVING(having);
          return this;
        }

        @Override
        public final SELECT UNION(final keyword.Select.Column.SELECT select) {
          super.UNION(select);
          return this;
        }

        @Override
        public final SELECT UNION_ALL(final keyword.Select.Column.SELECT select) {
          super.UNION_ALL(select);
          return this;
        }

        @Override
        public final SELECT ORDER_BY(final data.Column ... columns) {
          super.ORDER_BY(columns);
          return this;
        }

        @Override
        public final SELECT LIMIT(final int rows) {
          super.LIMIT(rows);
          return this;
        }

        @Override
        public final SELECT OFFSET(final int rows) {
          super.OFFSET(rows);
          return this;
        }

        @Override
        public final SELECT FOR_SHARE(final data.Entity ... subjects) {
          super.FOR_SHARE(subjects);
          return this;
        }

        @Override
        public final SELECT FOR_UPDATE(final data.Entity ... subjects) {
          super.FOR_UPDATE(subjects);
          return this;
        }

        @Override
        public final SELECT NOWAIT() {
          super.NOWAIT();
          return this;
        }

        @Override
        public final SELECT SKIP_LOCKED() {
          super.SKIP_LOCKED();
          return this;
        }

        @Override
        public final SELECT WHERE(final Condition where) {
          super.WHERE(where);
          return this;
        }
      }
    }

    public static class DATE {
      static class SELECT extends untyped.SELECT implements keyword.Select.DATE._SELECT, keyword.Select.DATE.FROM, keyword.Select.DATE.GROUP_BY, keyword.Select.DATE.HAVING, keyword.Select.DATE.UNION, keyword.Select.DATE.JOIN, keyword.Select.DATE.ADV_JOIN, keyword.Select.DATE.ON, keyword.Select.DATE.ORDER_BY, keyword.Select.DATE.LIMIT, keyword.Select.DATE.OFFSET, keyword.Select.DATE.FOR, keyword.Select.DATE.NOWAIT, keyword.Select.DATE.SKIP_LOCKED, keyword.Select.DATE.WHERE {
        SELECT(final boolean distinct, final type.Entity[] entities) {
          super(distinct, entities);
        }

        @Override
        public D AS(final D as) {
          ((data.Entity)as).wrap(new As(this, as, true));
          return as;
        }

        @Override
        public final SELECT FROM(final data.Table ... from) {
          super.FROM(from);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final data.Table table) {
          super.CROSS_JOIN(table);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final keyword.Select.untyped.SELECT select) {
          super.CROSS_JOIN(select);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final data.Table table) {
          super.NATURAL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.NATURAL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final data.Table table) {
          super.LEFT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.LEFT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final data.Table table) {
          super.RIGHT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.RIGHT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final data.Table table) {
          super.FULL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.FULL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT JOIN(final data.Table table) {
          super.JOIN(table);
          return this;
        }

        @Override
        public final SELECT JOIN(final keyword.Select.untyped.SELECT select) {
          super.JOIN(select);
          return this;
        }

        @Override
        public final SELECT ON(final Condition on) {
          super.ON(on);
          return this;
        }

        @Override
        public final SELECT GROUP_BY(final data.Entity ... groupBy) {
          super.GROUP_BY(groupBy);
          return this;
        }

        @Override
        public final SELECT HAVING(final Condition having) {
          super.HAVING(having);
          return this;
        }

        @Override
        public final SELECT UNION(final keyword.Select.DATE.SELECT select) {
          super.UNION(select);
          return this;
        }

        @Override
        public final SELECT UNION_ALL(final keyword.Select.DATE.SELECT select) {
          super.UNION_ALL(select);
          return this;
        }

        @Override
        public final SELECT ORDER_BY(final data.Column ... columns) {
          super.ORDER_BY(columns);
          return this;
        }

        @Override
        public final SELECT LIMIT(final int rows) {
          super.LIMIT(rows);
          return this;
        }

        @Override
        public final SELECT OFFSET(final int rows) {
          super.OFFSET(rows);
          return this;
        }

        @Override
        public final SELECT FOR_SHARE(final data.Entity ... subjects) {
          super.FOR_SHARE(subjects);
          return this;
        }

        @Override
        public final SELECT FOR_UPDATE(final data.Entity ... subjects) {
          super.FOR_UPDATE(subjects);
          return this;
        }

        @Override
        public final SELECT NOWAIT() {
          super.NOWAIT();
          return this;
        }

        @Override
        public final SELECT SKIP_LOCKED() {
          super.SKIP_LOCKED();
          return this;
        }

        @Override
        public final SELECT WHERE(final Condition where) {
          super.WHERE(where);
          return this;
        }
      }
    }

    public static class DATETIME {
      static class SELECT extends untyped.SELECT implements keyword.Select.DATETIME._SELECT, keyword.Select.DATETIME.FROM, keyword.Select.DATETIME.GROUP_BY, keyword.Select.DATETIME.HAVING, keyword.Select.DATETIME.UNION, keyword.Select.DATETIME.JOIN, keyword.Select.DATETIME.ADV_JOIN, keyword.Select.DATETIME.ON, keyword.Select.DATETIME.ORDER_BY, keyword.Select.DATETIME.LIMIT, keyword.Select.DATETIME.OFFSET, keyword.Select.DATETIME.FOR, keyword.Select.DATETIME.NOWAIT, keyword.Select.DATETIME.SKIP_LOCKED, keyword.Select.DATETIME.WHERE {
        SELECT(final boolean distinct, final type.Entity[] entities) {
          super(distinct, entities);
        }

        @Override
        public D AS(final D as) {
          ((data.Entity)as).wrap(new As(this, as, true));
          return as;
        }

        @Override
        public final SELECT FROM(final data.Table ... from) {
          super.FROM(from);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final data.Table table) {
          super.CROSS_JOIN(table);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final keyword.Select.untyped.SELECT select) {
          super.CROSS_JOIN(select);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final data.Table table) {
          super.NATURAL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.NATURAL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final data.Table table) {
          super.LEFT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.LEFT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final data.Table table) {
          super.RIGHT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.RIGHT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final data.Table table) {
          super.FULL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.FULL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT JOIN(final data.Table table) {
          super.JOIN(table);
          return this;
        }

        @Override
        public final SELECT JOIN(final keyword.Select.untyped.SELECT select) {
          super.JOIN(select);
          return this;
        }

        @Override
        public final SELECT ON(final Condition on) {
          super.ON(on);
          return this;
        }

        @Override
        public final SELECT GROUP_BY(final data.Entity ... groupBy) {
          super.GROUP_BY(groupBy);
          return this;
        }

        @Override
        public final SELECT HAVING(final Condition having) {
          super.HAVING(having);
          return this;
        }

        @Override
        public final SELECT UNION(final keyword.Select.DATETIME.SELECT select) {
          super.UNION(select);
          return this;
        }

        @Override
        public final SELECT UNION_ALL(final keyword.Select.DATETIME.SELECT select) {
          super.UNION_ALL(select);
          return this;
        }

        @Override
        public final SELECT ORDER_BY(final data.Column ... columns) {
          super.ORDER_BY(columns);
          return this;
        }

        @Override
        public final SELECT LIMIT(final int rows) {
          super.LIMIT(rows);
          return this;
        }

        @Override
        public final SELECT OFFSET(final int rows) {
          super.OFFSET(rows);
          return this;
        }

        @Override
        public final SELECT FOR_SHARE(final data.Entity ... subjects) {
          super.FOR_SHARE(subjects);
          return this;
        }

        @Override
        public final SELECT FOR_UPDATE(final data.Entity ... subjects) {
          super.FOR_UPDATE(subjects);
          return this;
        }

        @Override
        public final SELECT NOWAIT() {
          super.NOWAIT();
          return this;
        }

        @Override
        public final SELECT SKIP_LOCKED() {
          super.SKIP_LOCKED();
          return this;
        }

        @Override
        public final SELECT WHERE(final Condition where) {
          super.WHERE(where);
          return this;
        }
      }
    }

    public static class DECIMAL {
      static class SELECT extends untyped.SELECT implements keyword.Select.DECIMAL._SELECT, keyword.Select.DECIMAL.FROM, keyword.Select.DECIMAL.GROUP_BY, keyword.Select.DECIMAL.HAVING, keyword.Select.DECIMAL.UNION, keyword.Select.DECIMAL.JOIN, keyword.Select.DECIMAL.ADV_JOIN, keyword.Select.DECIMAL.ON, keyword.Select.DECIMAL.ORDER_BY, keyword.Select.DECIMAL.LIMIT, keyword.Select.DECIMAL.OFFSET, keyword.Select.DECIMAL.FOR, keyword.Select.DECIMAL.NOWAIT, keyword.Select.DECIMAL.SKIP_LOCKED, keyword.Select.DECIMAL.WHERE {
        SELECT(final boolean distinct, final type.Entity[] entities) {
          super(distinct, entities);
        }

        @Override
        public D AS(final D as) {
          ((data.Entity)as).wrap(new As(this, as, true));
          return as;
        }

        @Override
        public final SELECT FROM(final data.Table ... from) {
          super.FROM(from);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final data.Table table) {
          super.CROSS_JOIN(table);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final keyword.Select.untyped.SELECT select) {
          super.CROSS_JOIN(select);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final data.Table table) {
          super.NATURAL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.NATURAL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final data.Table table) {
          super.LEFT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.LEFT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final data.Table table) {
          super.RIGHT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.RIGHT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final data.Table table) {
          super.FULL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.FULL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT JOIN(final data.Table table) {
          super.JOIN(table);
          return this;
        }

        @Override
        public final SELECT JOIN(final keyword.Select.untyped.SELECT select) {
          super.JOIN(select);
          return this;
        }

        @Override
        public final SELECT ON(final Condition on) {
          super.ON(on);
          return this;
        }

        @Override
        public final SELECT GROUP_BY(final data.Entity ... groupBy) {
          super.GROUP_BY(groupBy);
          return this;
        }

        @Override
        public final SELECT HAVING(final Condition having) {
          super.HAVING(having);
          return this;
        }

        @Override
        public final SELECT UNION(final keyword.Select.DECIMAL.SELECT select) {
          super.UNION(select);
          return this;
        }

        @Override
        public final SELECT UNION_ALL(final keyword.Select.DECIMAL.SELECT select) {
          super.UNION_ALL(select);
          return this;
        }

        @Override
        public final SELECT ORDER_BY(final data.Column ... columns) {
          super.ORDER_BY(columns);
          return this;
        }

        @Override
        public final SELECT LIMIT(final int rows) {
          super.LIMIT(rows);
          return this;
        }

        @Override
        public final SELECT OFFSET(final int rows) {
          super.OFFSET(rows);
          return this;
        }

        @Override
        public final SELECT FOR_SHARE(final data.Entity ... subjects) {
          super.FOR_SHARE(subjects);
          return this;
        }

        @Override
        public final SELECT FOR_UPDATE(final data.Entity ... subjects) {
          super.FOR_UPDATE(subjects);
          return this;
        }

        @Override
        public final SELECT NOWAIT() {
          super.NOWAIT();
          return this;
        }

        @Override
        public final SELECT SKIP_LOCKED() {
          super.SKIP_LOCKED();
          return this;
        }

        @Override
        public final SELECT WHERE(final Condition where) {
          super.WHERE(where);
          return this;
        }
      }
    }

    public static class DOUBLE {
      static class SELECT extends untyped.SELECT implements keyword.Select.DOUBLE._SELECT, keyword.Select.DOUBLE.FROM, keyword.Select.DOUBLE.GROUP_BY, keyword.Select.DOUBLE.HAVING, keyword.Select.DOUBLE.UNION, keyword.Select.DOUBLE.JOIN, keyword.Select.DOUBLE.ADV_JOIN, keyword.Select.DOUBLE.ON, keyword.Select.DOUBLE.ORDER_BY, keyword.Select.DOUBLE.LIMIT, keyword.Select.DOUBLE.OFFSET, keyword.Select.DOUBLE.FOR, keyword.Select.DOUBLE.NOWAIT, keyword.Select.DOUBLE.SKIP_LOCKED, keyword.Select.DOUBLE.WHERE {
        SELECT(final boolean distinct, final type.Entity[] entities) {
          super(distinct, entities);
        }

        @Override
        public D AS(final D as) {
          ((data.Entity)as).wrap(new As(this, as, true));
          return as;
        }

        @Override
        public final SELECT FROM(final data.Table ... from) {
          super.FROM(from);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final data.Table table) {
          super.CROSS_JOIN(table);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final keyword.Select.untyped.SELECT select) {
          super.CROSS_JOIN(select);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final data.Table table) {
          super.NATURAL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.NATURAL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final data.Table table) {
          super.LEFT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.LEFT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final data.Table table) {
          super.RIGHT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.RIGHT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final data.Table table) {
          super.FULL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.FULL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT JOIN(final data.Table table) {
          super.JOIN(table);
          return this;
        }

        @Override
        public final SELECT JOIN(final keyword.Select.untyped.SELECT select) {
          super.JOIN(select);
          return this;
        }

        @Override
        public final SELECT ON(final Condition on) {
          super.ON(on);
          return this;
        }

        @Override
        public final SELECT GROUP_BY(final data.Entity ... groupBy) {
          super.GROUP_BY(groupBy);
          return this;
        }

        @Override
        public final SELECT HAVING(final Condition having) {
          super.HAVING(having);
          return this;
        }

        @Override
        public final SELECT UNION(final keyword.Select.DOUBLE.SELECT select) {
          super.UNION(select);
          return this;
        }

        @Override
        public final SELECT UNION_ALL(final keyword.Select.DOUBLE.SELECT select) {
          super.UNION_ALL(select);
          return this;
        }

        @Override
        public final SELECT ORDER_BY(final data.Column ... columns) {
          super.ORDER_BY(columns);
          return this;
        }

        @Override
        public final SELECT LIMIT(final int rows) {
          super.LIMIT(rows);
          return this;
        }

        @Override
        public final SELECT OFFSET(final int rows) {
          super.OFFSET(rows);
          return this;
        }

        @Override
        public final SELECT FOR_SHARE(final data.Entity ... subjects) {
          super.FOR_SHARE(subjects);
          return this;
        }

        @Override
        public final SELECT FOR_UPDATE(final data.Entity ... subjects) {
          super.FOR_UPDATE(subjects);
          return this;
        }

        @Override
        public final SELECT NOWAIT() {
          super.NOWAIT();
          return this;
        }

        @Override
        public final SELECT SKIP_LOCKED() {
          super.SKIP_LOCKED();
          return this;
        }

        @Override
        public final SELECT WHERE(final Condition where) {
          super.WHERE(where);
          return this;
        }
      }
    }

    public static class Entity {
      static class SELECT extends untyped.SELECT implements keyword.Select.Entity._SELECT, keyword.Select.Entity.FROM, keyword.Select.Entity.GROUP_BY, keyword.Select.Entity.HAVING, keyword.Select.Entity.UNION, keyword.Select.Entity.JOIN, keyword.Select.Entity.ADV_JOIN, keyword.Select.Entity.ON, keyword.Select.Entity.ORDER_BY, keyword.Select.Entity.LIMIT, keyword.Select.Entity.OFFSET, keyword.Select.Entity.FOR, keyword.Select.Entity.NOWAIT, keyword.Select.Entity.SKIP_LOCKED, keyword.Select.Entity.WHERE {
        SELECT(final boolean distinct, final type.Entity[] entities) {
          super(distinct, entities);
        }

        SELECT(final boolean distinct, final data.Table[] entities) {
          super(distinct, entities);
        }

        @Override
        public D AS(final D as) {
          ((data.Entity)as).wrap(new As(this, as, true));
          return as;
        }

        @Override
        public final SELECT FROM(final data.Table ... from) {
          super.FROM(from);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final data.Table table) {
          super.CROSS_JOIN(table);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final keyword.Select.untyped.SELECT select) {
          super.CROSS_JOIN(select);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final data.Table table) {
          super.NATURAL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.NATURAL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final data.Table table) {
          super.LEFT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.LEFT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final data.Table table) {
          super.RIGHT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.RIGHT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final data.Table table) {
          super.FULL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.FULL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT JOIN(final data.Table table) {
          super.JOIN(table);
          return this;
        }

        @Override
        public final SELECT JOIN(final keyword.Select.untyped.SELECT select) {
          super.JOIN(select);
          return this;
        }

        @Override
        public final SELECT ON(final Condition on) {
          super.ON(on);
          return this;
        }

        @Override
        public final SELECT GROUP_BY(final data.Entity ... groupBy) {
          super.GROUP_BY(groupBy);
          return this;
        }

        @Override
        public final SELECT HAVING(final Condition having) {
          super.HAVING(having);
          return this;
        }

        @Override
        public final SELECT UNION(final keyword.Select.Entity.SELECT select) {
          super.UNION(select);
          return this;
        }

        @Override
        public final SELECT UNION_ALL(final keyword.Select.Entity.SELECT select) {
          super.UNION_ALL(select);
          return this;
        }

        @Override
        public final SELECT ORDER_BY(final data.Column ... columns) {
          super.ORDER_BY(columns);
          return this;
        }

        @Override
        public final SELECT LIMIT(final int rows) {
          super.LIMIT(rows);
          return this;
        }

        @Override
        public final SELECT OFFSET(final int rows) {
          super.OFFSET(rows);
          return this;
        }

        @Override
        public final SELECT FOR_SHARE(final data.Entity ... subjects) {
          super.FOR_SHARE(subjects);
          return this;
        }

        @Override
        public final SELECT FOR_UPDATE(final data.Entity ... subjects) {
          super.FOR_UPDATE(subjects);
          return this;
        }

        @Override
        public final SELECT NOWAIT() {
          super.NOWAIT();
          return this;
        }

        @Override
        public final SELECT SKIP_LOCKED() {
          super.SKIP_LOCKED();
          return this;
        }

        @Override
        public final SELECT WHERE(final Condition where) {
          super.WHERE(where);
          return this;
        }
      }
    }

    public static class ENUM {
      static class SELECT extends untyped.SELECT implements keyword.Select.ENUM._SELECT, keyword.Select.ENUM.FROM, keyword.Select.ENUM.GROUP_BY, keyword.Select.ENUM.HAVING, keyword.Select.ENUM.UNION, keyword.Select.ENUM.JOIN, keyword.Select.ENUM.ADV_JOIN, keyword.Select.ENUM.ON, keyword.Select.ENUM.ORDER_BY, keyword.Select.ENUM.LIMIT, keyword.Select.ENUM.OFFSET, keyword.Select.ENUM.FOR, keyword.Select.ENUM.NOWAIT, keyword.Select.ENUM.SKIP_LOCKED, keyword.Select.ENUM.WHERE {
        SELECT(final boolean distinct, final type.Entity[] entities) {
          super(distinct, entities);
        }

        @Override
        public D AS(final D as) {
          ((data.Entity)as).wrap(new As(this, as, true));
          return as;
        }

        @Override
        public final SELECT FROM(final data.Table ... from) {
          super.FROM(from);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final data.Table table) {
          super.CROSS_JOIN(table);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final keyword.Select.untyped.SELECT select) {
          super.CROSS_JOIN(select);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final data.Table table) {
          super.NATURAL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.NATURAL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final data.Table table) {
          super.LEFT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.LEFT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final data.Table table) {
          super.RIGHT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.RIGHT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final data.Table table) {
          super.FULL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.FULL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT JOIN(final data.Table table) {
          super.JOIN(table);
          return this;
        }

        @Override
        public final SELECT JOIN(final keyword.Select.untyped.SELECT select) {
          super.JOIN(select);
          return this;
        }

        @Override
        public final SELECT ON(final Condition on) {
          super.ON(on);
          return this;
        }

        @Override
        public final SELECT GROUP_BY(final data.Entity ... groupBy) {
          super.GROUP_BY(groupBy);
          return this;
        }

        @Override
        public final SELECT HAVING(final Condition having) {
          super.HAVING(having);
          return this;
        }

        @Override
        public final SELECT UNION(final keyword.Select.ENUM.SELECT select) {
          super.UNION(select);
          return this;
        }

        @Override
        public final SELECT UNION_ALL(final keyword.Select.ENUM.SELECT select) {
          super.UNION_ALL(select);
          return this;
        }

        @Override
        public final SELECT ORDER_BY(final data.Column ... columns) {
          super.ORDER_BY(columns);
          return this;
        }

        @Override
        public final SELECT LIMIT(final int rows) {
          super.LIMIT(rows);
          return this;
        }

        @Override
        public final SELECT OFFSET(final int rows) {
          super.OFFSET(rows);
          return this;
        }

        @Override
        public final SELECT FOR_SHARE(final data.Entity ... subjects) {
          super.FOR_SHARE(subjects);
          return this;
        }

        @Override
        public final SELECT FOR_UPDATE(final data.Entity ... subjects) {
          super.FOR_UPDATE(subjects);
          return this;
        }

        @Override
        public final SELECT NOWAIT() {
          super.NOWAIT();
          return this;
        }

        @Override
        public final SELECT SKIP_LOCKED() {
          super.SKIP_LOCKED();
          return this;
        }

        @Override
        public final SELECT WHERE(final Condition where) {
          super.WHERE(where);
          return this;
        }
      }
    }

    public static class FLOAT {
      static class SELECT extends untyped.SELECT implements keyword.Select.FLOAT._SELECT, keyword.Select.FLOAT.FROM, keyword.Select.FLOAT.GROUP_BY, keyword.Select.FLOAT.HAVING, keyword.Select.FLOAT.UNION, keyword.Select.FLOAT.JOIN, keyword.Select.FLOAT.ADV_JOIN, keyword.Select.FLOAT.ON, keyword.Select.FLOAT.ORDER_BY, keyword.Select.FLOAT.LIMIT, keyword.Select.FLOAT.OFFSET, keyword.Select.FLOAT.FOR, keyword.Select.FLOAT.NOWAIT, keyword.Select.FLOAT.SKIP_LOCKED, keyword.Select.FLOAT.WHERE {
        SELECT(final boolean distinct, final type.Entity[] entities) {
          super(distinct, entities);
        }

        @Override
        public D AS(final D as) {
          ((data.Entity)as).wrap(new As(this, as, true));
          return as;
        }

        @Override
        public final SELECT FROM(final data.Table ... from) {
          super.FROM(from);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final data.Table table) {
          super.CROSS_JOIN(table);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final keyword.Select.untyped.SELECT select) {
          super.CROSS_JOIN(select);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final data.Table table) {
          super.NATURAL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.NATURAL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final data.Table table) {
          super.LEFT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.LEFT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final data.Table table) {
          super.RIGHT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.RIGHT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final data.Table table) {
          super.FULL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.FULL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT JOIN(final data.Table table) {
          super.JOIN(table);
          return this;
        }

        @Override
        public final SELECT JOIN(final keyword.Select.untyped.SELECT select) {
          super.JOIN(select);
          return this;
        }

        @Override
        public final SELECT ON(final Condition on) {
          super.ON(on);
          return this;
        }

        @Override
        public final SELECT GROUP_BY(final data.Entity ... groupBy) {
          super.GROUP_BY(groupBy);
          return this;
        }

        @Override
        public final SELECT HAVING(final Condition having) {
          super.HAVING(having);
          return this;
        }

        @Override
        public final SELECT UNION(final keyword.Select.FLOAT.SELECT select) {
          super.UNION(select);
          return this;
        }

        @Override
        public final SELECT UNION_ALL(final keyword.Select.FLOAT.SELECT select) {
          super.UNION_ALL(select);
          return this;
        }

        @Override
        public final SELECT ORDER_BY(final data.Column ... columns) {
          super.ORDER_BY(columns);
          return this;
        }

        @Override
        public final SELECT LIMIT(final int rows) {
          super.LIMIT(rows);
          return this;
        }

        @Override
        public final SELECT OFFSET(final int rows) {
          super.OFFSET(rows);
          return this;
        }

        @Override
        public final SELECT FOR_SHARE(final data.Entity ... subjects) {
          super.FOR_SHARE(subjects);
          return this;
        }

        @Override
        public final SELECT FOR_UPDATE(final data.Entity ... subjects) {
          super.FOR_UPDATE(subjects);
          return this;
        }

        @Override
        public final SELECT NOWAIT() {
          super.NOWAIT();
          return this;
        }

        @Override
        public final SELECT SKIP_LOCKED() {
          super.SKIP_LOCKED();
          return this;
        }

        @Override
        public final SELECT WHERE(final Condition where) {
          super.WHERE(where);
          return this;
        }
      }
    }

    public static class INT {
      static class SELECT extends untyped.SELECT implements keyword.Select.INT._SELECT, keyword.Select.INT.FROM, keyword.Select.INT.GROUP_BY, keyword.Select.INT.HAVING, keyword.Select.INT.UNION, keyword.Select.INT.JOIN, keyword.Select.INT.ADV_JOIN, keyword.Select.INT.ON, keyword.Select.INT.ORDER_BY, keyword.Select.INT.LIMIT, keyword.Select.INT.OFFSET, keyword.Select.INT.FOR, keyword.Select.INT.NOWAIT, keyword.Select.INT.SKIP_LOCKED, keyword.Select.INT.WHERE {
        SELECT(final boolean distinct, final type.Entity[] entities) {
          super(distinct, entities);
        }

        @Override
        public D AS(final D as) {
          ((data.Entity)as).wrap(new As(this, as, true));
          return as;
        }

        @Override
        public final SELECT FROM(final data.Table ... from) {
          super.FROM(from);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final data.Table table) {
          super.CROSS_JOIN(table);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final keyword.Select.untyped.SELECT select) {
          super.CROSS_JOIN(select);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final data.Table table) {
          super.NATURAL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.NATURAL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final data.Table table) {
          super.LEFT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.LEFT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final data.Table table) {
          super.RIGHT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.RIGHT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final data.Table table) {
          super.FULL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.FULL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT JOIN(final data.Table table) {
          super.JOIN(table);
          return this;
        }

        @Override
        public final SELECT JOIN(final keyword.Select.untyped.SELECT select) {
          super.JOIN(select);
          return this;
        }

        @Override
        public final SELECT ON(final Condition on) {
          super.ON(on);
          return this;
        }

        @Override
        public final SELECT GROUP_BY(final data.Entity ... groupBy) {
          super.GROUP_BY(groupBy);
          return this;
        }

        @Override
        public final SELECT HAVING(final Condition having) {
          super.HAVING(having);
          return this;
        }

        @Override
        public final SELECT UNION(final keyword.Select.INT.SELECT select) {
          super.UNION(select);
          return this;
        }

        @Override
        public final SELECT UNION_ALL(final keyword.Select.INT.SELECT select) {
          super.UNION_ALL(select);
          return this;
        }

        @Override
        public final SELECT ORDER_BY(final data.Column ... columns) {
          super.ORDER_BY(columns);
          return this;
        }

        @Override
        public final SELECT LIMIT(final int rows) {
          super.LIMIT(rows);
          return this;
        }

        @Override
        public final SELECT OFFSET(final int rows) {
          super.OFFSET(rows);
          return this;
        }

        @Override
        public final SELECT FOR_SHARE(final data.Entity ... subjects) {
          super.FOR_SHARE(subjects);
          return this;
        }

        @Override
        public final SELECT FOR_UPDATE(final data.Entity ... subjects) {
          super.FOR_UPDATE(subjects);
          return this;
        }

        @Override
        public final SELECT NOWAIT() {
          super.NOWAIT();
          return this;
        }

        @Override
        public final SELECT SKIP_LOCKED() {
          super.SKIP_LOCKED();
          return this;
        }

        @Override
        public final SELECT WHERE(final Condition where) {
          super.WHERE(where);
          return this;
        }
      }
    }

    public static class LargeObject {
      static class SELECT extends untyped.SELECT implements keyword.Select.LargeObject._SELECT, keyword.Select.LargeObject.FROM, keyword.Select.LargeObject.GROUP_BY, keyword.Select.LargeObject.HAVING, keyword.Select.LargeObject.UNION, keyword.Select.LargeObject.JOIN, keyword.Select.LargeObject.ADV_JOIN, keyword.Select.LargeObject.ON, keyword.Select.LargeObject.ORDER_BY, keyword.Select.LargeObject.LIMIT, keyword.Select.LargeObject.OFFSET, keyword.Select.LargeObject.FOR, keyword.Select.LargeObject.NOWAIT, keyword.Select.LargeObject.SKIP_LOCKED, keyword.Select.LargeObject.WHERE {
        SELECT(final boolean distinct, final type.Entity[] entities) {
          super(distinct, entities);
        }

        @Override
        public D AS(final D as) {
          ((data.Entity)as).wrap(new As(this, as, true));
          return as;
        }

        @Override
        public final SELECT FROM(final data.Table ... from) {
          super.FROM(from);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final data.Table table) {
          super.CROSS_JOIN(table);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final keyword.Select.untyped.SELECT select) {
          super.CROSS_JOIN(select);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final data.Table table) {
          super.NATURAL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.NATURAL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final data.Table table) {
          super.LEFT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.LEFT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final data.Table table) {
          super.RIGHT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.RIGHT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final data.Table table) {
          super.FULL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.FULL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT JOIN(final data.Table table) {
          super.JOIN(table);
          return this;
        }

        @Override
        public final SELECT JOIN(final keyword.Select.untyped.SELECT select) {
          super.JOIN(select);
          return this;
        }

        @Override
        public final SELECT ON(final Condition on) {
          super.ON(on);
          return this;
        }

        @Override
        public final SELECT GROUP_BY(final data.Entity ... groupBy) {
          super.GROUP_BY(groupBy);
          return this;
        }

        @Override
        public final SELECT HAVING(final Condition having) {
          super.HAVING(having);
          return this;
        }

        @Override
        public final SELECT UNION(final keyword.Select.LargeObject.SELECT select) {
          super.UNION(select);
          return this;
        }

        @Override
        public final SELECT UNION_ALL(final keyword.Select.LargeObject.SELECT select) {
          super.UNION_ALL(select);
          return this;
        }

        @Override
        public final SELECT ORDER_BY(final data.Column ... columns) {
          super.ORDER_BY(columns);
          return this;
        }

        @Override
        public final SELECT LIMIT(final int rows) {
          super.LIMIT(rows);
          return this;
        }

        @Override
        public final SELECT OFFSET(final int rows) {
          super.OFFSET(rows);
          return this;
        }

        @Override
        public final SELECT FOR_SHARE(final data.Entity ... subjects) {
          super.FOR_SHARE(subjects);
          return this;
        }

        @Override
        public final SELECT FOR_UPDATE(final data.Entity ... subjects) {
          super.FOR_UPDATE(subjects);
          return this;
        }

        @Override
        public final SELECT NOWAIT() {
          super.NOWAIT();
          return this;
        }

        @Override
        public final SELECT SKIP_LOCKED() {
          super.SKIP_LOCKED();
          return this;
        }

        @Override
        public final SELECT WHERE(final Condition where) {
          super.WHERE(where);
          return this;
        }
      }
    }

    public static class Numeric {
      static class SELECT extends untyped.SELECT implements keyword.Select.Numeric._SELECT, keyword.Select.Numeric.FROM, keyword.Select.Numeric.GROUP_BY, keyword.Select.Numeric.HAVING, keyword.Select.Numeric.UNION, keyword.Select.Numeric.JOIN, keyword.Select.Numeric.ADV_JOIN, keyword.Select.Numeric.ON, keyword.Select.Numeric.ORDER_BY, keyword.Select.Numeric.LIMIT, keyword.Select.Numeric.OFFSET, keyword.Select.Numeric.FOR, keyword.Select.Numeric.NOWAIT, keyword.Select.Numeric.SKIP_LOCKED, keyword.Select.Numeric.WHERE {
        SELECT(final boolean distinct, final type.Entity[] entities) {
          super(distinct, entities);
        }

        @Override
        public D AS(final D as) {
          ((data.Entity)as).wrap(new As(this, as, true));
          return as;
        }

        @Override
        public final SELECT FROM(final data.Table ... from) {
          super.FROM(from);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final data.Table table) {
          super.CROSS_JOIN(table);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final keyword.Select.untyped.SELECT select) {
          super.CROSS_JOIN(select);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final data.Table table) {
          super.NATURAL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.NATURAL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final data.Table table) {
          super.LEFT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.LEFT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final data.Table table) {
          super.RIGHT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.RIGHT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final data.Table table) {
          super.FULL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.FULL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT JOIN(final data.Table table) {
          super.JOIN(table);
          return this;
        }

        @Override
        public final SELECT JOIN(final keyword.Select.untyped.SELECT select) {
          super.JOIN(select);
          return this;
        }

        @Override
        public final SELECT ON(final Condition on) {
          super.ON(on);
          return this;
        }

        @Override
        public final SELECT GROUP_BY(final data.Entity ... groupBy) {
          super.GROUP_BY(groupBy);
          return this;
        }

        @Override
        public final SELECT HAVING(final Condition having) {
          super.HAVING(having);
          return this;
        }

        @Override
        public final SELECT UNION(final keyword.Select.Numeric.SELECT select) {
          super.UNION(select);
          return this;
        }

        @Override
        public final SELECT UNION_ALL(final keyword.Select.Numeric.SELECT select) {
          super.UNION_ALL(select);
          return this;
        }

        @Override
        public final SELECT ORDER_BY(final data.Column ... columns) {
          super.ORDER_BY(columns);
          return this;
        }

        @Override
        public final SELECT LIMIT(final int rows) {
          super.LIMIT(rows);
          return this;
        }

        @Override
        public final SELECT OFFSET(final int rows) {
          super.OFFSET(rows);
          return this;
        }

        @Override
        public final SELECT FOR_SHARE(final data.Entity ... subjects) {
          super.FOR_SHARE(subjects);
          return this;
        }

        @Override
        public final SELECT FOR_UPDATE(final data.Entity ... subjects) {
          super.FOR_UPDATE(subjects);
          return this;
        }

        @Override
        public final SELECT NOWAIT() {
          super.NOWAIT();
          return this;
        }

        @Override
        public final SELECT SKIP_LOCKED() {
          super.SKIP_LOCKED();
          return this;
        }

        @Override
        public final SELECT WHERE(final Condition where) {
          super.WHERE(where);
          return this;
        }
      }
    }

    public static class SMALLINT {
      static class SELECT extends untyped.SELECT implements keyword.Select.SMALLINT._SELECT, keyword.Select.SMALLINT.FROM, keyword.Select.SMALLINT.GROUP_BY, keyword.Select.SMALLINT.HAVING, keyword.Select.SMALLINT.UNION, keyword.Select.SMALLINT.JOIN, keyword.Select.SMALLINT.ADV_JOIN, keyword.Select.SMALLINT.ON, keyword.Select.SMALLINT.ORDER_BY, keyword.Select.SMALLINT.LIMIT, keyword.Select.SMALLINT.OFFSET, keyword.Select.SMALLINT.FOR, keyword.Select.SMALLINT.NOWAIT, keyword.Select.SMALLINT.SKIP_LOCKED, keyword.Select.SMALLINT.WHERE {
        SELECT(final boolean distinct, final type.Entity[] entities) {
          super(distinct, entities);
        }

        @Override
        public D AS(final D as) {
          ((data.Entity)as).wrap(new As(this, as, true));
          return as;
        }

        @Override
        public final SELECT FROM(final data.Table ... from) {
          super.FROM(from);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final data.Table table) {
          super.CROSS_JOIN(table);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final keyword.Select.untyped.SELECT select) {
          super.CROSS_JOIN(select);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final data.Table table) {
          super.NATURAL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.NATURAL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final data.Table table) {
          super.LEFT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.LEFT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final data.Table table) {
          super.RIGHT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.RIGHT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final data.Table table) {
          super.FULL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.FULL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT JOIN(final data.Table table) {
          super.JOIN(table);
          return this;
        }

        @Override
        public final SELECT JOIN(final keyword.Select.untyped.SELECT select) {
          super.JOIN(select);
          return this;
        }

        @Override
        public final SELECT ON(final Condition on) {
          super.ON(on);
          return this;
        }

        @Override
        public final SELECT GROUP_BY(final data.Entity ... groupBy) {
          super.GROUP_BY(groupBy);
          return this;
        }

        @Override
        public final SELECT HAVING(final Condition having) {
          super.HAVING(having);
          return this;
        }

        @Override
        public final SELECT UNION(final keyword.Select.SMALLINT.SELECT select) {
          super.UNION(select);
          return this;
        }

        @Override
        public final SELECT UNION_ALL(final keyword.Select.SMALLINT.SELECT select) {
          super.UNION_ALL(select);
          return this;
        }

        @Override
        public final SELECT ORDER_BY(final data.Column ... columns) {
          super.ORDER_BY(columns);
          return this;
        }

        @Override
        public final SELECT LIMIT(final int rows) {
          super.LIMIT(rows);
          return this;
        }

        @Override
        public final SELECT OFFSET(final int rows) {
          super.OFFSET(rows);
          return this;
        }

        @Override
        public final SELECT FOR_SHARE(final data.Entity ... subjects) {
          super.FOR_SHARE(subjects);
          return this;
        }

        @Override
        public final SELECT FOR_UPDATE(final data.Entity ... subjects) {
          super.FOR_UPDATE(subjects);
          return this;
        }

        @Override
        public final SELECT NOWAIT() {
          super.NOWAIT();
          return this;
        }

        @Override
        public final SELECT SKIP_LOCKED() {
          super.SKIP_LOCKED();
          return this;
        }

        @Override
        public final SELECT WHERE(final Condition where) {
          super.WHERE(where);
          return this;
        }
      }
    }

    public static class Temporal {
      static class SELECT extends untyped.SELECT implements keyword.Select.Temporal._SELECT, keyword.Select.Temporal.FROM, keyword.Select.Temporal.GROUP_BY, keyword.Select.Temporal.HAVING, keyword.Select.Temporal.UNION, keyword.Select.Temporal.JOIN, keyword.Select.Temporal.ADV_JOIN, keyword.Select.Temporal.ON, keyword.Select.Temporal.ORDER_BY, keyword.Select.Temporal.LIMIT, keyword.Select.Temporal.OFFSET, keyword.Select.Temporal.FOR, keyword.Select.Temporal.NOWAIT, keyword.Select.Temporal.SKIP_LOCKED, keyword.Select.Temporal.WHERE {
        SELECT(final boolean distinct, final type.Entity[] entities) {
          super(distinct, entities);
        }

        @Override
        public D AS(final D as) {
          ((data.Entity)as).wrap(new As(this, as, true));
          return as;
        }

        @Override
        public final SELECT FROM(final data.Table ... from) {
          super.FROM(from);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final data.Table table) {
          super.CROSS_JOIN(table);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final keyword.Select.untyped.SELECT select) {
          super.CROSS_JOIN(select);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final data.Table table) {
          super.NATURAL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.NATURAL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final data.Table table) {
          super.LEFT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.LEFT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final data.Table table) {
          super.RIGHT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.RIGHT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final data.Table table) {
          super.FULL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.FULL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT JOIN(final data.Table table) {
          super.JOIN(table);
          return this;
        }

        @Override
        public final SELECT JOIN(final keyword.Select.untyped.SELECT select) {
          super.JOIN(select);
          return this;
        }

        @Override
        public final SELECT ON(final Condition on) {
          super.ON(on);
          return this;
        }

        @Override
        public final SELECT GROUP_BY(final data.Entity ... groupBy) {
          super.GROUP_BY(groupBy);
          return this;
        }

        @Override
        public final SELECT HAVING(final Condition having) {
          super.HAVING(having);
          return this;
        }

        @Override
        public final SELECT UNION(final keyword.Select.Temporal.SELECT select) {
          super.UNION(select);
          return this;
        }

        @Override
        public final SELECT UNION_ALL(final keyword.Select.Temporal.SELECT select) {
          super.UNION_ALL(select);
          return this;
        }

        @Override
        public final SELECT ORDER_BY(final data.Column ... columns) {
          super.ORDER_BY(columns);
          return this;
        }

        @Override
        public final SELECT LIMIT(final int rows) {
          super.LIMIT(rows);
          return this;
        }

        @Override
        public final SELECT OFFSET(final int rows) {
          super.OFFSET(rows);
          return this;
        }

        @Override
        public final SELECT FOR_SHARE(final data.Entity ... subjects) {
          super.FOR_SHARE(subjects);
          return this;
        }

        @Override
        public final SELECT FOR_UPDATE(final data.Entity ... subjects) {
          super.FOR_UPDATE(subjects);
          return this;
        }

        @Override
        public final SELECT NOWAIT() {
          super.NOWAIT();
          return this;
        }

        @Override
        public final SELECT SKIP_LOCKED() {
          super.SKIP_LOCKED();
          return this;
        }

        @Override
        public final SELECT WHERE(final Condition where) {
          super.WHERE(where);
          return this;
        }
      }
    }

    public static class Textual {
      static class SELECT extends untyped.SELECT implements keyword.Select.Textual._SELECT, keyword.Select.Textual.FROM, keyword.Select.Textual.GROUP_BY, keyword.Select.Textual.HAVING, keyword.Select.Textual.UNION, keyword.Select.Textual.JOIN, keyword.Select.Textual.ADV_JOIN, keyword.Select.Textual.ON, keyword.Select.Textual.ORDER_BY, keyword.Select.Textual.LIMIT, keyword.Select.Textual.OFFSET, keyword.Select.Textual.FOR, keyword.Select.Textual.NOWAIT, keyword.Select.Textual.SKIP_LOCKED, keyword.Select.Textual.WHERE {
        SELECT(final boolean distinct, final type.Entity[] entities) {
          super(distinct, entities);
        }

        @Override
        public D AS(final D as) {
          ((data.Entity)as).wrap(new As(this, as, true));
          return as;
        }

        @Override
        public final SELECT FROM(final data.Table ... from) {
          super.FROM(from);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final data.Table table) {
          super.CROSS_JOIN(table);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final keyword.Select.untyped.SELECT select) {
          super.CROSS_JOIN(select);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final data.Table table) {
          super.NATURAL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.NATURAL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final data.Table table) {
          super.LEFT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.LEFT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final data.Table table) {
          super.RIGHT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.RIGHT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final data.Table table) {
          super.FULL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.FULL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT JOIN(final data.Table table) {
          super.JOIN(table);
          return this;
        }

        @Override
        public final SELECT JOIN(final keyword.Select.untyped.SELECT select) {
          super.JOIN(select);
          return this;
        }

        @Override
        public final SELECT ON(final Condition on) {
          super.ON(on);
          return this;
        }

        @Override
        public final SELECT GROUP_BY(final data.Entity ... groupBy) {
          super.GROUP_BY(groupBy);
          return this;
        }

        @Override
        public final SELECT HAVING(final Condition having) {
          super.HAVING(having);
          return this;
        }

        @Override
        public final SELECT UNION(final keyword.Select.Textual.SELECT select) {
          super.UNION(select);
          return this;
        }

        @Override
        public final SELECT UNION_ALL(final keyword.Select.Textual.SELECT select) {
          super.UNION_ALL(select);
          return this;
        }

        @Override
        public final SELECT ORDER_BY(final data.Column ... columns) {
          super.ORDER_BY(columns);
          return this;
        }

        @Override
        public final SELECT LIMIT(final int rows) {
          super.LIMIT(rows);
          return this;
        }

        @Override
        public final SELECT OFFSET(final int rows) {
          super.OFFSET(rows);
          return this;
        }

        @Override
        public final SELECT FOR_SHARE(final data.Entity ... subjects) {
          super.FOR_SHARE(subjects);
          return this;
        }

        @Override
        public final SELECT FOR_UPDATE(final data.Entity ... subjects) {
          super.FOR_UPDATE(subjects);
          return this;
        }

        @Override
        public final SELECT NOWAIT() {
          super.NOWAIT();
          return this;
        }

        @Override
        public final SELECT SKIP_LOCKED() {
          super.SKIP_LOCKED();
          return this;
        }

        @Override
        public final SELECT WHERE(final Condition where) {
          super.WHERE(where);
          return this;
        }
      }
    }

    public static class TIME {
      static class SELECT extends untyped.SELECT implements keyword.Select.TIME._SELECT, keyword.Select.TIME.FROM, keyword.Select.TIME.GROUP_BY, keyword.Select.TIME.HAVING, keyword.Select.TIME.UNION, keyword.Select.TIME.JOIN, keyword.Select.TIME.ADV_JOIN, keyword.Select.TIME.ON, keyword.Select.TIME.ORDER_BY, keyword.Select.TIME.LIMIT, keyword.Select.TIME.OFFSET, keyword.Select.TIME.FOR, keyword.Select.TIME.NOWAIT, keyword.Select.TIME.SKIP_LOCKED, keyword.Select.TIME.WHERE {
        SELECT(final boolean distinct, final type.Entity[] entities) {
          super(distinct, entities);
        }

        @Override
        public D AS(final D as) {
          ((data.Entity)as).wrap(new As(this, as, true));
          return as;
        }

        @Override
        public final SELECT FROM(final data.Table ... from) {
          super.FROM(from);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final data.Table table) {
          super.CROSS_JOIN(table);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final keyword.Select.untyped.SELECT select) {
          super.CROSS_JOIN(select);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final data.Table table) {
          super.NATURAL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.NATURAL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final data.Table table) {
          super.LEFT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.LEFT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final data.Table table) {
          super.RIGHT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.RIGHT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final data.Table table) {
          super.FULL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.FULL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT JOIN(final data.Table table) {
          super.JOIN(table);
          return this;
        }

        @Override
        public final SELECT JOIN(final keyword.Select.untyped.SELECT select) {
          super.JOIN(select);
          return this;
        }

        @Override
        public final SELECT ON(final Condition on) {
          super.ON(on);
          return this;
        }

        @Override
        public final SELECT GROUP_BY(final data.Entity ... groupBy) {
          super.GROUP_BY(groupBy);
          return this;
        }

        @Override
        public final SELECT HAVING(final Condition having) {
          super.HAVING(having);
          return this;
        }

        @Override
        public final SELECT UNION(final keyword.Select.TIME.SELECT select) {
          super.UNION(select);
          return this;
        }

        @Override
        public final SELECT UNION_ALL(final keyword.Select.TIME.SELECT select) {
          super.UNION_ALL(select);
          return this;
        }

        @Override
        public final SELECT ORDER_BY(final data.Column ... columns) {
          super.ORDER_BY(columns);
          return this;
        }

        @Override
        public final SELECT LIMIT(final int rows) {
          super.LIMIT(rows);
          return this;
        }

        @Override
        public final SELECT OFFSET(final int rows) {
          super.OFFSET(rows);
          return this;
        }

        @Override
        public final SELECT FOR_SHARE(final data.Entity ... subjects) {
          super.FOR_SHARE(subjects);
          return this;
        }

        @Override
        public final SELECT FOR_UPDATE(final data.Entity ... subjects) {
          super.FOR_UPDATE(subjects);
          return this;
        }

        @Override
        public final SELECT NOWAIT() {
          super.NOWAIT();
          return this;
        }

        @Override
        public final SELECT SKIP_LOCKED() {
          super.SKIP_LOCKED();
          return this;
        }

        @Override
        public final SELECT WHERE(final Condition where) {
          super.WHERE(where);
          return this;
        }
      }
    }

    public static class TINYINT {
      static class SELECT extends untyped.SELECT implements keyword.Select.TINYINT._SELECT, keyword.Select.TINYINT.FROM, keyword.Select.TINYINT.GROUP_BY, keyword.Select.TINYINT.HAVING, keyword.Select.TINYINT.UNION, keyword.Select.TINYINT.JOIN, keyword.Select.TINYINT.ADV_JOIN, keyword.Select.TINYINT.ON, keyword.Select.TINYINT.ORDER_BY, keyword.Select.TINYINT.LIMIT, keyword.Select.TINYINT.OFFSET, keyword.Select.TINYINT.FOR, keyword.Select.TINYINT.NOWAIT, keyword.Select.TINYINT.SKIP_LOCKED, keyword.Select.TINYINT.WHERE {
        SELECT(final boolean distinct, final type.Entity[] entities) {
          super(distinct, entities);
        }

        @Override
        public D AS(final D as) {
          ((data.Entity)as).wrap(new As(this, as, true));
          return as;
        }

        @Override
        public final SELECT FROM(final data.Table ... from) {
          super.FROM(from);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final data.Table table) {
          super.CROSS_JOIN(table);
          return this;
        }

        @Override
        public final SELECT CROSS_JOIN(final keyword.Select.untyped.SELECT select) {
          super.CROSS_JOIN(select);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final data.Table table) {
          super.NATURAL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT NATURAL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.NATURAL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final data.Table table) {
          super.LEFT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT LEFT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.LEFT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final data.Table table) {
          super.RIGHT_JOIN(table);
          return this;
        }

        @Override
        public final SELECT RIGHT_JOIN(final keyword.Select.untyped.SELECT select) {
          super.RIGHT_JOIN(select);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final data.Table table) {
          super.FULL_JOIN(table);
          return this;
        }

        @Override
        public final SELECT FULL_JOIN(final keyword.Select.untyped.SELECT select) {
          super.FULL_JOIN(select);
          return this;
        }

        @Override
        public final SELECT JOIN(final data.Table table) {
          super.JOIN(table);
          return this;
        }

        @Override
        public final SELECT JOIN(final keyword.Select.untyped.SELECT select) {
          super.JOIN(select);
          return this;
        }

        @Override
        public final SELECT ON(final Condition on) {
          super.ON(on);
          return this;
        }

        @Override
        public final SELECT GROUP_BY(final data.Entity ... groupBy) {
          super.GROUP_BY(groupBy);
          return this;
        }

        @Override
        public final SELECT HAVING(final Condition having) {
          super.HAVING(having);
          return this;
        }

        @Override
        public final SELECT UNION(final keyword.Select.TINYINT.SELECT select) {
          super.UNION(select);
          return this;
        }

        @Override
        public final SELECT UNION_ALL(final keyword.Select.TINYINT.SELECT select) {
          super.UNION_ALL(select);
          return this;
        }

        @Override
        public final SELECT ORDER_BY(final data.Column ... columns) {
          super.ORDER_BY(columns);
          return this;
        }

        @Override
        public final SELECT LIMIT(final int rows) {
          super.LIMIT(rows);
          return this;
        }

        @Override
        public final SELECT OFFSET(final int rows) {
          super.OFFSET(rows);
          return this;
        }

        @Override
        public final SELECT FOR_SHARE(final data.Entity ... subjects) {
          super.FOR_SHARE(subjects);
          return this;
        }

        @Override
        public final SELECT FOR_UPDATE(final data.Entity ... subjects) {
          super.FOR_UPDATE(subjects);
          return this;
        }

        @Override
        public final SELECT NOWAIT() {
          super.NOWAIT();
          return this;
        }

        @Override
        public final SELECT SKIP_LOCKED() {
          super.SKIP_LOCKED();
          return this;
        }

        @Override
        public final SELECT WHERE(final Condition where) {
          super.WHERE(where);
          return this;
        }
      }
    }

    private Select() {
    }
  }

  static final class CaseImpl implements Case {
    private abstract static class ChainedKeyword extends Keyword {
      final ChainedKeyword root;
      final ChainedKeyword parent;
      ArrayList> whenThen;
      data.Column _else;

      ChainedKeyword(final ChainedKeyword root, final ChainedKeyword parent) {
        this.root = assertNotNull(root);
        this.parent = parent;
      }

      ChainedKeyword() {
        this.root = this;
        this.parent = null;
      }

      @Override
      final data.Table getTable() {
        if (root != this)
          return root.getTable();

        for (int i = 0, i$ = whenThen.size(); i < i$; ++i) { // [RA]
          final data.Column column = whenThen.get(i);
          if (column.getTable() != null)
            return column.getTable();
        }

        return null;
      }

      final void WHEN(final data.Column when) {
        if (parent != null) {
          parent.WHEN(when);
        }
        else {
          if (whenThen == null)
            whenThen = new ArrayList<>();

          whenThen.add(when);
        }
      }

      final void THEN(final data.Column then) {
        if (parent != null)
          parent.THEN(then);
        else
          whenThen.add(then);
      }

      final void ELSE(final data.Column _else) {
        if (parent != null)
          parent.ELSE(_else);
        else
          this._else = _else;
      }

      @Override
      void compile(final Compilation compilation, final boolean isExpression) throws IOException, SQLException {
        if (whenThen != null)
          compilation.compiler.compileWhenThenElse(whenThen, _else, compilation);
      }
    }

    private abstract static class CASE_THEN extends ChainedKeyword {
      CASE_THEN(final ChainedKeyword root, final ChainedKeyword parent) {
        super(root, parent);
      }

      CASE_THEN() {
        super();
      }
    }

    abstract static class CASE extends CASE_THEN {
      CASE() {
        super();
      }

      @Override
      final data.Column getColumn() {
        return null;
      }
    }

    abstract static class WHEN extends ChainedKeyword {
      WHEN(final ChainedKeyword root, final CASE_THEN parent, final data.Column when) {
        super(root, parent);
        WHEN(when);
      }

      WHEN(final data.Column when) {
        super();
        WHEN(when);
      }

      @Override
      final data.Column getColumn() {
        return parent == null ? null : ((CASE_THEN)parent).getColumn();
      }

      @Override
      final void compile(final Compilation compilation, final boolean isExpression) throws IOException, SQLException {
        compilation.compiler.compileWhen((Search.WHEN)this, compilation);
        super.compile(compilation, isExpression);
      }
    }

    private abstract static class THEN_ELSE> extends CASE_THEN {
      final D value;

      THEN_ELSE(final ChainedKeyword root, final ChainedKeyword parent, final D value) {
        super(root, parent);
        this.value = value;
      }

      @Override
      final data.Column getColumn() {
        final data.Column column = parent.getColumn();
        return column != null ? column.scaleTo(value) : value;
      }

      @Override
      final void compile(final Compilation compilation, final boolean isExpression) throws IOException, SQLException {
        root.compile(compilation, isExpression);
      }
    }

    abstract static class THEN> extends THEN_ELSE {
      THEN(final ChainedKeyword root, final WHEN parent, final D then) {
        super(root, parent, then);
        THEN(then);
      }
    }

    abstract static class ELSE> extends THEN_ELSE {
      ELSE(final ChainedKeyword root, final THEN_ELSE parent, final D _else) {
        super(root, parent, _else);
        ELSE(_else);
      }
    }

    static final class Simple implements simple {
      static final class CASE> extends CaseImpl.CASE implements simple.CASE {
        final data.Column variable;

        CASE(final data.Column variable) {
          super();
          this.variable = variable;
        }

        @Override
        public final simple.WHEN WHEN(final T when) {
          return new WHEN(this, data.wrap(when));
        }

        @Override
        void compile(final Compilation compilation, final boolean isExpression) throws IOException, SQLException {
          final Compiler compiler = compilation.compiler;
          compiler.compileCaseElse(variable, _else, compilation);
          super.compile(compilation, isExpression);
        }
      }

      static final class WHEN> extends CaseImpl.WHEN implements simple.WHEN {
        WHEN(final CaseImpl.CASE parent, final data.Column when) {
          super(parent, parent, when);
        }

        @Override
        public final Case.BOOLEAN.simple.THEN THEN(final data.BOOLEAN bool) {
          return new BOOLEAN.Simple.THEN<>(this, bool);
        }

        @Override
        public final Case.FLOAT.simple.THEN THEN(final data.FLOAT numeric) {
          return new FLOAT.Simple.THEN<>(this, numeric);
        }

        @Override
        public final Case.DOUBLE.simple.THEN THEN(final data.DOUBLE numeric) {
          return new DOUBLE.Simple.THEN<>(this, numeric);
        }

        @Override
        public final Case.DECIMAL.simple.THEN THEN(final data.DECIMAL numeric) {
          return new DECIMAL.Simple.THEN<>(this, numeric);
        }

        @Override
        public final Case.TINYINT.simple.THEN THEN(final data.TINYINT numeric) {
          return new TINYINT.Simple.THEN<>(this, numeric);
        }

        @Override
        public final Case.SMALLINT.simple.THEN THEN(final data.SMALLINT numeric) {
          return new SMALLINT.Simple.THEN<>(this, numeric);
        }

        @Override
        public final Case.INT.simple.THEN THEN(final data.INT numeric) {
          return new INT.Simple.THEN<>(this, numeric);
        }

        @Override
        public final Case.BIGINT.simple.THEN THEN(final data.BIGINT numeric) {
          return new BIGINT.Simple.THEN<>(this, numeric);
        }

        @Override
        public final Case.BOOLEAN.simple.THEN THEN(final boolean bool) {
          return new BOOLEAN.Simple.THEN<>(this, data.wrap(bool));
        }

        @Override
        public final Case.FLOAT.simple.THEN THEN(final float numeric) {
          return new FLOAT.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
        }

        @Override
        public final Case.DOUBLE.simple.THEN THEN(final double numeric) {
          return new DOUBLE.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
        }

        @Override
        public final Case.DECIMAL.simple.THEN THEN(final BigDecimal numeric) {
          return new DECIMAL.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
        }

        @Override
        public final Case.TINYINT.simple.THEN THEN(final byte numeric) {
          return new TINYINT.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
        }

        @Override
        public final Case.SMALLINT.simple.THEN THEN(final short numeric) {
          return new SMALLINT.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
        }

        @Override
        public final Case.INT.simple.THEN THEN(final int numeric) {
          return new INT.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
        }

        @Override
        public final Case.BIGINT.simple.THEN THEN(final long numeric) {
          return new BIGINT.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
        }

        @Override
        public final Case.BINARY.simple.THEN THEN(final data.BINARY binary) {
          return new BINARY.Simple.THEN<>(this, binary);
        }

        @Override
        public final Case.DATE.simple.THEN THEN(final data.DATE date) {
          return new DATE.Simple.THEN<>(this, date);
        }

        @Override
        public final Case.TIME.simple.THEN THEN(final data.TIME time) {
          return new TIME.Simple.THEN<>(this, time);
        }

        @Override
        public final Case.DATETIME.simple.THEN THEN(final data.DATETIME dateTime) {
          return new DATETIME.Simple.THEN<>(this, dateTime);
        }

        @Override
        public final Case.CHAR.simple.THEN THEN(final data.CHAR text) {
          return new CHAR.Simple.THEN<>(this, text);
        }

        @Override
        public final Case.ENUM.simple.THEN THEN(final data.ENUM text) {
          return new ENUM.Simple.THEN<>(this, text);
        }

        @Override
        public final Case.BINARY.simple.THEN THEN(final byte[] binary) {
          return new BINARY.Simple.THEN<>(this, data.wrap(binary));
        }

        @Override
        public final Case.DATE.simple.THEN THEN(final LocalDate date) {
          return new DATE.Simple.THEN<>(this, data.wrap(date));
        }

        @Override
        public final Case.TIME.simple.THEN THEN(final LocalTime time) {
          return new TIME.Simple.THEN<>(this, data.wrap(time));
        }

        @Override
        public final Case.DATETIME.simple.THEN THEN(final LocalDateTime dateTime) {
          return new DATETIME.Simple.THEN<>(this, data.wrap(dateTime));
        }

        @Override
        public final Case.CHAR.simple.THEN THEN(final String text) {
          return new CHAR.Simple.THEN<>(this, (data.Textual)data.wrap(text));
        }

        @Override
        public final Case.ENUM.simple.THEN THEN(final EntityEnum text) {
          return new ENUM.Simple.THEN<>(this, (data.ENUM)data.wrap(text));
        }
      }

      private Simple() {
      }
    }

    static final class Search implements search {
      static final class WHEN extends CaseImpl.WHEN implements search.WHEN {
        WHEN(final data.Column when) {
          super(when);
        }

        @Override
        public final Case.BOOLEAN.search.THEN THEN(final data.BOOLEAN bool) {
          return new BOOLEAN.Search.THEN<>(this, bool);
        }

        @Override
        public final Case.FLOAT.search.THEN THEN(final data.FLOAT numeric) {
          return new FLOAT.Search.THEN<>(this, numeric);
        }

        @Override
        public final Case.DOUBLE.search.THEN THEN(final data.DOUBLE numeric) {
          return new DOUBLE.Search.THEN<>(this, numeric);
        }

        @Override
        public final Case.DECIMAL.search.THEN THEN(final data.DECIMAL numeric) {
          return new DECIMAL.Search.THEN<>(this, numeric);
        }

        @Override
        public final Case.TINYINT.search.THEN THEN(final data.TINYINT numeric) {
          return new TINYINT.Search.THEN<>(this, numeric);
        }

        @Override
        public final Case.SMALLINT.search.THEN THEN(final data.SMALLINT numeric) {
          return new SMALLINT.Search.THEN<>(this, numeric);
        }

        @Override
        public final Case.INT.search.THEN THEN(final data.INT numeric) {
          return new INT.Search.THEN<>(this, numeric);
        }

        @Override
        public final Case.BIGINT.search.THEN THEN(final data.BIGINT numeric) {
          return new BIGINT.Search.THEN<>(this, numeric);
        }

        @Override
        public final Case.BOOLEAN.search.THEN THEN(final boolean bool) {
          return new BOOLEAN.Search.THEN<>(this, data.wrap(bool));
        }

        @Override
        public final Case.FLOAT.search.THEN THEN(final float numeric) {
          return new FLOAT.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
        }

        @Override
        public final Case.DOUBLE.search.THEN THEN(final double numeric) {
          return new DOUBLE.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
        }

        @Override
        public final Case.DECIMAL.search.THEN THEN(final BigDecimal numeric) {
          return new DECIMAL.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
        }

        @Override
        public final Case.TINYINT.search.THEN THEN(final byte numeric) {
          return new TINYINT.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
        }

        @Override
        public final Case.SMALLINT.search.THEN THEN(final short numeric) {
          return new SMALLINT.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
        }

        @Override
        public final Case.INT.search.THEN THEN(final int numeric) {
          return new INT.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
        }

        @Override
        public final Case.BIGINT.search.THEN THEN(final long numeric) {
          return new BIGINT.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
        }

        @Override
        public final Case.BINARY.search.THEN THEN(final data.BINARY binary) {
          return new BINARY.Search.THEN<>(this, binary);
        }

        @Override
        public final Case.DATE.search.THEN THEN(final data.DATE date) {
          return new DATE.Search.THEN<>(this, date);
        }

        @Override
        public final Case.TIME.search.THEN THEN(final data.TIME time) {
          return new TIME.Search.THEN<>(this, time);
        }

        @Override
        public final Case.DATETIME.search.THEN THEN(final data.DATETIME dateTime) {
          return new DATETIME.Search.THEN<>(this, dateTime);
        }

        @Override
        public final Case.CHAR.search.THEN THEN(final data.CHAR text) {
          return new CHAR.Search.THEN<>(this, text);
        }

        @Override
        public final Case.ENUM.search.THEN THEN(final data.ENUM text) {
          return new ENUM.Search.THEN<>(this, text);
        }

        @Override
        public final Case.BINARY.search.THEN THEN(final byte[] binary) {
          return new BINARY.Search.THEN<>(this, data.wrap(binary));
        }

        @Override
        public final Case.DATE.search.THEN THEN(final LocalDate date) {
          return new DATE.Search.THEN<>(this, data.wrap(date));
        }

        @Override
        public final Case.TIME.search.THEN THEN(final LocalTime time) {
          return new TIME.Search.THEN<>(this, data.wrap(time));
        }

        @Override
        public final Case.DATETIME.search.THEN THEN(final LocalDateTime dateTime) {
          return new DATETIME.Search.THEN<>(this, data.wrap(dateTime));
        }

        @Override
        public final Case.CHAR.search.THEN THEN(final String text) {
          return new CHAR.Search.THEN<>(this, (data.Textual)data.wrap(text));
        }

        @Override
        public final Case.ENUM.search.THEN THEN(final EntityEnum text) {
          return new ENUM.Search.THEN<>(this, (data.ENUM)data.wrap(text));
        }
      }

      private Search() {
      }
    }

    static final class BOOLEAN {
      static final class Simple implements Case.BOOLEAN.simple {
        static final class WHEN extends CaseImpl.WHEN implements Case.BOOLEAN.simple.WHEN {
          WHEN(final CaseImpl.CASE_THEN parent, final data.Column when) {
            super(parent, parent, when);
          }

          @Override
          public final Case.BOOLEAN.simple.THEN THEN(final data.BOOLEAN bool) {
            return new BOOLEAN.Simple.THEN<>(this, bool);
          }

          @Override
          public final Case.BOOLEAN.simple.THEN THEN(final boolean bool) {
            return new BOOLEAN.Simple.THEN<>(this, data.wrap(bool));
          }
        }

        static final class THEN extends CaseImpl.THEN implements Case.BOOLEAN.simple.THEN {
          THEN(final CaseImpl.WHEN parent, final data.BOOLEAN value) {
            super(parent.root, parent, value);
          }

          @Override
          public final Case.BOOLEAN.ELSE ELSE(final data.BOOLEAN bool) {
            return new BOOLEAN.ELSE(this, bool);
          }

          @Override
          public final Case.BOOLEAN.ELSE ELSE(final boolean bool) {
            return new BOOLEAN.ELSE(this, data.wrap(bool));
          }

          @Override
          @SuppressWarnings("unchecked")
          public final Case.BOOLEAN.simple.WHEN WHEN(final boolean condition) {
            return new BOOLEAN.Simple.WHEN<>(this, (data.Column)data.wrap(condition));
          }
        }
      }

      static final class Search implements Case.BOOLEAN.search {
        static final class WHEN extends CaseImpl.WHEN implements Case.BOOLEAN.search.CASE, Case.BOOLEAN.search.WHEN {
          WHEN(final CaseImpl.CASE_THEN parent, final data.Column when) {
            super(parent, parent, when);
          }

          @Override
          public final Case.BOOLEAN.search.THEN THEN(final data.BOOLEAN bool) {
            return new BOOLEAN.Search.THEN<>(this, bool);
          }

          @Override
          public final Case.BOOLEAN.search.THEN THEN(final boolean bool) {
            return new BOOLEAN.Search.THEN<>(this, data.wrap(bool));
          }
        }

        static final class THEN extends CaseImpl.THEN implements Case.BOOLEAN.search.THEN {
          THEN(final CaseImpl.WHEN parent, final data.BOOLEAN value) {
            super(parent.root, parent, value);
          }

          @Override
          public final Case.BOOLEAN.ELSE ELSE(final data.BOOLEAN bool) {
            return new BOOLEAN.ELSE(this, bool);
          }

          @Override
          public final Case.BOOLEAN.ELSE ELSE(final boolean bool) {
            return new BOOLEAN.ELSE(this, data.wrap(bool));
          }

          @Override
          public final Case.BOOLEAN.search.WHEN WHEN(final Condition condition) {
            return new BOOLEAN.Search.WHEN<>(this, condition);
          }
        }
      }

      static final class ELSE extends CaseImpl.ELSE implements Case.BOOLEAN.ELSE {
        ELSE(final THEN_ELSE parent, final data.BOOLEAN value) {
          super(parent.root, parent, value);
        }

        @Override
        public final data.BOOLEAN END() {
          return new data.BOOLEAN().wrap(this);
        }
      }
    }

    static final class FLOAT {
      static final class Simple implements Case.FLOAT.simple {
        static final class WHEN extends CaseImpl.WHEN implements Case.FLOAT.simple.WHEN {
          WHEN(final CaseImpl.CASE_THEN parent, final data.Column when) {
            super(parent, parent, when);
          }

          @Override
          public Case.FLOAT.simple.THEN THEN(final data.FLOAT numeric) {
            return new FLOAT.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.DOUBLE.simple.THEN THEN(final data.DOUBLE numeric) {
            return new DOUBLE.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.DECIMAL.simple.THEN THEN(final data.DECIMAL numeric) {
            return new DECIMAL.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.FLOAT.simple.THEN THEN(final data.TINYINT numeric) {
            return new FLOAT.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.DOUBLE.simple.THEN THEN(final data.SMALLINT numeric) {
            return new DOUBLE.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.DOUBLE.simple.THEN THEN(final data.INT numeric) {
            return new DOUBLE.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.DOUBLE.simple.THEN THEN(final data.BIGINT numeric) {
            return new DOUBLE.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.FLOAT.simple.THEN THEN(final float numeric) {
            return new FLOAT.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.simple.THEN THEN(final double numeric) {
            return new DOUBLE.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.simple.THEN THEN(final BigDecimal numeric) {
            return new DECIMAL.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.FLOAT.simple.THEN THEN(final byte numeric) {
            return new FLOAT.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.simple.THEN THEN(final short numeric) {
            return new DOUBLE.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.simple.THEN THEN(final int numeric) {
            return new DOUBLE.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.simple.THEN THEN(final long numeric) {
            return new DOUBLE.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }
        }

        static final class THEN extends CaseImpl.THEN> implements Case.FLOAT.simple.THEN {
          THEN(final CaseImpl.WHEN parent, final data.Numeric value) {
            super(parent.root, parent, value);
          }

          @Override
          public Case.FLOAT.ELSE ELSE(final data.FLOAT numeric) {
            return new FLOAT.ELSE(this, numeric);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final data.DOUBLE numeric) {
            return new DOUBLE.ELSE(this, numeric);
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final data.DECIMAL numeric) {
            return new DECIMAL.ELSE(this, numeric);
          }

          @Override
          public Case.FLOAT.ELSE ELSE(final data.TINYINT numeric) {
            return new FLOAT.ELSE(this, numeric);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final data.SMALLINT numeric) {
            return new DOUBLE.ELSE(this, numeric);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final data.INT numeric) {
            return new DOUBLE.ELSE(this, numeric);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final data.BIGINT numeric) {
            return new DOUBLE.ELSE(this, numeric);
          }

          @Override
          public Case.FLOAT.ELSE ELSE(final float numeric) {
            return new FLOAT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final double numeric) {
            return new DOUBLE.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final BigDecimal numeric) {
            return new DECIMAL.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.FLOAT.ELSE ELSE(final byte numeric) {
            return new FLOAT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final short numeric) {
            return new DOUBLE.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final int numeric) {
            return new DOUBLE.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final long numeric) {
            return new DOUBLE.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public final Case.FLOAT.simple.WHEN WHEN(final T condition) {
            return new FLOAT.Simple.WHEN<>(this, data.wrap(condition));
          }
        }
      }

      static final class Search implements Case.FLOAT.search {
        static final class WHEN extends CaseImpl.WHEN implements Case.FLOAT.search.WHEN {
          WHEN(final CaseImpl.CASE_THEN parent, final data.Column when) {
            super(parent, parent, when);
          }

          @Override
          public final Case.FLOAT.search.THEN THEN(final data.FLOAT numeric) {
            return new FLOAT.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.DOUBLE.search.THEN THEN(final data.DOUBLE numeric) {
            return new DOUBLE.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.DECIMAL.search.THEN THEN(final data.DECIMAL numeric) {
            return new DECIMAL.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.FLOAT.search.THEN THEN(final data.TINYINT numeric) {
            return new FLOAT.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.DOUBLE.search.THEN THEN(final data.SMALLINT numeric) {
            return new DOUBLE.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.DOUBLE.search.THEN THEN(final data.INT numeric) {
            return new DOUBLE.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.DOUBLE.search.THEN THEN(final data.BIGINT numeric) {
            return new DOUBLE.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.FLOAT.search.THEN THEN(final float numeric) {
            return new FLOAT.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.search.THEN THEN(final double numeric) {
            return new DOUBLE.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.search.THEN THEN(final BigDecimal numeric) {
            return new DECIMAL.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.FLOAT.search.THEN THEN(final byte numeric) {
            return new FLOAT.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.search.THEN THEN(final short numeric) {
            return new DOUBLE.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.search.THEN THEN(final int numeric) {
            return new DOUBLE.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.search.THEN THEN(final long numeric) {
            return new DOUBLE.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }
        }

        static final class THEN extends CaseImpl.THEN> implements Case.FLOAT.search.THEN {
          THEN(final CaseImpl.WHEN parent, final data.Numeric value) {
            super(parent.root, parent, value);
          }

          @Override
          public final Case.FLOAT.ELSE ELSE(final data.FLOAT numeric) {
            return new FLOAT.ELSE(this, numeric);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final data.DOUBLE numeric) {
            return new DOUBLE.ELSE(this, numeric);
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final data.DECIMAL numeric) {
            return new DECIMAL.ELSE(this, numeric);
          }

          @Override
          public Case.FLOAT.ELSE ELSE(final data.TINYINT numeric) {
            return new FLOAT.ELSE(this, numeric);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final data.SMALLINT numeric) {
            return new DOUBLE.ELSE(this, numeric);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final data.INT numeric) {
            return new DOUBLE.ELSE(this, numeric);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final data.BIGINT numeric) {
            return new DOUBLE.ELSE(this, numeric);
          }

          @Override
          public Case.FLOAT.ELSE ELSE(final float numeric) {
            return new FLOAT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final double numeric) {
            return new DOUBLE.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final BigDecimal numeric) {
            return new DECIMAL.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.FLOAT.ELSE ELSE(final byte numeric) {
            return new FLOAT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final short numeric) {
            return new DOUBLE.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final int numeric) {
            return new DOUBLE.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final long numeric) {
            return new DOUBLE.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public final Case.FLOAT.search.WHEN WHEN(final Condition condition) {
            return new FLOAT.Search.WHEN<>(this, condition);
          }
        }
      }

      static final class ELSE extends CaseImpl.ELSE> implements Case.FLOAT.ELSE {
        ELSE(final THEN_ELSE parent, final data.Numeric value) {
          super(parent.root, parent, value);
        }

        @Override
        public final data.FLOAT END() {
          return new data.FLOAT().wrap(this);
        }
      }
    }

    static final class DOUBLE {
      static final class Simple implements Case.DOUBLE.simple {
        static final class WHEN extends CaseImpl.WHEN implements Case.DOUBLE.simple.WHEN {
          WHEN(final CaseImpl.CASE_THEN parent, final data.Column when) {
            super(parent, parent, when);
          }

          @Override
          public Case.DOUBLE.simple.THEN THEN(final data.FLOAT numeric) {
            return new DOUBLE.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.DOUBLE.simple.THEN THEN(final data.DOUBLE numeric) {
            return new DOUBLE.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.DECIMAL.simple.THEN THEN(final data.DECIMAL numeric) {
            return new DECIMAL.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.DOUBLE.simple.THEN THEN(final data.TINYINT numeric) {
            return new DOUBLE.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.DOUBLE.simple.THEN THEN(final data.SMALLINT numeric) {
            return new DOUBLE.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.DOUBLE.simple.THEN THEN(final data.INT numeric) {
            return new DOUBLE.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.DOUBLE.simple.THEN THEN(final data.BIGINT numeric) {
            return new DOUBLE.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.DOUBLE.simple.THEN THEN(final float numeric) {
            return new DOUBLE.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.simple.THEN THEN(final double numeric) {
            return new DOUBLE.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.simple.THEN THEN(final BigDecimal numeric) {
            return new DECIMAL.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.simple.THEN THEN(final byte numeric) {
            return new DOUBLE.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.simple.THEN THEN(final short numeric) {
            return new DOUBLE.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.simple.THEN THEN(final int numeric) {
            return new DOUBLE.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.simple.THEN THEN(final long numeric) {
            return new DOUBLE.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }
        }

        static final class THEN extends CaseImpl.THEN> implements Case.DOUBLE.simple.THEN {
          THEN(final CaseImpl.WHEN parent, final data.Numeric value) {
            super(parent.root, parent, value);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final data.FLOAT numeric) {
            return new DOUBLE.ELSE(this, numeric);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final data.DOUBLE numeric) {
            return new DOUBLE.ELSE(this, numeric);
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final data.DECIMAL numeric) {
            return new DECIMAL.ELSE(this, numeric);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final data.TINYINT numeric) {
            return new DOUBLE.ELSE(this, numeric);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final data.SMALLINT numeric) {
            return new DOUBLE.ELSE(this, numeric);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final data.INT numeric) {
            return new DOUBLE.ELSE(this, numeric);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final data.BIGINT numeric) {
            return new DOUBLE.ELSE(this, numeric);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final float numeric) {
            return new DOUBLE.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final double numeric) {
            return new DOUBLE.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final BigDecimal numeric) {
            return new DECIMAL.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final byte numeric) {
            return new DOUBLE.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final short numeric) {
            return new DOUBLE.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final int numeric) {
            return new DOUBLE.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final long numeric) {
            return new DOUBLE.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public final Case.DOUBLE.simple.WHEN WHEN(final T condition) {
            return new DOUBLE.Simple.WHEN<>(this, data.wrap(condition));
          }
        }
      }

      static final class Search implements Case.DOUBLE.search {
        static final class WHEN extends CaseImpl.WHEN implements Case.DOUBLE.search.WHEN {
          WHEN(final CaseImpl.CASE_THEN parent, final data.Column when) {
            super(parent, parent, when);
          }

          @Override
          public final Case.DOUBLE.search.THEN THEN(final data.FLOAT numeric) {
            return new DOUBLE.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.DOUBLE.search.THEN THEN(final data.DOUBLE numeric) {
            return new DOUBLE.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.DECIMAL.search.THEN THEN(final data.DECIMAL numeric) {
            return new DECIMAL.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.DOUBLE.search.THEN THEN(final data.TINYINT numeric) {
            return new DOUBLE.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.DOUBLE.search.THEN THEN(final data.SMALLINT numeric) {
            return new DOUBLE.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.DOUBLE.search.THEN THEN(final data.INT numeric) {
            return new DOUBLE.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.DOUBLE.search.THEN THEN(final data.BIGINT numeric) {
            return new DOUBLE.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.DOUBLE.search.THEN THEN(final float numeric) {
            return new DOUBLE.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.search.THEN THEN(final double numeric) {
            return new DOUBLE.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.search.THEN THEN(final BigDecimal numeric) {
            return new DECIMAL.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.search.THEN THEN(final byte numeric) {
            return new DOUBLE.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.search.THEN THEN(final short numeric) {
            return new DOUBLE.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.search.THEN THEN(final int numeric) {
            return new DOUBLE.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.search.THEN THEN(final long numeric) {
            return new DOUBLE.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }
        }

        static final class THEN extends CaseImpl.THEN> implements Case.DOUBLE.search.THEN {
          THEN(final CaseImpl.WHEN parent, final data.Numeric value) {
            super(parent.root, parent, value);
          }

          @Override
          public final Case.DOUBLE.ELSE ELSE(final data.FLOAT numeric) {
            return new DOUBLE.ELSE(this, numeric);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final data.DOUBLE numeric) {
            return new DOUBLE.ELSE(this, numeric);
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final data.DECIMAL numeric) {
            return new DECIMAL.ELSE(this, numeric);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final data.TINYINT numeric) {
            return new DOUBLE.ELSE(this, numeric);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final data.SMALLINT numeric) {
            return new DOUBLE.ELSE(this, numeric);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final data.INT numeric) {
            return new DOUBLE.ELSE(this, numeric);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final data.BIGINT numeric) {
            return new DOUBLE.ELSE(this, numeric);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final float numeric) {
            return new DOUBLE.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final double numeric) {
            return new DOUBLE.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final BigDecimal numeric) {
            return new DECIMAL.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final byte numeric) {
            return new DOUBLE.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final short numeric) {
            return new DOUBLE.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final int numeric) {
            return new DOUBLE.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final long numeric) {
            return new DOUBLE.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public final Case.DOUBLE.search.WHEN WHEN(final Condition condition) {
            return new DOUBLE.Search.WHEN<>(this, condition);
          }
        }
      }

      static final class ELSE extends CaseImpl.ELSE> implements Case.DOUBLE.ELSE {
        ELSE(final THEN_ELSE parent, final data.Numeric value) {
          super(parent.root, parent, value);
        }

        @Override
        public final data.DOUBLE END() {
          return new data.DOUBLE().wrap(this);
        }
      }
    }

    static final class TINYINT {
      static final class Simple implements Case.TINYINT.simple {
        static final class WHEN extends CaseImpl.WHEN implements Case.TINYINT.simple.WHEN {
          WHEN(final CaseImpl.CASE_THEN parent, final data.Column when) {
            super(parent, parent, when);
          }

          @Override
          public Case.FLOAT.simple.THEN THEN(final data.FLOAT numeric) {
            return new FLOAT.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.DOUBLE.simple.THEN THEN(final data.DOUBLE numeric) {
            return new DOUBLE.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.DECIMAL.simple.THEN THEN(final data.DECIMAL numeric) {
            return new DECIMAL.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.TINYINT.simple.THEN THEN(final data.TINYINT numeric) {
            return new TINYINT.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.SMALLINT.simple.THEN THEN(final data.SMALLINT numeric) {
            return new SMALLINT.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.INT.simple.THEN THEN(final data.INT numeric) {
            return new INT.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.BIGINT.simple.THEN THEN(final data.BIGINT numeric) {
            return new BIGINT.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.FLOAT.simple.THEN THEN(final float numeric) {
            return new FLOAT.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.simple.THEN THEN(final double numeric) {
            return new DOUBLE.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.simple.THEN THEN(final BigDecimal numeric) {
            return new DECIMAL.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.TINYINT.simple.THEN THEN(final byte numeric) {
            return new TINYINT.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.SMALLINT.simple.THEN THEN(final short numeric) {
            return new SMALLINT.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.INT.simple.THEN THEN(final int numeric) {
            return new INT.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.BIGINT.simple.THEN THEN(final long numeric) {
            return new BIGINT.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }
        }

        static final class THEN extends CaseImpl.THEN> implements Case.TINYINT.simple.THEN {
          THEN(final CaseImpl.WHEN parent, final data.Numeric value) {
            super(parent.root, parent, value);
          }

          @Override
          public Case.FLOAT.ELSE ELSE(final data.FLOAT numeric) {
            return new FLOAT.ELSE(this, numeric);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final data.DOUBLE numeric) {
            return new DOUBLE.ELSE(this, numeric);
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final data.DECIMAL numeric) {
            return new DECIMAL.ELSE(this, numeric);
          }

          @Override
          public Case.TINYINT.ELSE ELSE(final data.TINYINT numeric) {
            return new TINYINT.ELSE(this, numeric);
          }

          @Override
          public Case.SMALLINT.ELSE ELSE(final data.SMALLINT numeric) {
            return new SMALLINT.ELSE(this, numeric);
          }

          @Override
          public Case.INT.ELSE ELSE(final data.INT numeric) {
            return new INT.ELSE(this, numeric);
          }

          @Override
          public Case.BIGINT.ELSE ELSE(final data.BIGINT numeric) {
            return new BIGINT.ELSE(this, numeric);
          }

          @Override
          public Case.FLOAT.ELSE ELSE(final float numeric) {
            return new FLOAT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final double numeric) {
            return new DOUBLE.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final BigDecimal numeric) {
            return new DECIMAL.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.TINYINT.ELSE ELSE(final byte numeric) {
            return new TINYINT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.SMALLINT.ELSE ELSE(final short numeric) {
            return new SMALLINT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.INT.ELSE ELSE(final int numeric) {
            return new INT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.BIGINT.ELSE ELSE(final long numeric) {
            return new BIGINT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public final Case.TINYINT.simple.WHEN WHEN(final T condition) {
            return new TINYINT.Simple.WHEN<>(this, data.wrap(condition));
          }
        }
      }

      static final class Search implements Case.TINYINT.search {
        static final class WHEN extends CaseImpl.WHEN implements Case.TINYINT.search.WHEN {
          WHEN(final CaseImpl.CASE_THEN parent, final data.Column when) {
            super(parent, parent, when);
          }

          @Override
          public final Case.FLOAT.search.THEN THEN(final data.FLOAT numeric) {
            return new FLOAT.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.DOUBLE.search.THEN THEN(final data.DOUBLE numeric) {
            return new DOUBLE.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.DECIMAL.search.THEN THEN(final data.DECIMAL numeric) {
            return new DECIMAL.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.TINYINT.search.THEN THEN(final data.TINYINT numeric) {
            return new TINYINT.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.SMALLINT.search.THEN THEN(final data.SMALLINT numeric) {
            return new SMALLINT.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.INT.search.THEN THEN(final data.INT numeric) {
            return new INT.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.BIGINT.search.THEN THEN(final data.BIGINT numeric) {
            return new BIGINT.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.FLOAT.search.THEN THEN(final float numeric) {
            return new FLOAT.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.search.THEN THEN(final double numeric) {
            return new DOUBLE.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.search.THEN THEN(final BigDecimal numeric) {
            return new DECIMAL.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.TINYINT.search.THEN THEN(final byte numeric) {
            return new TINYINT.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.SMALLINT.search.THEN THEN(final short numeric) {
            return new SMALLINT.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.INT.search.THEN THEN(final int numeric) {
            return new INT.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.BIGINT.search.THEN THEN(final long numeric) {
            return new BIGINT.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }
        }

        static final class THEN extends CaseImpl.THEN> implements Case.TINYINT.search.THEN {
          THEN(final CaseImpl.WHEN parent, final data.Numeric value) {
            super(parent.root, parent, value);
          }

          @Override
          public final Case.FLOAT.ELSE ELSE(final data.FLOAT numeric) {
            return new FLOAT.ELSE(this, numeric);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final data.DOUBLE numeric) {
            return new DOUBLE.ELSE(this, numeric);
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final data.DECIMAL numeric) {
            return new DECIMAL.ELSE(this, numeric);
          }

          @Override
          public Case.TINYINT.ELSE ELSE(final data.TINYINT numeric) {
            return new TINYINT.ELSE(this, numeric);
          }

          @Override
          public Case.SMALLINT.ELSE ELSE(final data.SMALLINT numeric) {
            return new SMALLINT.ELSE(this, numeric);
          }

          @Override
          public Case.INT.ELSE ELSE(final data.INT numeric) {
            return new INT.ELSE(this, numeric);
          }

          @Override
          public Case.BIGINT.ELSE ELSE(final data.BIGINT numeric) {
            return new BIGINT.ELSE(this, numeric);
          }

          @Override
          public Case.FLOAT.ELSE ELSE(final float numeric) {
            return new FLOAT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final double numeric) {
            return new DOUBLE.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final BigDecimal numeric) {
            return new DECIMAL.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.TINYINT.ELSE ELSE(final byte numeric) {
            return new TINYINT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.SMALLINT.ELSE ELSE(final short numeric) {
            return new SMALLINT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.INT.ELSE ELSE(final int numeric) {
            return new INT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.BIGINT.ELSE ELSE(final long numeric) {
            return new BIGINT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public final Case.TINYINT.search.WHEN WHEN(final Condition condition) {
            return new TINYINT.Search.WHEN<>(this, condition);
          }
        }
      }

      static final class ELSE extends CaseImpl.ELSE> implements Case.TINYINT.ELSE {
        ELSE(final THEN_ELSE parent, final data.Numeric value) {
          super(parent.root, parent, value);
        }

        @Override
        public final data.TINYINT END() {
          return new data.TINYINT().wrap(this);
        }
      }
    }

    static final class SMALLINT {
      static final class Simple implements Case.SMALLINT.simple {
        static final class WHEN extends CaseImpl.WHEN implements Case.SMALLINT.simple.WHEN {
          WHEN(final CaseImpl.CASE_THEN parent, final data.Column when) {
            super(parent, parent, when);
          }

          @Override
          public Case.FLOAT.simple.THEN THEN(final data.FLOAT numeric) {
            return new FLOAT.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.DOUBLE.simple.THEN THEN(final data.DOUBLE numeric) {
            return new DOUBLE.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.DECIMAL.simple.THEN THEN(final data.DECIMAL numeric) {
            return new DECIMAL.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.SMALLINT.simple.THEN THEN(final data.TINYINT numeric) {
            return new SMALLINT.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.SMALLINT.simple.THEN THEN(final data.SMALLINT numeric) {
            return new SMALLINT.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.INT.simple.THEN THEN(final data.INT numeric) {
            return new INT.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.BIGINT.simple.THEN THEN(final data.BIGINT numeric) {
            return new BIGINT.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.FLOAT.simple.THEN THEN(final float numeric) {
            return new FLOAT.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.simple.THEN THEN(final double numeric) {
            return new DOUBLE.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.simple.THEN THEN(final BigDecimal numeric) {
            return new DECIMAL.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.SMALLINT.simple.THEN THEN(final byte numeric) {
            return new SMALLINT.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.SMALLINT.simple.THEN THEN(final short numeric) {
            return new SMALLINT.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.INT.simple.THEN THEN(final int numeric) {
            return new INT.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.BIGINT.simple.THEN THEN(final long numeric) {
            return new BIGINT.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }
        }

        static final class THEN extends CaseImpl.THEN> implements Case.SMALLINT.simple.THEN {
          THEN(final CaseImpl.WHEN parent, final data.Numeric value) {
            super(parent.root, parent, value);
          }

          @Override
          public Case.FLOAT.ELSE ELSE(final data.FLOAT numeric) {
            return new FLOAT.ELSE(this, numeric);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final data.DOUBLE numeric) {
            return new DOUBLE.ELSE(this, numeric);
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final data.DECIMAL numeric) {
            return new DECIMAL.ELSE(this, numeric);
          }

          @Override
          public Case.SMALLINT.ELSE ELSE(final data.TINYINT numeric) {
            return new SMALLINT.ELSE(this, numeric);
          }

          @Override
          public Case.SMALLINT.ELSE ELSE(final data.SMALLINT numeric) {
            return new SMALLINT.ELSE(this, numeric);
          }

          @Override
          public Case.INT.ELSE ELSE(final data.INT numeric) {
            return new INT.ELSE(this, numeric);
          }

          @Override
          public Case.BIGINT.ELSE ELSE(final data.BIGINT numeric) {
            return new BIGINT.ELSE(this, numeric);
          }

          @Override
          public Case.FLOAT.ELSE ELSE(final float numeric) {
            return new FLOAT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final double numeric) {
            return new DOUBLE.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final BigDecimal numeric) {
            return new DECIMAL.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.SMALLINT.ELSE ELSE(final byte numeric) {
            return new SMALLINT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.SMALLINT.ELSE ELSE(final short numeric) {
            return new SMALLINT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.INT.ELSE ELSE(final int numeric) {
            return new INT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.BIGINT.ELSE ELSE(final long numeric) {
            return new BIGINT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public final Case.SMALLINT.simple.WHEN WHEN(final T condition) {
            return new SMALLINT.Simple.WHEN<>(this, data.wrap(condition));
          }
        }
      }

      static final class Search implements Case.SMALLINT.search {
        static final class WHEN extends CaseImpl.WHEN implements Case.SMALLINT.search.WHEN {
          WHEN(final CaseImpl.CASE_THEN parent, final data.Column when) {
            super(parent, parent, when);
          }

          @Override
          public final Case.FLOAT.search.THEN THEN(final data.FLOAT numeric) {
            return new FLOAT.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.DOUBLE.search.THEN THEN(final data.DOUBLE numeric) {
            return new DOUBLE.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.DECIMAL.search.THEN THEN(final data.DECIMAL numeric) {
            return new DECIMAL.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.SMALLINT.search.THEN THEN(final data.TINYINT numeric) {
            return new SMALLINT.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.SMALLINT.search.THEN THEN(final data.SMALLINT numeric) {
            return new SMALLINT.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.INT.search.THEN THEN(final data.INT numeric) {
            return new INT.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.BIGINT.search.THEN THEN(final data.BIGINT numeric) {
            return new BIGINT.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.FLOAT.search.THEN THEN(final float numeric) {
            return new FLOAT.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.search.THEN THEN(final double numeric) {
            return new DOUBLE.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.search.THEN THEN(final BigDecimal numeric) {
            return new DECIMAL.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.SMALLINT.search.THEN THEN(final byte numeric) {
            return new SMALLINT.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.SMALLINT.search.THEN THEN(final short numeric) {
            return new SMALLINT.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.INT.search.THEN THEN(final int numeric) {
            return new INT.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.BIGINT.search.THEN THEN(final long numeric) {
            return new BIGINT.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }
        }

        static final class THEN extends CaseImpl.THEN> implements Case.SMALLINT.search.THEN {
          THEN(final CaseImpl.WHEN parent, final data.Numeric value) {
            super(parent.root, parent, value);
          }

          @Override
          public final Case.FLOAT.ELSE ELSE(final data.FLOAT numeric) {
            return new FLOAT.ELSE(this, numeric);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final data.DOUBLE numeric) {
            return new DOUBLE.ELSE(this, numeric);
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final data.DECIMAL numeric) {
            return new DECIMAL.ELSE(this, numeric);
          }

          @Override
          public Case.SMALLINT.ELSE ELSE(final data.TINYINT numeric) {
            return new SMALLINT.ELSE(this, numeric);
          }

          @Override
          public Case.SMALLINT.ELSE ELSE(final data.SMALLINT numeric) {
            return new SMALLINT.ELSE(this, numeric);
          }

          @Override
          public Case.INT.ELSE ELSE(final data.INT numeric) {
            return new INT.ELSE(this, numeric);
          }

          @Override
          public Case.BIGINT.ELSE ELSE(final data.BIGINT numeric) {
            return new BIGINT.ELSE(this, numeric);
          }

          @Override
          public Case.FLOAT.ELSE ELSE(final float numeric) {
            return new FLOAT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final double numeric) {
            return new DOUBLE.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final BigDecimal numeric) {
            return new DECIMAL.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.SMALLINT.ELSE ELSE(final byte numeric) {
            return new SMALLINT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.SMALLINT.ELSE ELSE(final short numeric) {
            return new SMALLINT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.INT.ELSE ELSE(final int numeric) {
            return new INT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.BIGINT.ELSE ELSE(final long numeric) {
            return new BIGINT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public final Case.SMALLINT.search.WHEN WHEN(final Condition condition) {
            return new SMALLINT.Search.WHEN<>(this, condition);
          }
        }
      }

      static final class ELSE extends CaseImpl.ELSE> implements Case.SMALLINT.ELSE {
        ELSE(final THEN_ELSE parent, final data.Numeric value) {
          super(parent.root, parent, value);
        }

        @Override
        public final data.SMALLINT END() {
          final data.Numeric numeric = (data.Numeric)((THEN_ELSE)parent).getColumn().clone();
          final data.SMALLINT column = numeric instanceof data.SMALLINT ? (data.SMALLINT)numeric.clone() : numeric instanceof data.ExactNumeric ? new data.SMALLINT(((data.ExactNumeric)numeric).precision()) : new data.SMALLINT();
          return column.wrap(this);
        }
      }
    }

    static final class INT {
      static final class Simple implements Case.INT.simple {
        static final class WHEN extends CaseImpl.WHEN implements Case.INT.simple.WHEN {
          WHEN(final CaseImpl.CASE_THEN parent, final data.Column when) {
            super(parent, parent, when);
          }

          @Override
          public Case.DOUBLE.simple.THEN THEN(final data.FLOAT numeric) {
            return new DOUBLE.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.DOUBLE.simple.THEN THEN(final data.DOUBLE numeric) {
            return new DOUBLE.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.DECIMAL.simple.THEN THEN(final data.DECIMAL numeric) {
            return new DECIMAL.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.INT.simple.THEN THEN(final data.TINYINT numeric) {
            return new INT.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.INT.simple.THEN THEN(final data.SMALLINT numeric) {
            return new INT.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.INT.simple.THEN THEN(final data.INT numeric) {
            return new INT.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.BIGINT.simple.THEN THEN(final data.BIGINT numeric) {
            return new BIGINT.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.DOUBLE.simple.THEN THEN(final float numeric) {
            return new DOUBLE.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.simple.THEN THEN(final double numeric) {
            return new DOUBLE.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.simple.THEN THEN(final BigDecimal numeric) {
            return new DECIMAL.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.INT.simple.THEN THEN(final byte numeric) {
            return new INT.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.INT.simple.THEN THEN(final short numeric) {
            return new INT.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.INT.simple.THEN THEN(final int numeric) {
            return new INT.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.BIGINT.simple.THEN THEN(final long numeric) {
            return new BIGINT.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }
        }

        static final class THEN extends CaseImpl.THEN> implements Case.INT.simple.THEN {
          THEN(final CaseImpl.WHEN parent, final data.Numeric value) {
            super(parent.root, parent, value);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final data.FLOAT numeric) {
            return new DOUBLE.ELSE(this, numeric);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final data.DOUBLE numeric) {
            return new DOUBLE.ELSE(this, numeric);
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final data.DECIMAL numeric) {
            return new DECIMAL.ELSE(this, numeric);
          }

          @Override
          public Case.INT.ELSE ELSE(final data.TINYINT numeric) {
            return new INT.ELSE(this, numeric);
          }

          @Override
          public Case.INT.ELSE ELSE(final data.SMALLINT numeric) {
            return new INT.ELSE(this, numeric);
          }

          @Override
          public Case.INT.ELSE ELSE(final data.INT numeric) {
            return new INT.ELSE(this, numeric);
          }

          @Override
          public Case.BIGINT.ELSE ELSE(final data.BIGINT numeric) {
            return new BIGINT.ELSE(this, numeric);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final float numeric) {
            return new DOUBLE.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final double numeric) {
            return new DOUBLE.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final BigDecimal numeric) {
            return new DECIMAL.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.INT.ELSE ELSE(final byte numeric) {
            return new INT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.INT.ELSE ELSE(final short numeric) {
            return new INT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.INT.ELSE ELSE(final int numeric) {
            return new INT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.BIGINT.ELSE ELSE(final long numeric) {
            return new BIGINT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public final Case.INT.simple.WHEN WHEN(final T condition) {
            return new INT.Simple.WHEN<>(this, data.wrap(condition));
          }
        }
      }

      static final class Search implements Case.INT.search {
        static final class WHEN extends CaseImpl.WHEN implements Case.INT.search.WHEN {
          WHEN(final CaseImpl.CASE_THEN parent, final data.Column when) {
            super(parent, parent, when);
          }

          @Override
          public final Case.DOUBLE.search.THEN THEN(final data.FLOAT numeric) {
            return new DOUBLE.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.DOUBLE.search.THEN THEN(final data.DOUBLE numeric) {
            return new DOUBLE.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.DECIMAL.search.THEN THEN(final data.DECIMAL numeric) {
            return new DECIMAL.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.INT.search.THEN THEN(final data.TINYINT numeric) {
            return new INT.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.INT.search.THEN THEN(final data.SMALLINT numeric) {
            return new INT.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.INT.search.THEN THEN(final data.INT numeric) {
            return new INT.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.BIGINT.search.THEN THEN(final data.BIGINT numeric) {
            return new BIGINT.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.DOUBLE.search.THEN THEN(final float numeric) {
            return new DOUBLE.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.search.THEN THEN(final double numeric) {
            return new DOUBLE.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.search.THEN THEN(final BigDecimal numeric) {
            return new DECIMAL.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.INT.search.THEN THEN(final byte numeric) {
            return new INT.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.INT.search.THEN THEN(final short numeric) {
            return new INT.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.INT.search.THEN THEN(final int numeric) {
            return new INT.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.BIGINT.search.THEN THEN(final long numeric) {
            return new BIGINT.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }
        }

        static final class THEN extends CaseImpl.THEN> implements Case.INT.search.THEN {
          THEN(final CaseImpl.WHEN parent, final data.Numeric value) {
            super(parent.root, parent, value);
          }

          @Override
          public final Case.DOUBLE.ELSE ELSE(final data.FLOAT numeric) {
            return new DOUBLE.ELSE(this, numeric);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final data.DOUBLE numeric) {
            return new DOUBLE.ELSE(this, numeric);
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final data.DECIMAL numeric) {
            return new DECIMAL.ELSE(this, numeric);
          }

          @Override
          public Case.INT.ELSE ELSE(final data.TINYINT numeric) {
            return new INT.ELSE(this, numeric);
          }

          @Override
          public Case.INT.ELSE ELSE(final data.SMALLINT numeric) {
            return new INT.ELSE(this, numeric);
          }

          @Override
          public Case.INT.ELSE ELSE(final data.INT numeric) {
            return new INT.ELSE(this, numeric);
          }

          @Override
          public Case.BIGINT.ELSE ELSE(final data.BIGINT numeric) {
            return new BIGINT.ELSE(this, numeric);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final float numeric) {
            return new DOUBLE.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final double numeric) {
            return new DOUBLE.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final BigDecimal numeric) {
            return new DECIMAL.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.INT.ELSE ELSE(final byte numeric) {
            return new INT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.INT.ELSE ELSE(final short numeric) {
            return new INT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.INT.ELSE ELSE(final int numeric) {
            return new INT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.BIGINT.ELSE ELSE(final long numeric) {
            return new BIGINT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public final Case.INT.search.WHEN WHEN(final Condition condition) {
            return new INT.Search.WHEN<>(this, condition);
          }
        }
      }

      static final class ELSE extends CaseImpl.ELSE> implements Case.INT.ELSE {
        ELSE(final THEN_ELSE parent, final data.Numeric value) {
          super(parent.root, parent, value);
        }

        @Override
        public final data.INT END() {
          final data.Numeric numeric = (data.Numeric)((THEN_ELSE)parent).getColumn().clone();
          final data.INT column = numeric instanceof data.INT ? (data.INT)numeric.clone() : numeric instanceof data.ExactNumeric ? new data.INT(((data.ExactNumeric)numeric).precision()) : new data.INT();
          return column.wrap(this);
        }
      }
    }

    static final class BIGINT {
      static final class Simple implements Case.BIGINT.simple {
        static final class WHEN extends CaseImpl.WHEN implements Case.BIGINT.simple.WHEN {
          WHEN(final CaseImpl.CASE_THEN parent, final data.Column when) {
            super(parent, parent, when);
          }

          @Override
          public Case.DOUBLE.simple.THEN THEN(final data.FLOAT numeric) {
            return new DOUBLE.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.DOUBLE.simple.THEN THEN(final data.DOUBLE numeric) {
            return new DOUBLE.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.DECIMAL.simple.THEN THEN(final data.DECIMAL numeric) {
            return new DECIMAL.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.BIGINT.simple.THEN THEN(final data.TINYINT numeric) {
            return new BIGINT.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.BIGINT.simple.THEN THEN(final data.SMALLINT numeric) {
            return new BIGINT.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.BIGINT.simple.THEN THEN(final data.INT numeric) {
            return new BIGINT.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.BIGINT.simple.THEN THEN(final data.BIGINT numeric) {
            return new BIGINT.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.DOUBLE.simple.THEN THEN(final float numeric) {
            return new DOUBLE.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.simple.THEN THEN(final double numeric) {
            return new DOUBLE.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.simple.THEN THEN(final BigDecimal numeric) {
            return new DECIMAL.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.BIGINT.simple.THEN THEN(final byte numeric) {
            return new BIGINT.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.BIGINT.simple.THEN THEN(final short numeric) {
            return new BIGINT.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.BIGINT.simple.THEN THEN(final int numeric) {
            return new BIGINT.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.BIGINT.simple.THEN THEN(final long numeric) {
            return new BIGINT.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }
        }

        static final class THEN extends CaseImpl.THEN> implements Case.BIGINT.simple.THEN {
          THEN(final CaseImpl.WHEN parent, final data.Numeric value) {
            super(parent.root, parent, value);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final data.FLOAT numeric) {
            return new DOUBLE.ELSE(this, numeric);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final data.DOUBLE numeric) {
            return new DOUBLE.ELSE(this, numeric);
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final data.DECIMAL numeric) {
            return new DECIMAL.ELSE(this, numeric);
          }

          @Override
          public Case.BIGINT.ELSE ELSE(final data.TINYINT numeric) {
            return new BIGINT.ELSE(this, numeric);
          }

          @Override
          public Case.BIGINT.ELSE ELSE(final data.SMALLINT numeric) {
            return new BIGINT.ELSE(this, numeric);
          }

          @Override
          public Case.BIGINT.ELSE ELSE(final data.INT numeric) {
            return new BIGINT.ELSE(this, numeric);
          }

          @Override
          public Case.BIGINT.ELSE ELSE(final data.BIGINT numeric) {
            return new BIGINT.ELSE(this, numeric);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final float numeric) {
            return new DOUBLE.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final double numeric) {
            return new DOUBLE.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final BigDecimal numeric) {
            return new DECIMAL.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.BIGINT.ELSE ELSE(final byte numeric) {
            return new BIGINT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.BIGINT.ELSE ELSE(final short numeric) {
            return new BIGINT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.BIGINT.ELSE ELSE(final int numeric) {
            return new BIGINT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.BIGINT.ELSE ELSE(final long numeric) {
            return new BIGINT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public final Case.BIGINT.simple.WHEN WHEN(final T condition) {
            return new BIGINT.Simple.WHEN<>(this, data.wrap(condition));
          }
        }
      }

      static final class Search implements Case.BIGINT.search {
        static final class WHEN extends CaseImpl.WHEN implements Case.BIGINT.search.WHEN {
          WHEN(final CaseImpl.CASE_THEN parent, final data.Column when) {
            super(parent, parent, when);
          }

          @Override
          public final Case.DOUBLE.search.THEN THEN(final data.FLOAT numeric) {
            return new DOUBLE.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.DOUBLE.search.THEN THEN(final data.DOUBLE numeric) {
            return new DOUBLE.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.DECIMAL.search.THEN THEN(final data.DECIMAL numeric) {
            return new DECIMAL.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.BIGINT.search.THEN THEN(final data.TINYINT numeric) {
            return new BIGINT.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.BIGINT.search.THEN THEN(final data.SMALLINT numeric) {
            return new BIGINT.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.BIGINT.search.THEN THEN(final data.INT numeric) {
            return new BIGINT.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.BIGINT.search.THEN THEN(final data.BIGINT numeric) {
            return new BIGINT.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.DOUBLE.search.THEN THEN(final float numeric) {
            return new DOUBLE.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.search.THEN THEN(final double numeric) {
            return new DOUBLE.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.search.THEN THEN(final BigDecimal numeric) {
            return new DECIMAL.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.BIGINT.search.THEN THEN(final byte numeric) {
            return new BIGINT.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.BIGINT.search.THEN THEN(final short numeric) {
            return new BIGINT.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.BIGINT.search.THEN THEN(final int numeric) {
            return new BIGINT.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.BIGINT.search.THEN THEN(final long numeric) {
            return new BIGINT.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }
        }

        static final class THEN extends CaseImpl.THEN> implements Case.BIGINT.search.THEN {
          THEN(final CaseImpl.WHEN parent, final data.Numeric value) {
            super(parent.root, parent, value);
          }

          @Override
          public final Case.DOUBLE.ELSE ELSE(final data.FLOAT numeric) {
            return new DOUBLE.ELSE(this, numeric);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final data.DOUBLE numeric) {
            return new DOUBLE.ELSE(this, numeric);
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final data.DECIMAL numeric) {
            return new DECIMAL.ELSE(this, numeric);
          }

          @Override
          public Case.BIGINT.ELSE ELSE(final data.TINYINT numeric) {
            return new BIGINT.ELSE(this, numeric);
          }

          @Override
          public Case.BIGINT.ELSE ELSE(final data.SMALLINT numeric) {
            return new BIGINT.ELSE(this, numeric);
          }

          @Override
          public Case.BIGINT.ELSE ELSE(final data.INT numeric) {
            return new BIGINT.ELSE(this, numeric);
          }

          @Override
          public Case.BIGINT.ELSE ELSE(final data.BIGINT numeric) {
            return new BIGINT.ELSE(this, numeric);
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final float numeric) {
            return new DOUBLE.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DOUBLE.ELSE ELSE(final double numeric) {
            return new DOUBLE.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final BigDecimal numeric) {
            return new DECIMAL.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.BIGINT.ELSE ELSE(final byte numeric) {
            return new BIGINT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.BIGINT.ELSE ELSE(final short numeric) {
            return new BIGINT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.BIGINT.ELSE ELSE(final int numeric) {
            return new BIGINT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.BIGINT.ELSE ELSE(final long numeric) {
            return new BIGINT.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public final Case.BIGINT.search.WHEN WHEN(final Condition condition) {
            return new BIGINT.Search.WHEN<>(this, condition);
          }
        }
      }

      static final class ELSE extends CaseImpl.ELSE> implements Case.BIGINT.ELSE {
        ELSE(final THEN_ELSE parent, final data.Numeric value) {
          super(parent.root, parent, value);
        }

        @Override
        public final data.BIGINT END() {
          final data.Numeric numeric = (data.Numeric)((THEN_ELSE)parent).getColumn().clone();
          final data.BIGINT column = numeric instanceof data.BIGINT ? (data.BIGINT)numeric.clone() : numeric instanceof data.ExactNumeric ? new data.BIGINT(((data.ExactNumeric)numeric).precision()) : new data.BIGINT();
          return column.wrap(this);
        }
      }
    }

    static final class DECIMAL {
      static final class Simple implements Case.DECIMAL.simple {
        static final class WHEN extends CaseImpl.WHEN implements Case.DECIMAL.simple.WHEN {
          WHEN(final CaseImpl.CASE_THEN parent, final data.Column when) {
            super(parent, parent, when);
          }

          @Override
          public Case.DECIMAL.simple.THEN THEN(final data.FLOAT numeric) {
            return new DECIMAL.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.DECIMAL.simple.THEN THEN(final data.DOUBLE numeric) {
            return new DECIMAL.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.DECIMAL.simple.THEN THEN(final data.DECIMAL numeric) {
            return new DECIMAL.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.DECIMAL.simple.THEN THEN(final data.TINYINT numeric) {
            return new DECIMAL.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.DECIMAL.simple.THEN THEN(final data.SMALLINT numeric) {
            return new DECIMAL.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.DECIMAL.simple.THEN THEN(final data.INT numeric) {
            return new DECIMAL.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.DECIMAL.simple.THEN THEN(final data.BIGINT numeric) {
            return new DECIMAL.Simple.THEN<>(this, numeric);
          }

          @Override
          public Case.DECIMAL.simple.THEN THEN(final float numeric) {
            return new DECIMAL.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.simple.THEN THEN(final double numeric) {
            return new DECIMAL.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.simple.THEN THEN(final BigDecimal numeric) {
            return new DECIMAL.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.simple.THEN THEN(final byte numeric) {
            return new DECIMAL.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.simple.THEN THEN(final short numeric) {
            return new DECIMAL.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.simple.THEN THEN(final int numeric) {
            return new DECIMAL.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.simple.THEN THEN(final long numeric) {
            return new DECIMAL.Simple.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }
        }

        static final class THEN extends CaseImpl.THEN> implements Case.DECIMAL.simple.THEN {
          THEN(final CaseImpl.WHEN parent, final data.Numeric value) {
            super(parent.root, parent, value);
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final data.FLOAT numeric) {
            return new DECIMAL.ELSE(this, numeric);
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final data.DOUBLE numeric) {
            return new DECIMAL.ELSE(this, numeric);
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final data.DECIMAL numeric) {
            return new DECIMAL.ELSE(this, numeric);
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final data.TINYINT numeric) {
            return new DECIMAL.ELSE(this, numeric);
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final data.SMALLINT numeric) {
            return new DECIMAL.ELSE(this, numeric);
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final data.INT numeric) {
            return new DECIMAL.ELSE(this, numeric);
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final data.BIGINT numeric) {
            return new DECIMAL.ELSE(this, numeric);
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final float numeric) {
            return new DECIMAL.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final double numeric) {
            return new DECIMAL.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final BigDecimal numeric) {
            return new DECIMAL.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final byte numeric) {
            return new DECIMAL.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final short numeric) {
            return new DECIMAL.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final int numeric) {
            return new DECIMAL.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final long numeric) {
            return new DECIMAL.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public final Case.DECIMAL.simple.WHEN WHEN(final T condition) {
            return new DECIMAL.Simple.WHEN<>(this, data.wrap(condition));
          }
        }
      }

      static final class Search implements Case.DECIMAL.search {
        static final class WHEN extends CaseImpl.WHEN implements Case.DECIMAL.search.WHEN {
          WHEN(final CaseImpl.CASE_THEN parent, final data.Column when) {
            super(parent, parent, when);
          }

          @Override
          public final Case.DECIMAL.search.THEN THEN(final data.FLOAT numeric) {
            return new DECIMAL.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.DECIMAL.search.THEN THEN(final data.DOUBLE numeric) {
            return new DECIMAL.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.DECIMAL.search.THEN THEN(final data.DECIMAL numeric) {
            return new DECIMAL.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.DECIMAL.search.THEN THEN(final data.TINYINT numeric) {
            return new DECIMAL.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.DECIMAL.search.THEN THEN(final data.SMALLINT numeric) {
            return new DECIMAL.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.DECIMAL.search.THEN THEN(final data.INT numeric) {
            return new DECIMAL.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.DECIMAL.search.THEN THEN(final data.BIGINT numeric) {
            return new DECIMAL.Search.THEN<>(this, numeric);
          }

          @Override
          public Case.DECIMAL.search.THEN THEN(final float numeric) {
            return new DECIMAL.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.search.THEN THEN(final double numeric) {
            return new DECIMAL.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.search.THEN THEN(final BigDecimal numeric) {
            return new DECIMAL.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.search.THEN THEN(final byte numeric) {
            return new DECIMAL.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.search.THEN THEN(final short numeric) {
            return new DECIMAL.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.search.THEN THEN(final int numeric) {
            return new DECIMAL.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.search.THEN THEN(final long numeric) {
            return new DECIMAL.Search.THEN<>(this, (data.Numeric)data.wrap(numeric));
          }
        }

        static final class THEN extends CaseImpl.THEN> implements Case.DECIMAL.search.THEN {
          THEN(final CaseImpl.WHEN parent, final data.Numeric value) {
            super(parent.root, parent, value);
          }

          @Override
          public final Case.DECIMAL.ELSE ELSE(final data.FLOAT numeric) {
            return new DECIMAL.ELSE(this, numeric);
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final data.DOUBLE numeric) {
            return new DECIMAL.ELSE(this, numeric);
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final data.DECIMAL numeric) {
            return new DECIMAL.ELSE(this, numeric);
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final data.TINYINT numeric) {
            return new DECIMAL.ELSE(this, numeric);
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final data.SMALLINT numeric) {
            return new DECIMAL.ELSE(this, numeric);
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final data.INT numeric) {
            return new DECIMAL.ELSE(this, numeric);
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final data.BIGINT numeric) {
            return new DECIMAL.ELSE(this, numeric);
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final float numeric) {
            return new DECIMAL.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final double numeric) {
            return new DECIMAL.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final BigDecimal numeric) {
            return new DECIMAL.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final byte numeric) {
            return new DECIMAL.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final short numeric) {
            return new DECIMAL.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final int numeric) {
            return new DECIMAL.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public Case.DECIMAL.ELSE ELSE(final long numeric) {
            return new DECIMAL.ELSE(this, (data.Numeric)data.wrap(numeric));
          }

          @Override
          public final Case.DECIMAL.search.WHEN WHEN(final Condition condition) {
            return new DECIMAL.Search.WHEN<>(this, condition);
          }
        }
      }

      static final class ELSE extends CaseImpl.ELSE> implements Case.DECIMAL.ELSE {
        ELSE(final THEN_ELSE parent, final data.Numeric value) {
          super(parent.root, parent, value);
        }

        @Override
        public final data.DECIMAL END() {
          final data.Numeric numeric = (data.Numeric)((THEN_ELSE)parent).getColumn().clone();
          final data.DECIMAL column = numeric instanceof data.DECIMAL ? (data.DECIMAL)numeric.clone() : numeric instanceof data.ExactNumeric ? new data.DECIMAL(((data.ExactNumeric)numeric).precision(), Integer.valueOf(0)) : new data.DECIMAL();
          return column.wrap(this);
        }
      }
    }

    static final class BINARY {
      static final class Simple implements Case.BINARY.simple {
        static final class WHEN extends CaseImpl.WHEN implements Case.BINARY.simple.WHEN {
          WHEN(final CaseImpl.CASE_THEN parent, final data.Column when) {
            super(parent, parent, when);
          }

          @Override
          public Case.BINARY.simple.THEN THEN(final data.BINARY binary) {
            return new BINARY.Simple.THEN<>(this, binary);
          }

          @Override
          public Case.BINARY.simple.THEN THEN(final byte[] binary) {
            return new BINARY.Simple.THEN<>(this, data.wrap(binary));
          }
        }

        static final class THEN extends CaseImpl.THEN implements Case.BINARY.simple.THEN {
          THEN(final CaseImpl.WHEN parent, final data.BINARY value) {
            super(parent.root, parent, value);
          }

          @Override
          public Case.BINARY.ELSE ELSE(final data.BINARY binary) {
            return new BINARY.ELSE(this, binary);
          }

          @Override
          public Case.BINARY.ELSE ELSE(final byte[] binary) {
            return new BINARY.ELSE(this, data.wrap(binary));
          }

          @Override
          public final Case.BINARY.simple.WHEN WHEN(final T condition) {
            return new BINARY.Simple.WHEN<>(this, data.wrap(condition));
          }
        }
      }

      static final class Search implements Case.BINARY.search {
        static final class WHEN extends CaseImpl.WHEN implements Case.BINARY.search.WHEN {
          WHEN(final CaseImpl.CASE_THEN parent, final data.Column when) {
            super(parent, parent, when);
          }

          @Override
          public final Case.BINARY.search.THEN THEN(final data.BINARY binary) {
            return new BINARY.Search.THEN<>(this, binary);
          }

          @Override
          public final Case.BINARY.search.THEN THEN(final byte[] binary) {
            return new BINARY.Search.THEN<>(this, data.wrap(binary));
          }
        }

        static final class THEN extends CaseImpl.THEN implements Case.BINARY.search.THEN {
          THEN(final CaseImpl.WHEN parent, final data.BINARY value) {
            super(parent.root, parent, value);
          }

          @Override
          public final Case.BINARY.ELSE ELSE(final data.BINARY binary) {
            return new BINARY.ELSE(this, binary);
          }

          @Override
          public final Case.BINARY.ELSE ELSE(final byte[] binary) {
            return new BINARY.ELSE(this, data.wrap(binary));
          }

          @Override
          public final Case.BINARY.search.WHEN WHEN(final Condition condition) {
            return new BINARY.Search.WHEN<>(this, condition);
          }
        }
      }

      static final class ELSE extends CaseImpl.ELSE implements Case.BINARY.ELSE {
        ELSE(final THEN_ELSE parent, final data.BINARY value) {
          super(parent.root, parent, value);
        }

        @Override
        public final data.BINARY END() {
          final data.BINARY column = (data.BINARY)((THEN_ELSE)parent).getColumn().clone();
          return column.wrap(this);
        }
      }
    }

    static final class DATE {
      static final class Simple implements Case.DATE.simple {
        static final class WHEN extends CaseImpl.WHEN implements Case.DATE.simple.WHEN {
          WHEN(final CaseImpl.CASE_THEN parent, final data.Column when) {
            super(parent, parent, when);
          }

          @Override
          public Case.DATE.simple.THEN THEN(final data.DATE date) {
            return new DATE.Simple.THEN<>(this, date);
          }

          @Override
          public Case.DATE.simple.THEN THEN(final LocalDate date) {
            return new DATE.Simple.THEN<>(this, data.wrap(date));
          }
        }

        static final class THEN extends CaseImpl.THEN implements Case.DATE.simple.THEN {
          THEN(final CaseImpl.WHEN parent, final data.DATE value) {
            super(parent.root, parent, value);
          }

          @Override
          public Case.DATE.ELSE ELSE(final data.DATE date) {
            return new DATE.ELSE(this, date);
          }

          @Override
          public Case.DATE.ELSE ELSE(final LocalDate date) {
            return new DATE.ELSE(this, data.wrap(date));
          }

          @Override
          public final Case.DATE.simple.WHEN WHEN(final T condition) {
            return new DATE.Simple.WHEN<>(this, data.wrap(condition));
          }
        }
      }

      static final class Search implements Case.DATE.search {
        static final class WHEN extends CaseImpl.WHEN implements Case.DATE.search.WHEN {
          WHEN(final CaseImpl.CASE_THEN parent, final data.Column when) {
            super(parent, parent, when);
          }

          @Override
          public final Case.DATE.search.THEN THEN(final data.DATE date) {
            return new DATE.Search.THEN<>(this, date);
          }

          @Override
          public final Case.DATE.search.THEN THEN(final LocalDate date) {
            return new DATE.Search.THEN<>(this, data.wrap(date));
          }
        }

        static final class THEN extends CaseImpl.THEN implements Case.DATE.search.THEN {
          THEN(final CaseImpl.WHEN parent, final data.DATE value) {
            super(parent.root, parent, value);
          }

          @Override
          public final Case.DATE.ELSE ELSE(final data.DATE date) {
            return new DATE.ELSE(this, date);
          }

          @Override
          public final Case.DATE.ELSE ELSE(final LocalDate date) {
            return new DATE.ELSE(this, data.wrap(date));
          }

          @Override
          public final Case.DATE.search.WHEN WHEN(final Condition condition) {
            return new DATE.Search.WHEN<>(this, condition);
          }
        }
      }

      static final class ELSE extends CaseImpl.ELSE implements Case.DATE.ELSE {
        ELSE(final THEN_ELSE parent, final data.DATE value) {
          super(parent.root, parent, value);
        }

        @Override
        public final data.DATE END() {
          final data.DATE column = (data.DATE)((THEN_ELSE)parent).getColumn().clone();
          return column.wrap(this);
        }
      }
    }

    static final class TIME {
      static final class Simple implements Case.TIME.simple {
        static final class WHEN extends CaseImpl.WHEN implements Case.TIME.simple.WHEN {
          WHEN(final CaseImpl.CASE_THEN parent, final data.Column when) {
            super(parent, parent, when);
          }

          @Override
          public Case.TIME.simple.THEN THEN(final data.TIME time) {
            return new TIME.Simple.THEN<>(this, time);
          }

          @Override
          public Case.TIME.simple.THEN THEN(final LocalTime time) {
            return new TIME.Simple.THEN<>(this, data.wrap(time));
          }
        }

        static final class THEN extends CaseImpl.THEN implements Case.TIME.simple.THEN {
          THEN(final CaseImpl.WHEN parent, final data.TIME value) {
            super(parent.root, parent, value);
          }

          @Override
          public Case.TIME.ELSE ELSE(final data.TIME time) {
            return new TIME.ELSE(this, time);
          }

          @Override
          public Case.TIME.ELSE ELSE(final LocalTime time) {
            return new TIME.ELSE(this, data.wrap(time));
          }

          @Override
          public final Case.TIME.simple.WHEN WHEN(final T condition) {
            return new TIME.Simple.WHEN<>(this, data.wrap(condition));
          }
        }
      }

      static final class Search implements Case.TIME.search {
        static final class WHEN extends CaseImpl.WHEN implements Case.TIME.search.WHEN {
          WHEN(final CaseImpl.CASE_THEN parent, final data.Column when) {
            super(parent, parent, when);
          }

          @Override
          public final Case.TIME.search.THEN THEN(final data.TIME time) {
            return new TIME.Search.THEN<>(this, time);
          }

          @Override
          public final Case.TIME.search.THEN THEN(final LocalTime time) {
            return new TIME.Search.THEN<>(this, data.wrap(time));
          }
        }

        static final class THEN extends CaseImpl.THEN implements Case.TIME.search.THEN {
          THEN(final CaseImpl.WHEN parent, final data.TIME value) {
            super(parent.root, parent, value);
          }

          @Override
          public final Case.TIME.ELSE ELSE(final data.TIME time) {
            return new TIME.ELSE(this, time);
          }

          @Override
          public final Case.TIME.ELSE ELSE(final LocalTime time) {
            return new TIME.ELSE(this, data.wrap(time));
          }

          @Override
          public final Case.TIME.search.WHEN WHEN(final Condition condition) {
            return new TIME.Search.WHEN<>(this, condition);
          }
        }
      }

      static final class ELSE extends CaseImpl.ELSE implements Case.TIME.ELSE {
        ELSE(final THEN_ELSE parent, final data.TIME value) {
          super(parent.root, parent, value);
        }

        @Override
        public final data.TIME END() {
          return (data.TIME)((THEN_ELSE)parent).getColumn().clone().wrap(this);
        }
      }
    }

    static final class DATETIME {
      static final class Simple implements Case.DATETIME.simple {
        static final class WHEN extends CaseImpl.WHEN implements Case.DATETIME.simple.WHEN {
          WHEN(final CaseImpl.CASE_THEN parent, final data.Column when) {
            super(parent, parent, when);
          }

          @Override
          public Case.DATETIME.simple.THEN THEN(final data.DATETIME dateTime) {
            return new DATETIME.Simple.THEN<>(this, dateTime);
          }

          @Override
          public Case.DATETIME.simple.THEN THEN(final LocalDateTime dateTime) {
            return new DATETIME.Simple.THEN<>(this, data.wrap(dateTime));
          }
        }

        static final class THEN extends CaseImpl.THEN implements Case.DATETIME.simple.THEN {
          THEN(final CaseImpl.WHEN parent, final data.DATETIME value) {
            super(parent.root, parent, value);
          }

          @Override
          public Case.DATETIME.ELSE ELSE(final data.DATETIME dateTime) {
            return new DATETIME.ELSE(this, dateTime);
          }

          @Override
          public Case.DATETIME.ELSE ELSE(final LocalDateTime dateTime) {
            return new DATETIME.ELSE(this, data.wrap(dateTime));
          }

          @Override
          public final Case.DATETIME.simple.WHEN WHEN(final T condition) {
            return new DATETIME.Simple.WHEN<>(this, data.wrap(condition));
          }
        }
      }

      static final class Search implements Case.DATETIME.search {
        static final class WHEN extends CaseImpl.WHEN implements Case.DATETIME.search.WHEN {
          WHEN(final CaseImpl.CASE_THEN parent, final data.Column when) {
            super(parent, parent, when);
          }

          @Override
          public final Case.DATETIME.search.THEN THEN(final data.DATETIME dateTime) {
            return new DATETIME.Search.THEN<>(this, dateTime);
          }

          @Override
          public final Case.DATETIME.search.THEN THEN(final LocalDateTime dateTime) {
            return new DATETIME.Search.THEN<>(this, data.wrap(dateTime));
          }
        }

        static final class THEN extends CaseImpl.THEN implements Case.DATETIME.search.THEN {
          THEN(final CaseImpl.WHEN parent, final data.DATETIME value) {
            super(parent.root, parent, value);
          }

          @Override
          public final Case.DATETIME.ELSE ELSE(final data.DATETIME dateTime) {
            return new DATETIME.ELSE(this, dateTime);
          }

          @Override
          public final Case.DATETIME.ELSE ELSE(final LocalDateTime dateTime) {
            return new DATETIME.ELSE(this, data.wrap(dateTime));
          }

          @Override
          public final Case.DATETIME.search.WHEN WHEN(final Condition condition) {
            return new DATETIME.Search.WHEN<>(this, condition);
          }
        }
      }

      static final class ELSE extends CaseImpl.ELSE implements Case.DATETIME.ELSE {
        ELSE(final THEN_ELSE parent, final data.DATETIME value) {
          super(parent.root, parent, value);
        }

        @Override
        public final data.DATETIME END() {
          return (data.DATETIME)((THEN_ELSE)parent).getColumn().clone().wrap(this);
        }
      }
    }

    static final class CHAR {
      static final class Simple implements Case.CHAR.simple {
        static final class WHEN extends CaseImpl.WHEN implements Case.CHAR.simple.WHEN {
          WHEN(final CaseImpl.CASE_THEN parent, final data.Column when) {
            super(parent, parent, when);
          }

          @Override
          public final Case.CHAR.simple.THEN THEN(final data.ENUM text) {
            return new CHAR.Simple.THEN<>(this, text);
          }

          @Override
          public final Case.CHAR.simple.THEN THEN(final data.CHAR text) {
            return new CHAR.Simple.THEN<>(this, text);
          }

          @Override
          public final Case.CHAR.simple.THEN THEN(final EntityEnum text) {
            return new CHAR.Simple.THEN<>(this, (data.Textual)data.wrap(text));
          }

          @Override
          public final Case.CHAR.simple.THEN THEN(final String text) {
            return new CHAR.Simple.THEN<>(this, (data.Textual)data.wrap(text));
          }
        }

        static final class THEN extends CaseImpl.THEN> implements Case.CHAR.simple.THEN {
          THEN(final CaseImpl.WHEN parent, final data.Textual value) {
            super(parent.root, parent, value);
          }

          @Override
          public final Case.CHAR.ELSE ELSE(final data.ENUM text) {
            return new CHAR.ELSE(this, text);
          }

          @Override
          public final Case.CHAR.ELSE ELSE(final data.CHAR text) {
            return new CHAR.ELSE(this, text);
          }

          @Override
          public final Case.CHAR.ELSE ELSE(final EntityEnum text) {
            return new CHAR.ELSE(this, (data.Textual)data.wrap(text.toString()));
          }

          @Override
          public final Case.CHAR.ELSE ELSE(final String text) {
            return new CHAR.ELSE(this, (data.Textual)data.wrap(text));
          }

          @Override
          public final Case.CHAR.simple.WHEN WHEN(final T condition) {
            return new CHAR.Simple.WHEN<>(this, data.wrap(condition));
          }
        }
      }

      static final class Search implements Case.CHAR.search {
        static final class WHEN extends CaseImpl.WHEN implements Case.CHAR.search.WHEN {
          WHEN(final CaseImpl.CASE_THEN parent, final data.Column when) {
            super(parent, parent, when);
          }

          @Override
          public final Case.CHAR.search.THEN THEN(final data.ENUM text) {
            return new CHAR.Search.THEN<>(this, text);
          }

          @Override
          public final Case.CHAR.search.THEN THEN(final data.CHAR text) {
            return new CHAR.Search.THEN<>(this, text);
          }

          @Override
          public final Case.CHAR.search.THEN THEN(final String text) {
            return new CHAR.Search.THEN<>(this, (data.Textual)data.wrap(text));
          }

          @Override
          public final Case.CHAR.search.THEN THEN(final EntityEnum text) {
            return new CHAR.Search.THEN<>(this, (data.Textual)data.wrap(text));
          }
        }

        static final class THEN extends CaseImpl.THEN> implements Case.CHAR.search.THEN {
          THEN(final CaseImpl.WHEN parent, final data.Textual value) {
            super(parent.root, parent, value);
          }

          @Override
          public final Case.CHAR.ELSE ELSE(final data.ENUM text) {
            return new CHAR.ELSE(this, text);
          }

          @Override
          public final Case.CHAR.ELSE ELSE(final data.CHAR text) {
            return new CHAR.ELSE(this, text);
          }

          @Override
          public final Case.CHAR.ELSE ELSE(final String text) {
            return new CHAR.ELSE(this, (data.Textual)data.wrap(text));
          }

          @Override
          public final Case.CHAR.ELSE ELSE(final EntityEnum text) {
            return new CHAR.ELSE(this, (data.Textual)data.wrap(text.toString()));
          }

          @Override
          public final Case.CHAR.search.WHEN WHEN(final Condition condition) {
            return new CHAR.Search.WHEN<>(this, condition);
          }
        }
      }

      static final class ELSE extends CaseImpl.ELSE> implements Case.CHAR.ELSE {
        ELSE(final THEN_ELSE parent, final data.Textual value) {
          super(parent.root, parent, value);
        }

        @Override
        public final data.CHAR END() {
          final data.Textual textual = (data.Textual)((THEN_ELSE)parent).getColumn();
          final data.CHAR column = textual instanceof data.CHAR ? (data.CHAR)textual.clone() : new data.CHAR(textual.length());
          return column.wrap(this);
        }
      }
    }

    static final class ENUM {
      static final class Simple implements Case.ENUM.simple {
        static final class WHEN extends CaseImpl.WHEN implements Case.ENUM.simple.WHEN {
          WHEN(final CaseImpl.CASE_THEN parent, final data.Column when) {
            super(parent, parent, when);
          }

          @Override
          public final Case.ENUM.simple.THEN THEN(final data.ENUM text) {
            return new ENUM.Simple.THEN<>(this, text);
          }

          @Override
          public final Case.CHAR.simple.THEN THEN(final data.CHAR text) {
            return new CHAR.Simple.THEN<>(this, text);
          }

          @Override
          public final Case.ENUM.simple.THEN THEN(final EntityEnum text) {
            return new ENUM.Simple.THEN<>(this, (data.Textual)data.wrap(text));
          }

          @Override
          public final Case.CHAR.simple.THEN THEN(final String text) {
            return new CHAR.Simple.THEN<>(this, (data.Textual)data.wrap(text));
          }
        }

        static final class THEN extends CaseImpl.THEN> implements Case.ENUM.simple.THEN {
          THEN(final CaseImpl.WHEN parent, final data.Textual value) {
            super(parent.root, parent, value);
          }

          @Override
          public final Case.ENUM.ELSE ELSE(final EntityEnum text) {
            return new ENUM.ELSE(this, (data.Textual)data.wrap(text));
          }

          @Override
          public final Case.ENUM.ELSE ELSE(final data.ENUM text) {
            return new ENUM.ELSE(this, text);
          }

          @Override
          public final Case.CHAR.ELSE ELSE(final data.CHAR text) {
            return new CHAR.ELSE(this, text);
          }

          @Override
          public final Case.CHAR.ELSE ELSE(final String text) {
            return new CHAR.ELSE(this, (data.Textual)data.wrap(text));
          }

          @Override
          public final Case.ENUM.simple.WHEN WHEN(final T condition) {
            return new ENUM.Simple.WHEN<>(this, data.wrap(condition));
          }
        }
      }

      static final class Search implements Case.ENUM.search {
        static final class WHEN extends CaseImpl.WHEN implements Case.ENUM.search.WHEN {
          WHEN(final CaseImpl.CASE_THEN parent, final data.Column when) {
            super(parent, parent, when);
          }

          @Override
          public final Case.ENUM.search.THEN THEN(final data.ENUM text) {
            return new ENUM.Search.THEN<>(this, text);
          }

          @Override
          public final Case.CHAR.search.THEN THEN(final data.CHAR text) {
            return new CHAR.Search.THEN<>(this, text);
          }

          @Override
          public final Case.CHAR.search.THEN THEN(final String text) {
            return new CHAR.Search.THEN<>(this, (data.Textual)data.wrap(text));
          }

          @Override
          public final Case.ENUM.search.THEN THEN(final EntityEnum text) {
            return new ENUM.Search.THEN<>(this, (data.Textual)data.wrap(text));
          }
        }

        static final class THEN extends CaseImpl.THEN> implements Case.ENUM.search.THEN {
          THEN(final CaseImpl.WHEN parent, final data.Textual value) {
            super(parent.root, parent, value);
          }

          @Override
          public final Case.ENUM.ELSE ELSE(final data.ENUM text) {
            return new ENUM.ELSE(this, text);
          }

          @Override
          public final Case.CHAR.ELSE ELSE(final data.CHAR text) {
            return new CHAR.ELSE(this, text);
          }

          @Override
          public final Case.CHAR.ELSE ELSE(final String text) {
            return new CHAR.ELSE(this, (data.Textual)data.wrap(text));
          }

          @Override
          public final Case.ENUM.ELSE ELSE(final EntityEnum text) {
            return new ENUM.ELSE(this, (data.ENUM)data.wrap(text));
          }

          @Override
          public final Case.ENUM.search.WHEN WHEN(final Condition condition) {
            return new ENUM.Search.WHEN<>(this, condition);
          }
        }
      }

      static final class ELSE extends CaseImpl.ELSE> implements Case.ENUM.ELSE {
        ELSE(final THEN_ELSE parent, final data.Textual value) {
          super(parent.root, parent, value);
        }

        @Override
        public final data.ENUM END() {
          return (data.ENUM)((THEN_ELSE)parent).getColumn().clone().wrap(this);
        }
      }
    }

    private CaseImpl() {
    }
  }
}