You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by al...@apache.org on 2017/01/27 22:18:40 UTC

[34/37] cassandra git commit: Make TableMetadata immutable, optimize Schema

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/Relation.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/Relation.java b/src/java/org/apache/cassandra/cql3/Relation.java
index 097b88e..1d27874 100644
--- a/src/java/org/apache/cassandra/cql3/Relation.java
+++ b/src/java/org/apache/cassandra/cql3/Relation.java
@@ -20,8 +20,8 @@ package org.apache.cassandra.cql3;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.cassandra.config.CFMetaData;
-import org.apache.cassandra.config.ColumnDefinition;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.cql3.restrictions.Restriction;
 import org.apache.cassandra.cql3.statements.Bound;
 import org.apache.cassandra.exceptions.InvalidRequestException;
@@ -132,31 +132,30 @@ public abstract class Relation
     /**
      * Converts this <code>Relation</code> into a <code>Restriction</code>.
      *
-     * @param cfm the Column Family meta data
+     * @param table the Column Family meta data
      * @param boundNames the variables specification where to collect the bind variables
      * @return the <code>Restriction</code> corresponding to this <code>Relation</code>
      * @throws InvalidRequestException if this <code>Relation</code> is not valid
      */
-    public final Restriction toRestriction(CFMetaData cfm,
-                                           VariableSpecifications boundNames) throws InvalidRequestException
+    public final Restriction toRestriction(TableMetadata table, VariableSpecifications boundNames)
     {
         switch (relationType)
         {
-            case EQ: return newEQRestriction(cfm, boundNames);
-            case LT: return newSliceRestriction(cfm, boundNames, Bound.END, false);
-            case LTE: return newSliceRestriction(cfm, boundNames, Bound.END, true);
-            case GTE: return newSliceRestriction(cfm, boundNames, Bound.START, true);
-            case GT: return newSliceRestriction(cfm, boundNames, Bound.START, false);
-            case IN: return newINRestriction(cfm, boundNames);
-            case CONTAINS: return newContainsRestriction(cfm, boundNames, false);
-            case CONTAINS_KEY: return newContainsRestriction(cfm, boundNames, true);
-            case IS_NOT: return newIsNotRestriction(cfm, boundNames);
+            case EQ: return newEQRestriction(table, boundNames);
+            case LT: return newSliceRestriction(table, boundNames, Bound.END, false);
+            case LTE: return newSliceRestriction(table, boundNames, Bound.END, true);
+            case GTE: return newSliceRestriction(table, boundNames, Bound.START, true);
+            case GT: return newSliceRestriction(table, boundNames, Bound.START, false);
+            case IN: return newINRestriction(table, boundNames);
+            case CONTAINS: return newContainsRestriction(table, boundNames, false);
+            case CONTAINS_KEY: return newContainsRestriction(table, boundNames, true);
+            case IS_NOT: return newIsNotRestriction(table, boundNames);
             case LIKE_PREFIX:
             case LIKE_SUFFIX:
             case LIKE_CONTAINS:
             case LIKE_MATCHES:
             case LIKE:
-                return newLikeRestriction(cfm, boundNames, relationType);
+                return newLikeRestriction(table, boundNames, relationType);
             default: throw invalidRequest("Unsupported \"!=\" relation: %s", this);
         }
     }
@@ -164,59 +163,52 @@ public abstract class Relation
     /**
      * Creates a new EQ restriction instance.
      *
-     * @param cfm the Column Family meta data
+     * @param table the table meta data
      * @param boundNames the variables specification where to collect the bind variables
      * @return a new EQ restriction instance.
      * @throws InvalidRequestException if the relation cannot be converted into an EQ restriction.
      */
-    protected abstract Restriction newEQRestriction(CFMetaData cfm,
-                                                    VariableSpecifications boundNames) throws InvalidRequestException;
+    protected abstract Restriction newEQRestriction(TableMetadata table, VariableSpecifications boundNames);
 
     /**
      * Creates a new IN restriction instance.
      *
-     * @param cfm the Column Family meta data
+     * @param table the table meta data
      * @param boundNames the variables specification where to collect the bind variables
      * @return a new IN restriction instance
      * @throws InvalidRequestException if the relation cannot be converted into an IN restriction.
      */
-    protected abstract Restriction newINRestriction(CFMetaData cfm,
-                                                    VariableSpecifications boundNames) throws InvalidRequestException;
+    protected abstract Restriction newINRestriction(TableMetadata table, VariableSpecifications boundNames);
 
     /**
      * Creates a new Slice restriction instance.
      *
-     * @param cfm the Column Family meta data
+     * @param table the table meta data
      * @param boundNames the variables specification where to collect the bind variables
      * @param bound the slice bound
      * @param inclusive <code>true</code> if the bound is included.
      * @return a new slice restriction instance
      * @throws InvalidRequestException if the <code>Relation</code> is not valid
      */
-    protected abstract Restriction newSliceRestriction(CFMetaData cfm,
+    protected abstract Restriction newSliceRestriction(TableMetadata table,
                                                        VariableSpecifications boundNames,
                                                        Bound bound,
-                                                       boolean inclusive) throws InvalidRequestException;
+                                                       boolean inclusive);
 
     /**
      * Creates a new Contains restriction instance.
      *
-     * @param cfm the Column Family meta data
+     * @param table the table meta data
      * @param boundNames the variables specification where to collect the bind variables
      * @param isKey <code>true</code> if the restriction to create is a CONTAINS KEY
      * @return a new Contains <code>Restriction</code> instance
      * @throws InvalidRequestException if the <code>Relation</code> is not valid
      */
-    protected abstract Restriction newContainsRestriction(CFMetaData cfm,
-                                                          VariableSpecifications boundNames,
-                                                          boolean isKey) throws InvalidRequestException;
+    protected abstract Restriction newContainsRestriction(TableMetadata table, VariableSpecifications boundNames, boolean isKey);
 
-    protected abstract Restriction newIsNotRestriction(CFMetaData cfm,
-                                                       VariableSpecifications boundNames) throws InvalidRequestException;
+    protected abstract Restriction newIsNotRestriction(TableMetadata table, VariableSpecifications boundNames);
 
-    protected abstract Restriction newLikeRestriction(CFMetaData cfm,
-                                                      VariableSpecifications boundNames,
-                                                      Operator operator) throws InvalidRequestException;
+    protected abstract Restriction newLikeRestriction(TableMetadata table, VariableSpecifications boundNames, Operator operator);
 
     /**
      * Converts the specified <code>Raw</code> into a <code>Term</code>.
@@ -231,8 +223,7 @@ public abstract class Relation
     protected abstract Term toTerm(List<? extends ColumnSpecification> receivers,
                                    Term.Raw raw,
                                    String keyspace,
-                                   VariableSpecifications boundNames)
-                                   throws InvalidRequestException;
+                                   VariableSpecifications boundNames);
 
     /**
      * Converts the specified <code>Raw</code> terms into a <code>Term</code>s.
@@ -247,7 +238,7 @@ public abstract class Relation
     protected final List<Term> toTerms(List<? extends ColumnSpecification> receivers,
                                        List<? extends Term.Raw> raws,
                                        String keyspace,
-                                       VariableSpecifications boundNames) throws InvalidRequestException
+                                       VariableSpecifications boundNames)
     {
         if (raws == null)
             return null;
@@ -266,5 +257,5 @@ public abstract class Relation
      * @return this object, if the old identifier is not in the set of entities that this relation covers; otherwise
      *         a new Relation with "from" replaced by "to" is returned.
      */
-    public abstract Relation renameIdentifier(ColumnDefinition.Raw from, ColumnDefinition.Raw to);
+    public abstract Relation renameIdentifier(ColumnMetadata.Raw from, ColumnMetadata.Raw to);
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/Sets.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/Sets.java b/src/java/org/apache/cassandra/cql3/Sets.java
index e79bda7..2920ed7 100644
--- a/src/java/org/apache/cassandra/cql3/Sets.java
+++ b/src/java/org/apache/cassandra/cql3/Sets.java
@@ -24,7 +24,7 @@ import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.StreamSupport;
 
-import org.apache.cassandra.config.ColumnDefinition;
+import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.cql3.functions.Function;
 import org.apache.cassandra.db.DecoratedKey;
 import org.apache.cassandra.db.rows.*;
@@ -301,7 +301,7 @@ public abstract class Sets
 
     public static class Setter extends Operation
     {
-        public Setter(ColumnDefinition column, Term t)
+        public Setter(ColumnMetadata column, Term t)
         {
             super(column, t);
         }
@@ -321,7 +321,7 @@ public abstract class Sets
 
     public static class Adder extends Operation
     {
-        public Adder(ColumnDefinition column, Term t)
+        public Adder(ColumnMetadata column, Term t)
         {
             super(column, t);
         }
@@ -334,7 +334,7 @@ public abstract class Sets
                 doAdd(value, column, params);
         }
 
-        static void doAdd(Term.Terminal value, ColumnDefinition column, UpdateParameters params) throws InvalidRequestException
+        static void doAdd(Term.Terminal value, ColumnMetadata column, UpdateParameters params) throws InvalidRequestException
         {
             if (column.type.isMultiCell())
             {
@@ -363,7 +363,7 @@ public abstract class Sets
     // Note that this is reused for Map subtraction too (we subtract a set from a map)
     public static class Discarder extends Operation
     {
-        public Discarder(ColumnDefinition column, Term t)
+        public Discarder(ColumnMetadata column, Term t)
         {
             super(column, t);
         }
@@ -388,7 +388,7 @@ public abstract class Sets
 
     public static class ElementDiscarder extends Operation
     {
-        public ElementDiscarder(ColumnDefinition column, Term k)
+        public ElementDiscarder(ColumnMetadata column, Term k)
         {
             super(column, k);
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/SingleColumnRelation.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/SingleColumnRelation.java b/src/java/org/apache/cassandra/cql3/SingleColumnRelation.java
index 719ef68..412eb16 100644
--- a/src/java/org/apache/cassandra/cql3/SingleColumnRelation.java
+++ b/src/java/org/apache/cassandra/cql3/SingleColumnRelation.java
@@ -21,8 +21,8 @@ import java.util.Collections;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.cassandra.config.CFMetaData;
-import org.apache.cassandra.config.ColumnDefinition;
+import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.cql3.Term.Raw;
 import org.apache.cassandra.cql3.restrictions.Restriction;
 import org.apache.cassandra.cql3.restrictions.SingleColumnRestriction;
@@ -44,12 +44,12 @@ import static org.apache.cassandra.cql3.statements.RequestValidations.invalidReq
  */
 public final class SingleColumnRelation extends Relation
 {
-    private final ColumnDefinition.Raw entity;
+    private final ColumnMetadata.Raw entity;
     private final Term.Raw mapKey;
     private final Term.Raw value;
     private final List<Term.Raw> inValues;
 
-    private SingleColumnRelation(ColumnDefinition.Raw entity, Term.Raw mapKey, Operator type, Term.Raw value, List<Term.Raw> inValues)
+    private SingleColumnRelation(ColumnMetadata.Raw entity, Term.Raw mapKey, Operator type, Term.Raw value, List<Term.Raw> inValues)
     {
         this.entity = entity;
         this.mapKey = mapKey;
@@ -69,7 +69,7 @@ public final class SingleColumnRelation extends Relation
      * @param type the type that describes how this entity relates to the value.
      * @param value the value being compared.
      */
-    public SingleColumnRelation(ColumnDefinition.Raw entity, Term.Raw mapKey, Operator type, Term.Raw value)
+    public SingleColumnRelation(ColumnMetadata.Raw entity, Term.Raw mapKey, Operator type, Term.Raw value)
     {
         this(entity, mapKey, type, value, null);
     }
@@ -81,7 +81,7 @@ public final class SingleColumnRelation extends Relation
      * @param type the type that describes how this entity relates to the value.
      * @param value the value being compared.
      */
-    public SingleColumnRelation(ColumnDefinition.Raw entity, Operator type, Term.Raw value)
+    public SingleColumnRelation(ColumnMetadata.Raw entity, Operator type, Term.Raw value)
     {
         this(entity, null, type, value);
     }
@@ -96,12 +96,12 @@ public final class SingleColumnRelation extends Relation
         return inValues;
     }
 
-    public static SingleColumnRelation createInRelation(ColumnDefinition.Raw entity, List<Term.Raw> inValues)
+    public static SingleColumnRelation createInRelation(ColumnMetadata.Raw entity, List<Term.Raw> inValues)
     {
         return new SingleColumnRelation(entity, null, Operator.IN, null, inValues);
     }
 
-    public ColumnDefinition.Raw getEntity()
+    public ColumnMetadata.Raw getEntity()
     {
         return entity;
     }
@@ -135,7 +135,7 @@ public final class SingleColumnRelation extends Relation
         }
     }
 
-    public Relation renameIdentifier(ColumnDefinition.Raw from, ColumnDefinition.Raw to)
+    public Relation renameIdentifier(ColumnMetadata.Raw from, ColumnMetadata.Raw to)
     {
         return entity.equals(from)
                ? new SingleColumnRelation(to, mapKey, operator(), value, inValues)
@@ -156,31 +156,29 @@ public final class SingleColumnRelation extends Relation
     }
 
     @Override
-    protected Restriction newEQRestriction(CFMetaData cfm,
-                                           VariableSpecifications boundNames) throws InvalidRequestException
+    protected Restriction newEQRestriction(TableMetadata table, VariableSpecifications boundNames)
     {
-        ColumnDefinition columnDef = entity.prepare(cfm);
+        ColumnMetadata columnDef = entity.prepare(table);
         if (mapKey == null)
         {
-            Term term = toTerm(toReceivers(columnDef), value, cfm.ksName, boundNames);
+            Term term = toTerm(toReceivers(columnDef), value, table.keyspace, boundNames);
             return new SingleColumnRestriction.EQRestriction(columnDef, term);
         }
         List<? extends ColumnSpecification> receivers = toReceivers(columnDef);
-        Term entryKey = toTerm(Collections.singletonList(receivers.get(0)), mapKey, cfm.ksName, boundNames);
-        Term entryValue = toTerm(Collections.singletonList(receivers.get(1)), value, cfm.ksName, boundNames);
+        Term entryKey = toTerm(Collections.singletonList(receivers.get(0)), mapKey, table.keyspace, boundNames);
+        Term entryValue = toTerm(Collections.singletonList(receivers.get(1)), value, table.keyspace, boundNames);
         return new SingleColumnRestriction.ContainsRestriction(columnDef, entryKey, entryValue);
     }
 
     @Override
-    protected Restriction newINRestriction(CFMetaData cfm,
-                                           VariableSpecifications boundNames) throws InvalidRequestException
+    protected Restriction newINRestriction(TableMetadata table, VariableSpecifications boundNames)
     {
-        ColumnDefinition columnDef = entity.prepare(cfm);
+        ColumnMetadata columnDef = entity.prepare(table);
         List<? extends ColumnSpecification> receivers = toReceivers(columnDef);
-        List<Term> terms = toTerms(receivers, inValues, cfm.ksName, boundNames);
+        List<Term> terms = toTerms(receivers, inValues, table.keyspace, boundNames);
         if (terms == null)
         {
-            Term term = toTerm(receivers, value, cfm.ksName, boundNames);
+            Term term = toTerm(receivers, value, table.keyspace, boundNames);
             return new SingleColumnRestriction.InRestrictionWithMarker(columnDef, (Lists.Marker) term);
         }
 
@@ -192,46 +190,46 @@ public final class SingleColumnRelation extends Relation
     }
 
     @Override
-    protected Restriction newSliceRestriction(CFMetaData cfm,
+    protected Restriction newSliceRestriction(TableMetadata table,
                                               VariableSpecifications boundNames,
                                               Bound bound,
-                                              boolean inclusive) throws InvalidRequestException
+                                              boolean inclusive)
     {
-        ColumnDefinition columnDef = entity.prepare(cfm);
+        ColumnMetadata columnDef = entity.prepare(table);
         checkFalse(columnDef.type instanceof DurationType, "Slice restriction are not supported on duration columns");
 
-        Term term = toTerm(toReceivers(columnDef), value, cfm.ksName, boundNames);
+        Term term = toTerm(toReceivers(columnDef), value, table.keyspace, boundNames);
         return new SingleColumnRestriction.SliceRestriction(columnDef, bound, inclusive, term);
     }
 
     @Override
-    protected Restriction newContainsRestriction(CFMetaData cfm,
+    protected Restriction newContainsRestriction(TableMetadata table,
                                                  VariableSpecifications boundNames,
                                                  boolean isKey) throws InvalidRequestException
     {
-        ColumnDefinition columnDef = entity.prepare(cfm);
-        Term term = toTerm(toReceivers(columnDef), value, cfm.ksName, boundNames);
+        ColumnMetadata columnDef = entity.prepare(table);
+        Term term = toTerm(toReceivers(columnDef), value, table.keyspace, boundNames);
         return new SingleColumnRestriction.ContainsRestriction(columnDef, term, isKey);
     }
 
     @Override
-    protected Restriction newIsNotRestriction(CFMetaData cfm,
+    protected Restriction newIsNotRestriction(TableMetadata table,
                                               VariableSpecifications boundNames) throws InvalidRequestException
     {
-        ColumnDefinition columnDef = entity.prepare(cfm);
+        ColumnMetadata columnDef = entity.prepare(table);
         // currently enforced by the grammar
         assert value == Constants.NULL_LITERAL : "Expected null literal for IS NOT relation: " + this.toString();
         return new SingleColumnRestriction.IsNotNullRestriction(columnDef);
     }
 
     @Override
-    protected Restriction newLikeRestriction(CFMetaData cfm, VariableSpecifications boundNames, Operator operator) throws InvalidRequestException
+    protected Restriction newLikeRestriction(TableMetadata table, VariableSpecifications boundNames, Operator operator)
     {
         if (mapKey != null)
             throw invalidRequest("%s can't be used with collections.", operator());
 
-        ColumnDefinition columnDef = entity.prepare(cfm);
-        Term term = toTerm(toReceivers(columnDef), value, cfm.ksName, boundNames);
+        ColumnMetadata columnDef = entity.prepare(table);
+        Term term = toTerm(toReceivers(columnDef), value, table.keyspace, boundNames);
 
         return new SingleColumnRestriction.LikeRestriction(columnDef, operator, term);
     }
@@ -242,7 +240,7 @@ public final class SingleColumnRelation extends Relation
      * @return the receivers for the specified relation.
      * @throws InvalidRequestException if the relation is invalid
      */
-    private List<? extends ColumnSpecification> toReceivers(ColumnDefinition columnDef) throws InvalidRequestException
+    private List<? extends ColumnSpecification> toReceivers(ColumnMetadata columnDef) throws InvalidRequestException
     {
         ColumnSpecification receiver = columnDef;
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/TokenRelation.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/TokenRelation.java b/src/java/org/apache/cassandra/cql3/TokenRelation.java
index 42464ef..62f603b 100644
--- a/src/java/org/apache/cassandra/cql3/TokenRelation.java
+++ b/src/java/org/apache/cassandra/cql3/TokenRelation.java
@@ -24,8 +24,8 @@ import java.util.stream.Collectors;
 
 import com.google.common.base.Joiner;
 
-import org.apache.cassandra.config.CFMetaData;
-import org.apache.cassandra.config.ColumnDefinition;
+import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.cql3.Term.Raw;
 import org.apache.cassandra.cql3.restrictions.Restriction;
 import org.apache.cassandra.cql3.restrictions.TokenRestriction;
@@ -47,11 +47,11 @@ import static org.apache.cassandra.cql3.statements.RequestValidations.invalidReq
  */
 public final class TokenRelation extends Relation
 {
-    private final List<ColumnDefinition.Raw> entities;
+    private final List<ColumnMetadata.Raw> entities;
 
     private final Term.Raw value;
 
-    public TokenRelation(List<ColumnDefinition.Raw> entities, Operator type, Term.Raw value)
+    public TokenRelation(List<ColumnMetadata.Raw> entities, Operator type, Term.Raw value)
     {
         this.entities = entities;
         this.relationType = type;
@@ -75,44 +75,44 @@ public final class TokenRelation extends Relation
     }
 
     @Override
-    protected Restriction newEQRestriction(CFMetaData cfm, VariableSpecifications boundNames) throws InvalidRequestException
+    protected Restriction newEQRestriction(TableMetadata table, VariableSpecifications boundNames)
     {
-        List<ColumnDefinition> columnDefs = getColumnDefinitions(cfm);
-        Term term = toTerm(toReceivers(cfm, columnDefs), value, cfm.ksName, boundNames);
-        return new TokenRestriction.EQRestriction(cfm, columnDefs, term);
+        List<ColumnMetadata> columnDefs = getColumnDefinitions(table);
+        Term term = toTerm(toReceivers(table, columnDefs), value, table.keyspace, boundNames);
+        return new TokenRestriction.EQRestriction(table, columnDefs, term);
     }
 
     @Override
-    protected Restriction newINRestriction(CFMetaData cfm, VariableSpecifications boundNames) throws InvalidRequestException
+    protected Restriction newINRestriction(TableMetadata table, VariableSpecifications boundNames)
     {
         throw invalidRequest("%s cannot be used with the token function", operator());
     }
 
     @Override
-    protected Restriction newSliceRestriction(CFMetaData cfm,
+    protected Restriction newSliceRestriction(TableMetadata table,
                                               VariableSpecifications boundNames,
                                               Bound bound,
-                                              boolean inclusive) throws InvalidRequestException
+                                              boolean inclusive)
     {
-        List<ColumnDefinition> columnDefs = getColumnDefinitions(cfm);
-        Term term = toTerm(toReceivers(cfm, columnDefs), value, cfm.ksName, boundNames);
-        return new TokenRestriction.SliceRestriction(cfm, columnDefs, bound, inclusive, term);
+        List<ColumnMetadata> columnDefs = getColumnDefinitions(table);
+        Term term = toTerm(toReceivers(table, columnDefs), value, table.keyspace, boundNames);
+        return new TokenRestriction.SliceRestriction(table, columnDefs, bound, inclusive, term);
     }
 
     @Override
-    protected Restriction newContainsRestriction(CFMetaData cfm, VariableSpecifications boundNames, boolean isKey) throws InvalidRequestException
+    protected Restriction newContainsRestriction(TableMetadata table, VariableSpecifications boundNames, boolean isKey)
     {
         throw invalidRequest("%s cannot be used with the token function", operator());
     }
 
     @Override
-    protected Restriction newIsNotRestriction(CFMetaData cfm, VariableSpecifications boundNames) throws InvalidRequestException
+    protected Restriction newIsNotRestriction(TableMetadata table, VariableSpecifications boundNames)
     {
         throw invalidRequest("%s cannot be used with the token function", operator());
     }
 
     @Override
-    protected Restriction newLikeRestriction(CFMetaData cfm, VariableSpecifications boundNames, Operator operator) throws InvalidRequestException
+    protected Restriction newLikeRestriction(TableMetadata table, VariableSpecifications boundNames, Operator operator)
     {
         throw invalidRequest("%s cannot be used with the token function", operator);
     }
@@ -128,12 +128,12 @@ public final class TokenRelation extends Relation
         return term;
     }
 
-    public Relation renameIdentifier(ColumnDefinition.Raw from, ColumnDefinition.Raw to)
+    public Relation renameIdentifier(ColumnMetadata.Raw from, ColumnMetadata.Raw to)
     {
         if (!entities.contains(from))
             return this;
 
-        List<ColumnDefinition.Raw> newEntities = entities.stream().map(e -> e.equals(from) ? to : e).collect(Collectors.toList());
+        List<ColumnMetadata.Raw> newEntities = entities.stream().map(e -> e.equals(from) ? to : e).collect(Collectors.toList());
         return new TokenRelation(newEntities, operator(), value);
     }
 
@@ -146,48 +146,48 @@ public final class TokenRelation extends Relation
     /**
      * Returns the definition of the columns to which apply the token restriction.
      *
-     * @param cfm the column family metadata
+     * @param table the table metadata
      * @return the definition of the columns to which apply the token restriction.
      * @throws InvalidRequestException if the entity cannot be resolved
      */
-    private List<ColumnDefinition> getColumnDefinitions(CFMetaData cfm) throws InvalidRequestException
+    private List<ColumnMetadata> getColumnDefinitions(TableMetadata table)
     {
-        List<ColumnDefinition> columnDefs = new ArrayList<>(entities.size());
-        for ( ColumnDefinition.Raw raw : entities)
-            columnDefs.add(raw.prepare(cfm));
+        List<ColumnMetadata> columnDefs = new ArrayList<>(entities.size());
+        for ( ColumnMetadata.Raw raw : entities)
+            columnDefs.add(raw.prepare(table));
         return columnDefs;
     }
 
     /**
      * Returns the receivers for this relation.
      *
-     * @param cfm the Column Family meta data
+     * @param table the table meta data
      * @param columnDefs the column definitions
      * @return the receivers for the specified relation.
      * @throws InvalidRequestException if the relation is invalid
      */
-    private static List<? extends ColumnSpecification> toReceivers(CFMetaData cfm,
-                                                                   List<ColumnDefinition> columnDefs)
+    private static List<? extends ColumnSpecification> toReceivers(TableMetadata table,
+                                                                   List<ColumnMetadata> columnDefs)
                                                                    throws InvalidRequestException
     {
 
-        if (!columnDefs.equals(cfm.partitionKeyColumns()))
+        if (!columnDefs.equals(table.partitionKeyColumns()))
         {
-            checkTrue(columnDefs.containsAll(cfm.partitionKeyColumns()),
+            checkTrue(columnDefs.containsAll(table.partitionKeyColumns()),
                       "The token() function must be applied to all partition key components or none of them");
 
             checkContainsNoDuplicates(columnDefs, "The token() function contains duplicate partition key components");
 
-            checkContainsOnly(columnDefs, cfm.partitionKeyColumns(), "The token() function must contains only partition key components");
+            checkContainsOnly(columnDefs, table.partitionKeyColumns(), "The token() function must contains only partition key components");
 
             throw invalidRequest("The token function arguments must be in the partition key order: %s",
-                                 Joiner.on(", ").join(ColumnDefinition.toIdentifiers(cfm.partitionKeyColumns())));
+                                 Joiner.on(", ").join(ColumnMetadata.toIdentifiers(table.partitionKeyColumns())));
         }
 
-        ColumnDefinition firstColumn = columnDefs.get(0);
+        ColumnMetadata firstColumn = columnDefs.get(0);
         return Collections.singletonList(new ColumnSpecification(firstColumn.ksName,
                                                                  firstColumn.cfName,
                                                                  new ColumnIdentifier("partition key token", true),
-                                                                 cfm.partitioner.getTokenValidator()));
+                                                                 table.partitioner.getTokenValidator()));
     }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/UntypedResultSet.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/UntypedResultSet.java b/src/java/org/apache/cassandra/cql3/UntypedResultSet.java
index d896071..9733830 100644
--- a/src/java/org/apache/cassandra/cql3/UntypedResultSet.java
+++ b/src/java/org/apache/cassandra/cql3/UntypedResultSet.java
@@ -22,17 +22,16 @@ import java.net.InetAddress;
 import java.nio.ByteBuffer;
 import java.util.*;
 
-import org.apache.cassandra.transport.ProtocolVersion;
-import org.apache.cassandra.utils.AbstractIterator;
-
-import org.apache.cassandra.config.CFMetaData;
-import org.apache.cassandra.config.ColumnDefinition;
+import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.cql3.statements.SelectStatement;
 import org.apache.cassandra.db.*;
-import org.apache.cassandra.db.rows.*;
-import org.apache.cassandra.db.partitions.PartitionIterator;
 import org.apache.cassandra.db.marshal.*;
+import org.apache.cassandra.db.partitions.PartitionIterator;
+import org.apache.cassandra.db.rows.*;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.service.pager.QueryPager;
+import org.apache.cassandra.transport.ProtocolVersion;
+import org.apache.cassandra.utils.AbstractIterator;
 import org.apache.cassandra.utils.FBUtilities;
 
 /** a utility for doing internal cql-based queries */
@@ -221,19 +220,19 @@ public abstract class UntypedResultSet implements Iterable<UntypedResultSet.Row>
                 data.put(names.get(i).name.toString(), columns.get(i));
         }
 
-        public static Row fromInternalRow(CFMetaData metadata, DecoratedKey key, org.apache.cassandra.db.rows.Row row)
+        public static Row fromInternalRow(TableMetadata metadata, DecoratedKey key, org.apache.cassandra.db.rows.Row row)
         {
             Map<String, ByteBuffer> data = new HashMap<>();
 
             ByteBuffer[] keyComponents = SelectStatement.getComponents(metadata, key);
-            for (ColumnDefinition def : metadata.partitionKeyColumns())
+            for (ColumnMetadata def : metadata.partitionKeyColumns())
                 data.put(def.name.toString(), keyComponents[def.position()]);
 
             Clustering clustering = row.clustering();
-            for (ColumnDefinition def : metadata.clusteringColumns())
+            for (ColumnMetadata def : metadata.clusteringColumns())
                 data.put(def.name.toString(), clustering.get(def.position()));
 
-            for (ColumnDefinition def : metadata.partitionColumns())
+            for (ColumnMetadata def : metadata.regularAndStaticColumns())
             {
                 if (def.isSimple())
                 {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/UpdateParameters.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/UpdateParameters.java b/src/java/org/apache/cassandra/cql3/UpdateParameters.java
index d065269..0be8f51 100644
--- a/src/java/org/apache/cassandra/cql3/UpdateParameters.java
+++ b/src/java/org/apache/cassandra/cql3/UpdateParameters.java
@@ -20,8 +20,8 @@ package org.apache.cassandra.cql3;
 import java.nio.ByteBuffer;
 import java.util.Map;
 
-import org.apache.cassandra.config.CFMetaData;
-import org.apache.cassandra.config.ColumnDefinition;
+import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.context.CounterContext;
 import org.apache.cassandra.db.filter.ColumnFilter;
@@ -35,8 +35,8 @@ import org.apache.cassandra.utils.FBUtilities;
  */
 public class UpdateParameters
 {
-    public final CFMetaData metadata;
-    public final PartitionColumns updatedColumns;
+    public final TableMetadata metadata;
+    public final RegularAndStaticColumns updatedColumns;
     public final QueryOptions options;
 
     private final int nowInSec;
@@ -54,8 +54,8 @@ public class UpdateParameters
     // The builder currently in use. Will alias either staticBuilder or regularBuilder, which are themselves built lazily.
     private Row.Builder builder;
 
-    public UpdateParameters(CFMetaData metadata,
-                            PartitionColumns updatedColumns,
+    public UpdateParameters(TableMetadata metadata,
+                            RegularAndStaticColumns updatedColumns,
                             QueryOptions options,
                             long timestamp,
                             int ttl,
@@ -124,27 +124,27 @@ public class UpdateParameters
         // the "compact" one. As such, deleting the row or deleting that single cell is equivalent. We favor the later
         // for backward compatibility (thought it doesn't truly matter anymore).
         if (metadata.isCompactTable() && builder.clustering() != Clustering.STATIC_CLUSTERING)
-            addTombstone(metadata.compactValueColumn());
+            addTombstone(metadata.compactValueColumn);
         else
             builder.addRowDeletion(Row.Deletion.regular(deletionTime));
     }
 
-    public void addTombstone(ColumnDefinition column) throws InvalidRequestException
+    public void addTombstone(ColumnMetadata column) throws InvalidRequestException
     {
         addTombstone(column, null);
     }
 
-    public void addTombstone(ColumnDefinition column, CellPath path) throws InvalidRequestException
+    public void addTombstone(ColumnMetadata column, CellPath path) throws InvalidRequestException
     {
         builder.addCell(BufferCell.tombstone(column, timestamp, nowInSec, path));
     }
 
-    public void addCell(ColumnDefinition column, ByteBuffer value) throws InvalidRequestException
+    public void addCell(ColumnMetadata column, ByteBuffer value) throws InvalidRequestException
     {
         addCell(column, null, value);
     }
 
-    public void addCell(ColumnDefinition column, CellPath path, ByteBuffer value) throws InvalidRequestException
+    public void addCell(ColumnMetadata column, CellPath path, ByteBuffer value) throws InvalidRequestException
     {
         Cell cell = ttl == LivenessInfo.NO_TTL
                   ? BufferCell.live(column, timestamp, value, path)
@@ -152,7 +152,7 @@ public class UpdateParameters
         builder.addCell(cell);
     }
 
-    public void addCounter(ColumnDefinition column, long increment) throws InvalidRequestException
+    public void addCounter(ColumnMetadata column, long increment) throws InvalidRequestException
     {
         assert ttl == LivenessInfo.NO_TTL;
 
@@ -168,12 +168,12 @@ public class UpdateParameters
         builder.addCell(BufferCell.live(column, timestamp, CounterContext.instance().createLocal(increment)));
     }
 
-    public void setComplexDeletionTime(ColumnDefinition column)
+    public void setComplexDeletionTime(ColumnMetadata column)
     {
         builder.addComplexDeletion(column, deletionTime);
     }
 
-    public void setComplexDeletionTimeForOverwrite(ColumnDefinition column)
+    public void setComplexDeletionTimeForOverwrite(ColumnMetadata column)
     {
         builder.addComplexDeletion(column, new DeletionTime(deletionTime.markedForDeleteAt() - 1, deletionTime.localDeletionTime()));
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/UserTypes.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/UserTypes.java b/src/java/org/apache/cassandra/cql3/UserTypes.java
index c8ddad0..9b87352 100644
--- a/src/java/org/apache/cassandra/cql3/UserTypes.java
+++ b/src/java/org/apache/cassandra/cql3/UserTypes.java
@@ -21,7 +21,7 @@ import java.nio.ByteBuffer;
 import java.util.*;
 import java.util.stream.Collectors;
 
-import org.apache.cassandra.config.ColumnDefinition;
+import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.cql3.functions.Function;
 import org.apache.cassandra.db.DecoratedKey;
 import org.apache.cassandra.db.marshal.*;
@@ -315,7 +315,7 @@ public abstract class UserTypes
 
     public static class Setter extends Operation
     {
-        public Setter(ColumnDefinition column, Term t)
+        public Setter(ColumnMetadata column, Term t)
         {
             super(column, t);
         }
@@ -361,7 +361,7 @@ public abstract class UserTypes
     {
         private final FieldIdentifier field;
 
-        public SetterByField(ColumnDefinition column, FieldIdentifier field, Term t)
+        public SetterByField(ColumnMetadata column, FieldIdentifier field, Term t)
         {
             super(column, t);
             this.field = field;
@@ -388,7 +388,7 @@ public abstract class UserTypes
     {
         private final FieldIdentifier field;
 
-        public DeleterByField(ColumnDefinition column, FieldIdentifier field)
+        public DeleterByField(ColumnMetadata column, FieldIdentifier field)
         {
             super(column, null);
             this.field = field;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/Validation.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/Validation.java b/src/java/org/apache/cassandra/cql3/Validation.java
index 3f388eb..34a4027 100644
--- a/src/java/org/apache/cassandra/cql3/Validation.java
+++ b/src/java/org/apache/cassandra/cql3/Validation.java
@@ -19,12 +19,9 @@ package org.apache.cassandra.cql3;
 
 import java.nio.ByteBuffer;
 
-import org.apache.cassandra.config.CFMetaData;
-import org.apache.cassandra.config.Schema;
-import org.apache.cassandra.config.SchemaConstants;
-import org.apache.cassandra.db.KeyspaceNotDefinedException;
-import org.apache.cassandra.serializers.MarshalException;
 import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.serializers.MarshalException;
 import org.apache.cassandra.utils.FBUtilities;
 
 /**
@@ -36,37 +33,6 @@ import org.apache.cassandra.utils.FBUtilities;
  */
 public abstract class Validation
 {
-    /**
-     * Retrieves the metadata for the provided keyspace and table name, throwing
-     * a meaningful user exception if those doen't exist.
-     *
-     * @param keyspaceName the keyspace name.
-     * @param tableName the table name.
-     * @return the metadata for table {@code keyspaceName.tableName} if it
-     * exists (otherwise an {@code InvalidRequestException} is thrown).
-     *
-     * @throws InvalidRequestException if the table requested doesn't exist.
-     */
-    public static CFMetaData validateColumnFamily(String keyspaceName, String tableName)
-    throws InvalidRequestException
-    {
-        validateKeyspace(keyspaceName);
-        if (tableName.isEmpty())
-            throw new InvalidRequestException("non-empty table is required");
-
-        CFMetaData metadata = Schema.instance.getCFMetaData(keyspaceName, tableName);
-        if (metadata == null)
-            throw new InvalidRequestException("unconfigured table " + tableName);
-
-        return metadata;
-    }
-
-    private static void validateKeyspace(String keyspaceName)
-    throws KeyspaceNotDefinedException
-    {
-        if (!Schema.instance.getKeyspaces().contains(keyspaceName))
-            throw new KeyspaceNotDefinedException("Keyspace " + keyspaceName + " does not exist");
-    }
 
     /**
      * Validates a (full serialized) partition key.
@@ -76,8 +42,7 @@ public abstract class Validation
      *
      * @throws InvalidRequestException if the provided {@code key} is invalid.
      */
-    public static void validateKey(CFMetaData metadata, ByteBuffer key)
-    throws InvalidRequestException
+    public static void validateKey(TableMetadata metadata, ByteBuffer key)
     {
         if (key == null || key.remaining() == 0)
             throw new InvalidRequestException("Key may not be empty");
@@ -92,26 +57,11 @@ public abstract class Validation
 
         try
         {
-            metadata.getKeyValidator().validate(key);
+            metadata.partitionKeyType.validate(key);
         }
         catch (MarshalException e)
         {
             throw new InvalidRequestException(e.getMessage());
         }
     }
-
-    /**
-     * Validates that the provided keyspace is not one of the system keyspace.
-     *
-     * @param keyspace the keyspace name to validate.
-     *
-     * @throws InvalidRequestException if {@code keyspace} is the name of a
-     * system keyspace.
-     */
-    public static void validateKeyspaceNotSystem(String keyspace)
-    throws InvalidRequestException
-    {
-        if (SchemaConstants.isSystemKeyspace(keyspace))
-            throw new InvalidRequestException(String.format("%s keyspace is not user-modifiable", keyspace));
-    }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/VariableSpecifications.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/VariableSpecifications.java b/src/java/org/apache/cassandra/cql3/VariableSpecifications.java
index 24f71e4..96290a6 100644
--- a/src/java/org/apache/cassandra/cql3/VariableSpecifications.java
+++ b/src/java/org/apache/cassandra/cql3/VariableSpecifications.java
@@ -17,24 +17,24 @@
  */
 package org.apache.cassandra.cql3;
 
-import org.apache.cassandra.config.CFMetaData;
-import org.apache.cassandra.config.ColumnDefinition;
-
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
+import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.TableMetadata;
+
 public class VariableSpecifications
 {
     private final List<ColumnIdentifier> variableNames;
     private final ColumnSpecification[] specs;
-    private final ColumnDefinition[] targetColumns;
+    private final ColumnMetadata[] targetColumns;
 
     public VariableSpecifications(List<ColumnIdentifier> variableNames)
     {
         this.variableNames = variableNames;
         this.specs = new ColumnSpecification[variableNames.size()];
-        this.targetColumns = new ColumnDefinition[variableNames.size()];
+        this.targetColumns = new ColumnMetadata[variableNames.size()];
     }
 
     /**
@@ -58,21 +58,21 @@ public class VariableSpecifications
 
     /**
      * Returns an array with the same length as the number of partition key columns for the table corresponding
-     * to cfm.  Each short in the array represents the bind index of the marker that holds the value for that
+     * to table.  Each short in the array represents the bind index of the marker that holds the value for that
      * partition key column.  If there are no bind markers for any of the partition key columns, null is returned.
      *
      * Callers of this method should ensure that all statements operate on the same table.
      */
-    public short[] getPartitionKeyBindIndexes(CFMetaData cfm)
+    public short[] getPartitionKeyBindIndexes(TableMetadata metadata)
     {
-        short[] partitionKeyPositions = new short[cfm.partitionKeyColumns().size()];
+        short[] partitionKeyPositions = new short[metadata.partitionKeyColumns().size()];
         boolean[] set = new boolean[partitionKeyPositions.length];
         for (int i = 0; i < targetColumns.length; i++)
         {
-            ColumnDefinition targetColumn = targetColumns[i];
+            ColumnMetadata targetColumn = targetColumns[i];
             if (targetColumn != null && targetColumn.isPartitionKey())
             {
-                assert targetColumn.ksName.equals(cfm.ksName) && targetColumn.cfName.equals(cfm.cfName);
+                assert targetColumn.ksName.equals(metadata.keyspace) && targetColumn.cfName.equals(metadata.name);
                 partitionKeyPositions[targetColumn.position()] = (short) i;
                 set[targetColumn.position()] = true;
             }
@@ -87,8 +87,8 @@ public class VariableSpecifications
 
     public void add(int bindIndex, ColumnSpecification spec)
     {
-        if (spec instanceof ColumnDefinition)
-            targetColumns[bindIndex] = (ColumnDefinition) spec;
+        if (spec instanceof ColumnMetadata)
+            targetColumns[bindIndex] = (ColumnMetadata) spec;
 
         ColumnIdentifier bindMarkerName = variableNames.get(bindIndex);
         // Use the user name, if there is one

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/conditions/AbstractConditions.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/conditions/AbstractConditions.java b/src/java/org/apache/cassandra/cql3/conditions/AbstractConditions.java
index 9b6dd7e..0e2646e 100644
--- a/src/java/org/apache/cassandra/cql3/conditions/AbstractConditions.java
+++ b/src/java/org/apache/cassandra/cql3/conditions/AbstractConditions.java
@@ -19,7 +19,7 @@ package org.apache.cassandra.cql3.conditions;
 
 import java.util.List;
 
-import org.apache.cassandra.config.ColumnDefinition;
+import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.cql3.functions.Function;
 
 /**
@@ -32,7 +32,7 @@ abstract class AbstractConditions implements Conditions
     {
     }
 
-    public Iterable<ColumnDefinition> getColumns()
+    public Iterable<ColumnMetadata> getColumns()
     {
         return null;
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/conditions/ColumnCondition.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/conditions/ColumnCondition.java b/src/java/org/apache/cassandra/cql3/conditions/ColumnCondition.java
index cfd62f5..31b7185 100644
--- a/src/java/org/apache/cassandra/cql3/conditions/ColumnCondition.java
+++ b/src/java/org/apache/cassandra/cql3/conditions/ColumnCondition.java
@@ -22,13 +22,13 @@ import java.util.*;
 
 import com.google.common.collect.Iterators;
 
-import org.apache.cassandra.config.CFMetaData;
-import org.apache.cassandra.config.ColumnDefinition;
 import org.apache.cassandra.cql3.*;
 import org.apache.cassandra.cql3.Term.Terminal;
 import org.apache.cassandra.cql3.functions.Function;
 import org.apache.cassandra.db.rows.*;
 import org.apache.cassandra.db.marshal.*;
+import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
@@ -39,11 +39,11 @@ import static org.apache.cassandra.cql3.statements.RequestValidations.*;
  */
 public abstract class ColumnCondition
 {
-    public final ColumnDefinition column;
+    public final ColumnMetadata column;
     public final Operator operator;
     private final Terms terms;
 
-    private ColumnCondition(ColumnDefinition column, Operator op, Terms terms)
+    private ColumnCondition(ColumnMetadata column, Operator op, Terms terms)
     {
         this.column = column;
         this.operator = op;
@@ -116,7 +116,7 @@ public abstract class ColumnCondition
      */
     private static final class SimpleColumnCondition extends ColumnCondition
     {
-        public SimpleColumnCondition(ColumnDefinition column, Operator op, Terms values)
+        public SimpleColumnCondition(ColumnMetadata column, Operator op, Terms values)
         {
             super(column, op, values);
         }
@@ -140,7 +140,7 @@ public abstract class ColumnCondition
     {
         private final Term collectionElement;
 
-        public CollectionElementCondition(ColumnDefinition column, Term collectionElement, Operator op, Terms values)
+        public CollectionElementCondition(ColumnMetadata column, Term collectionElement, Operator op, Terms values)
         {
             super(column, op, values);
             this.collectionElement = collectionElement;
@@ -171,7 +171,7 @@ public abstract class ColumnCondition
     {
         private final FieldIdentifier udtField;
 
-        public UDTFieldCondition(ColumnDefinition column, FieldIdentifier udtField, Operator op, Terms values)
+        public UDTFieldCondition(ColumnMetadata column, FieldIdentifier udtField, Operator op, Terms values)
         {
             super(column, op, values);
             assert udtField != null;
@@ -187,7 +187,7 @@ public abstract class ColumnCondition
     /**
      *  A regular column, simple condition.
      */
-    public static ColumnCondition condition(ColumnDefinition column, Operator op, Terms terms)
+    public static ColumnCondition condition(ColumnMetadata column, Operator op, Terms terms)
     {
         return new SimpleColumnCondition(column, op, terms);
     }
@@ -195,7 +195,7 @@ public abstract class ColumnCondition
     /**
      * A collection column, simple condition.
      */
-    public static ColumnCondition condition(ColumnDefinition column, Term collectionElement, Operator op, Terms terms)
+    public static ColumnCondition condition(ColumnMetadata column, Term collectionElement, Operator op, Terms terms)
     {
         return new CollectionElementCondition(column, collectionElement, op, terms);
     }
@@ -203,17 +203,17 @@ public abstract class ColumnCondition
     /**
      * A UDT column, simple condition.
      */
-    public static ColumnCondition condition(ColumnDefinition column, FieldIdentifier udtField, Operator op, Terms terms)
+    public static ColumnCondition condition(ColumnMetadata column, FieldIdentifier udtField, Operator op, Terms terms)
     {
         return new UDTFieldCondition(column, udtField, op, terms);
     }
 
     public static abstract class Bound
     {
-        public final ColumnDefinition column;
+        public final ColumnMetadata column;
         public final Operator comparisonOperator;
 
-        protected Bound(ColumnDefinition column, Operator operator)
+        protected Bound(ColumnMetadata column, Operator operator)
         {
             this.column = column;
             // If the operator is an IN we want to compare the value using an EQ.
@@ -257,21 +257,21 @@ public abstract class ColumnCondition
         }
     }
 
-    protected static final Cell getCell(Row row, ColumnDefinition column)
+    protected static final Cell getCell(Row row, ColumnMetadata column)
     {
         // If we're asking for a given cell, and we didn't got any row from our read, it's
         // the same as not having said cell.
         return row == null ? null : row.getCell(column);
     }
 
-    protected static final Cell getCell(Row row, ColumnDefinition column, CellPath path)
+    protected static final Cell getCell(Row row, ColumnMetadata column, CellPath path)
     {
         // If we're asking for a given cell, and we didn't got any row from our read, it's
         // the same as not having said cell.
         return row == null ? null : row.getCell(column, path);
     }
 
-    protected static final Iterator<Cell> getCells(Row row, ColumnDefinition column)
+    protected static final Iterator<Cell> getCells(Row row, ColumnMetadata column)
     {
         // If we're asking for a complex cells, and we didn't got any row from our read, it's
         // the same as not having any cells for that column.
@@ -312,7 +312,7 @@ public abstract class ColumnCondition
          */
         private final List<ByteBuffer> values;
 
-        private SimpleBound(ColumnDefinition column, Operator operator, List<ByteBuffer> values)
+        private SimpleBound(ColumnMetadata column, Operator operator, List<ByteBuffer> values)
         {
             super(column, operator);
             this.values = values;
@@ -356,10 +356,10 @@ public abstract class ColumnCondition
          */
         private final List<ByteBuffer> values;
 
-        private ElementAccessBound(ColumnDefinition column,
-                                     ByteBuffer collectionElement,
-                                     Operator operator,
-                                     List<ByteBuffer> values)
+        private ElementAccessBound(ColumnMetadata column,
+                                   ByteBuffer collectionElement,
+                                   Operator operator,
+                                   List<ByteBuffer> values)
         {
             super(column, operator);
 
@@ -452,7 +452,7 @@ public abstract class ColumnCondition
     {
         private final List<Term.Terminal> values;
 
-        public MultiCellCollectionBound(ColumnDefinition column, Operator operator, List<Term.Terminal> values)
+        public MultiCellCollectionBound(ColumnMetadata column, Operator operator, List<Term.Terminal> values)
         {
             super(column, operator);
             assert column.type.isMultiCell();
@@ -586,7 +586,7 @@ public abstract class ColumnCondition
          */
         private final List<ByteBuffer> values;
 
-        private UDTFieldAccessBound(ColumnDefinition column, FieldIdentifier field, Operator operator, List<ByteBuffer> values)
+        private UDTFieldAccessBound(ColumnMetadata column, FieldIdentifier field, Operator operator, List<ByteBuffer> values)
         {
             super(column, operator);
             assert column.type.isUDT() && field != null;
@@ -645,7 +645,7 @@ public abstract class ColumnCondition
          */
         private final ProtocolVersion protocolVersion;
 
-        private MultiCellUdtBound(ColumnDefinition column, Operator op, List<ByteBuffer> values, ProtocolVersion protocolVersion)
+        private MultiCellUdtBound(ColumnMetadata column, Operator op, List<ByteBuffer> values, ProtocolVersion protocolVersion)
         {
             super(column, op);
             assert column.type.isMultiCell();
@@ -756,7 +756,7 @@ public abstract class ColumnCondition
             return new Raw(null, null, inMarker, null, udtField, Operator.IN);
         }
 
-        public ColumnCondition prepare(String keyspace, ColumnDefinition receiver, CFMetaData cfm)
+        public ColumnCondition prepare(String keyspace, ColumnMetadata receiver, TableMetadata cfm)
         {
             if (receiver.type instanceof CounterColumnType)
                 throw invalidRequest("Conditions on counters are not supported");

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/conditions/ColumnConditions.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/conditions/ColumnConditions.java b/src/java/org/apache/cassandra/cql3/conditions/ColumnConditions.java
index b0378b7..3057b05 100644
--- a/src/java/org/apache/cassandra/cql3/conditions/ColumnConditions.java
+++ b/src/java/org/apache/cassandra/cql3/conditions/ColumnConditions.java
@@ -24,11 +24,11 @@ import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import org.apache.cassandra.config.ColumnDefinition;
 import org.apache.cassandra.cql3.QueryOptions;
 import org.apache.cassandra.cql3.functions.Function;
 import org.apache.cassandra.cql3.statements.CQL3CasRequest;
 import org.apache.cassandra.db.Clustering;
+import org.apache.cassandra.schema.ColumnMetadata;
 
 /**
  * A set of <code>ColumnCondition</code>s.
@@ -68,7 +68,7 @@ public final class ColumnConditions extends AbstractConditions
     }
 
     @Override
-    public Collection<ColumnDefinition> getColumns()
+    public Collection<ColumnMetadata> getColumns()
     {
         return Stream.concat(columnConditions.stream(), staticConditions.stream())
                      .map(e -> e.column)
@@ -136,7 +136,7 @@ public final class ColumnConditions extends AbstractConditions
          */
         public Builder add(ColumnCondition condition)
         {
-            List<ColumnCondition> conds = null;
+            List<ColumnCondition> conds;
             if (condition.column.isStatic())
             {
                 if (staticConditions.isEmpty())

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/conditions/Conditions.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/conditions/Conditions.java b/src/java/org/apache/cassandra/cql3/conditions/Conditions.java
index 0214fcf..1622be0 100644
--- a/src/java/org/apache/cassandra/cql3/conditions/Conditions.java
+++ b/src/java/org/apache/cassandra/cql3/conditions/Conditions.java
@@ -19,11 +19,11 @@ package org.apache.cassandra.cql3.conditions;
 
 import java.util.List;
 
-import org.apache.cassandra.config.ColumnDefinition;
 import org.apache.cassandra.cql3.QueryOptions;
 import org.apache.cassandra.cql3.functions.Function;
 import org.apache.cassandra.cql3.statements.CQL3CasRequest;
 import org.apache.cassandra.db.Clustering;
+import org.apache.cassandra.schema.ColumnMetadata;
 
 /**
  * Conditions that can be applied to a mutation statement.
@@ -56,7 +56,7 @@ public interface Conditions
      * Returns the column definitions to which apply the conditions.
      * @return the column definitions to which apply the conditions.
      */
-    Iterable<ColumnDefinition> getColumns();
+    Iterable<ColumnMetadata> getColumns();
 
     /**
      * Checks if this <code>Conditions</code> is empty.

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/functions/AbstractFunction.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/functions/AbstractFunction.java b/src/java/org/apache/cassandra/cql3/functions/AbstractFunction.java
index aa7555f..5e10e9f 100644
--- a/src/java/org/apache/cassandra/cql3/functions/AbstractFunction.java
+++ b/src/java/org/apache/cassandra/cql3/functions/AbstractFunction.java
@@ -22,10 +22,13 @@ import java.util.List;
 import com.google.common.base.Objects;
 
 import org.apache.cassandra.cql3.AssignmentTestable;
+import org.apache.cassandra.cql3.CQL3Type;
 import org.apache.cassandra.cql3.ColumnSpecification;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.commons.lang3.text.StrBuilder;
 
+import static java.util.stream.Collectors.toList;
+
 /**
  * Base class for our native/hardcoded functions.
  */
@@ -57,6 +60,14 @@ public abstract class AbstractFunction implements Function
         return returnType;
     }
 
+    public List<String> argumentsList()
+    {
+        return argTypes().stream()
+                         .map(AbstractType::asCQL3Type)
+                         .map(CQL3Type::toString)
+                         .collect(toList());
+    }
+
     @Override
     public boolean equals(Object o)
     {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/functions/FunctionName.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/functions/FunctionName.java b/src/java/org/apache/cassandra/cql3/functions/FunctionName.java
index aa980e9..be71d52 100644
--- a/src/java/org/apache/cassandra/cql3/functions/FunctionName.java
+++ b/src/java/org/apache/cassandra/cql3/functions/FunctionName.java
@@ -19,7 +19,7 @@ package org.apache.cassandra.cql3.functions;
 
 import com.google.common.base.Objects;
 
-import org.apache.cassandra.config.SchemaConstants;
+import org.apache.cassandra.schema.SchemaConstants;
 
 public final class FunctionName
 {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/functions/FunctionResolver.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/functions/FunctionResolver.java b/src/java/org/apache/cassandra/cql3/functions/FunctionResolver.java
index 7234d1f..9c7e85f 100644
--- a/src/java/org/apache/cassandra/cql3/functions/FunctionResolver.java
+++ b/src/java/org/apache/cassandra/cql3/functions/FunctionResolver.java
@@ -21,11 +21,11 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
-import org.apache.cassandra.config.Schema;
 import org.apache.cassandra.cql3.AbstractMarker;
 import org.apache.cassandra.cql3.AssignmentTestable;
 import org.apache.cassandra.cql3.ColumnIdentifier;
 import org.apache.cassandra.cql3.ColumnSpecification;
+import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 
@@ -70,7 +70,7 @@ public final class FunctionResolver
     throws InvalidRequestException
     {
         if (name.equalsNativeFunction(TOKEN_FUNCTION_NAME))
-            return new TokenFct(Schema.instance.getCFMetaData(receiverKs, receiverCf));
+            return new TokenFct(Schema.instance.getTableMetadata(receiverKs, receiverCf));
 
         // The toJson() function can accept any type of argument, so instances of it are not pre-declared.  Instead,
         // we create new instances as needed while handling selectors (which is the only place that toJson() is supported,

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/functions/OperationFcts.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/functions/OperationFcts.java b/src/java/org/apache/cassandra/cql3/functions/OperationFcts.java
index 1f115a9..0a039c0 100644
--- a/src/java/org/apache/cassandra/cql3/functions/OperationFcts.java
+++ b/src/java/org/apache/cassandra/cql3/functions/OperationFcts.java
@@ -22,7 +22,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
-import org.apache.cassandra.config.SchemaConstants;
+import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.db.marshal.*;
 import org.apache.cassandra.exceptions.OperationExecutionException;
 import org.apache.cassandra.transport.ProtocolVersion;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/functions/TokenFct.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/functions/TokenFct.java b/src/java/org/apache/cassandra/cql3/functions/TokenFct.java
index 1907641..e93084f 100644
--- a/src/java/org/apache/cassandra/cql3/functions/TokenFct.java
+++ b/src/java/org/apache/cassandra/cql3/functions/TokenFct.java
@@ -20,8 +20,8 @@ package org.apache.cassandra.cql3.functions;
 import java.nio.ByteBuffer;
 import java.util.List;
 
-import org.apache.cassandra.config.CFMetaData;
-import org.apache.cassandra.config.ColumnDefinition;
+import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.db.CBuilder;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.exceptions.InvalidRequestException;
@@ -29,26 +29,26 @@ import org.apache.cassandra.transport.ProtocolVersion;
 
 public class TokenFct extends NativeScalarFunction
 {
-    private final CFMetaData cfm;
+    private final TableMetadata metadata;
 
-    public TokenFct(CFMetaData cfm)
+    public TokenFct(TableMetadata metadata)
     {
-        super("token", cfm.partitioner.getTokenValidator(), getKeyTypes(cfm));
-        this.cfm = cfm;
+        super("token", metadata.partitioner.getTokenValidator(), getKeyTypes(metadata));
+        this.metadata = metadata;
     }
 
-    private static AbstractType[] getKeyTypes(CFMetaData cfm)
+    private static AbstractType[] getKeyTypes(TableMetadata metadata)
     {
-        AbstractType[] types = new AbstractType[cfm.partitionKeyColumns().size()];
+        AbstractType[] types = new AbstractType[metadata.partitionKeyColumns().size()];
         int i = 0;
-        for (ColumnDefinition def : cfm.partitionKeyColumns())
+        for (ColumnMetadata def : metadata.partitionKeyColumns())
             types[i++] = def.type;
         return types;
     }
 
     public ByteBuffer execute(ProtocolVersion protocolVersion, List<ByteBuffer> parameters) throws InvalidRequestException
     {
-        CBuilder builder = CBuilder.create(cfm.getKeyValidatorAsClusteringComparator());
+        CBuilder builder = CBuilder.create(metadata.partitionKeyAsClusteringComparator());
         for (int i = 0; i < parameters.size(); i++)
         {
             ByteBuffer bb = parameters.get(i);
@@ -56,6 +56,6 @@ public class TokenFct extends NativeScalarFunction
                 return null;
             builder.add(bb);
         }
-        return cfm.partitioner.getTokenFactory().toByteArray(cfm.partitioner.getToken(CFMetaData.serializePartitionKey(builder.build())));
+        return metadata.partitioner.getTokenFactory().toByteArray(metadata.partitioner.getToken(builder.build().serializeAsPartitionKey()));
     }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/functions/UDFunction.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/functions/UDFunction.java b/src/java/org/apache/cassandra/cql3/functions/UDFunction.java
index f8af619..b6fedcc 100644
--- a/src/java/org/apache/cassandra/cql3/functions/UDFunction.java
+++ b/src/java/org/apache/cassandra/cql3/functions/UDFunction.java
@@ -42,10 +42,9 @@ import org.slf4j.LoggerFactory;
 
 import com.datastax.driver.core.DataType;
 import com.datastax.driver.core.TypeCodec;
-import com.datastax.driver.core.UserType;
 import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.config.Schema;
+import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.cql3.ColumnIdentifier;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.exceptions.FunctionExecutionException;
@@ -53,10 +52,8 @@ import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.schema.Functions;
 import org.apache.cassandra.schema.KeyspaceMetadata;
 import org.apache.cassandra.service.ClientWarn;
-import org.apache.cassandra.service.MigrationManager;
 import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.transport.ProtocolVersion;
-import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.JVMStabilityInspector;
 
 /**
@@ -212,7 +209,7 @@ public abstract class UDFunction extends AbstractFunction implements ScalarFunct
         this.argCodecs = UDHelper.codecsFor(argDataTypes);
         this.returnCodec = UDHelper.codecFor(returnDataType);
         this.calledOnNullInput = calledOnNullInput;
-        KeyspaceMetadata keyspaceMetadata = Schema.instance.getKSMetaData(name.keyspace);
+        KeyspaceMetadata keyspaceMetadata = Schema.instance.getKeyspaceMetadata(name.keyspace);
         this.udfContext = new UDFContextImpl(argNames, argCodecs, returnCodec,
                                              keyspaceMetadata);
     }
@@ -605,37 +602,6 @@ public abstract class UDFunction extends AbstractFunction implements ScalarFunct
         return Objects.hashCode(name, Functions.typeHashCode(argTypes), Functions.typeHashCode(returnType), returnType, language, body);
     }
 
-    public void userTypeUpdated(String ksName, String typeName)
-    {
-        boolean updated = false;
-
-        for (int i = 0; i < argCodecs.length; i++)
-        {
-            DataType dataType = argCodecs[i].getCqlType();
-            if (dataType instanceof UserType)
-            {
-                UserType userType = (UserType) dataType;
-                if (userType.getKeyspace().equals(ksName) && userType.getTypeName().equals(typeName))
-                {
-                    KeyspaceMetadata ksm = Schema.instance.getKSMetaData(ksName);
-                    assert ksm != null;
-
-                    org.apache.cassandra.db.marshal.UserType ut = ksm.types.get(ByteBufferUtil.bytes(typeName)).get();
-
-                    DataType newUserType = UDHelper.driverType(ut);
-                    argCodecs[i] = UDHelper.codecFor(newUserType);
-
-                    argTypes.set(i, ut);
-
-                    updated = true;
-                }
-            }
-        }
-
-        if (updated)
-            MigrationManager.announceNewFunction(this, true);
-    }
-
     private static class UDFClassLoader extends ClassLoader
     {
         // insecureClassLoader is the C* class loader

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/restrictions/ClusteringColumnRestrictions.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/restrictions/ClusteringColumnRestrictions.java b/src/java/org/apache/cassandra/cql3/restrictions/ClusteringColumnRestrictions.java
index ed0d325..f537255 100644
--- a/src/java/org/apache/cassandra/cql3/restrictions/ClusteringColumnRestrictions.java
+++ b/src/java/org/apache/cassandra/cql3/restrictions/ClusteringColumnRestrictions.java
@@ -19,8 +19,8 @@ package org.apache.cassandra.cql3.restrictions;
 
 import java.util.*;
 
-import org.apache.cassandra.config.CFMetaData;
-import org.apache.cassandra.config.ColumnDefinition;
+import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.cql3.QueryOptions;
 import org.apache.cassandra.cql3.statements.Bound;
 import org.apache.cassandra.db.*;
@@ -47,14 +47,14 @@ final class ClusteringColumnRestrictions extends RestrictionSetWrapper
      */
     private final boolean allowFiltering;
 
-    public ClusteringColumnRestrictions(CFMetaData cfm)
+    public ClusteringColumnRestrictions(TableMetadata table)
     {
-        this(cfm, false);
+        this(table, false);
     }
 
-    public ClusteringColumnRestrictions(CFMetaData cfm, boolean allowFiltering)
+    public ClusteringColumnRestrictions(TableMetadata table, boolean allowFiltering)
     {
-        this(cfm.comparator, new RestrictionSet(), allowFiltering);
+        this(table.comparator, new RestrictionSet(), allowFiltering);
     }
 
     private ClusteringColumnRestrictions(ClusteringComparator comparator,
@@ -74,8 +74,8 @@ final class ClusteringColumnRestrictions extends RestrictionSetWrapper
         if (!isEmpty() && !allowFiltering)
         {
             SingleRestriction lastRestriction = restrictions.lastRestriction();
-            ColumnDefinition lastRestrictionStart = lastRestriction.getFirstColumn();
-            ColumnDefinition newRestrictionStart = restriction.getFirstColumn();
+            ColumnMetadata lastRestrictionStart = lastRestriction.getFirstColumn();
+            ColumnMetadata newRestrictionStart = restriction.getFirstColumn();
 
             checkFalse(lastRestriction.isSlice() && newRestrictionStart.position() > lastRestrictionStart.position(),
                        "Clustering column \"%s\" cannot be restricted (preceding column \"%s\" is restricted by a non-EQ relation)",

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/restrictions/CustomIndexExpression.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/restrictions/CustomIndexExpression.java b/src/java/org/apache/cassandra/cql3/restrictions/CustomIndexExpression.java
index eb91928..6ea6842 100644
--- a/src/java/org/apache/cassandra/cql3/restrictions/CustomIndexExpression.java
+++ b/src/java/org/apache/cassandra/cql3/restrictions/CustomIndexExpression.java
@@ -18,7 +18,7 @@
 
 package org.apache.cassandra.cql3.restrictions;
 
-import org.apache.cassandra.config.CFMetaData;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.cql3.*;
 import org.apache.cassandra.db.filter.RowFilter;
 import org.apache.cassandra.db.marshal.AbstractType;
@@ -38,21 +38,19 @@ public class CustomIndexExpression
         this.valueRaw = value;
     }
 
-    public void prepareValue(CFMetaData cfm, AbstractType<?> expressionType, VariableSpecifications boundNames)
+    public void prepareValue(TableMetadata table, AbstractType<?> expressionType, VariableSpecifications boundNames)
     {
-        ColumnSpecification spec = new ColumnSpecification(cfm.ksName, cfm.ksName, valueColId, expressionType);
-        value = valueRaw.prepare(cfm.ksName, spec);
+        ColumnSpecification spec = new ColumnSpecification(table.keyspace, table.keyspace, valueColId, expressionType);
+        value = valueRaw.prepare(table.keyspace, spec);
         value.collectMarkerSpecification(boundNames);
     }
 
-    public void addToRowFilter(RowFilter filter,
-                               CFMetaData cfm,
-                               QueryOptions options)
+    public void addToRowFilter(RowFilter filter, TableMetadata table, QueryOptions options)
     {
-        filter.addCustomIndexExpression(cfm,
-                                        cfm.getIndexes()
-                                           .get(targetIndex.getIdx())
-                                           .orElseThrow(() -> IndexRestrictions.indexNotFound(targetIndex, cfm)),
+        filter.addCustomIndexExpression(table,
+                                        table.indexes
+                                             .get(targetIndex.getIdx())
+                                             .orElseThrow(() -> IndexRestrictions.indexNotFound(targetIndex, table)),
                                         value.bindAndGet(options));
     }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/restrictions/IndexRestrictions.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/restrictions/IndexRestrictions.java b/src/java/org/apache/cassandra/cql3/restrictions/IndexRestrictions.java
index c7f6b5f..ced04ed 100644
--- a/src/java/org/apache/cassandra/cql3/restrictions/IndexRestrictions.java
+++ b/src/java/org/apache/cassandra/cql3/restrictions/IndexRestrictions.java
@@ -21,14 +21,14 @@ package org.apache.cassandra.cql3.restrictions;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.cassandra.config.CFMetaData;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.cql3.IndexName;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 
 public class IndexRestrictions
 {
-    public static final String INDEX_NOT_FOUND = "Invalid index expression, index %s not found for %s.%s";
-    public static final String INVALID_INDEX = "Target index %s cannot be used to query %s.%s";
+    public static final String INDEX_NOT_FOUND = "Invalid index expression, index %s not found for %s";
+    public static final String INVALID_INDEX = "Target index %s cannot be used to query %s";
     public static final String CUSTOM_EXPRESSION_NOT_SUPPORTED = "Index %s does not support custom expressions";
     public static final String NON_CUSTOM_INDEX_IN_EXPRESSION = "Only CUSTOM indexes may be used in custom index expressions, %s is not valid";
     public static final String MULTIPLE_EXPRESSIONS = "Multiple custom index expressions in a single query are not supported";
@@ -61,14 +61,14 @@ public class IndexRestrictions
         return customExpressions;
     }
 
-    static InvalidRequestException invalidIndex(IndexName indexName, CFMetaData cfm)
+    static InvalidRequestException invalidIndex(IndexName indexName, TableMetadata table)
     {
-        return new InvalidRequestException(String.format(INVALID_INDEX, indexName.getIdx(), cfm.ksName, cfm.cfName));
+        return new InvalidRequestException(String.format(INVALID_INDEX, indexName.getIdx(), table.toString()));
     }
 
-    static InvalidRequestException indexNotFound(IndexName indexName, CFMetaData cfm)
+    static InvalidRequestException indexNotFound(IndexName indexName, TableMetadata table)
     {
-        return new InvalidRequestException(String.format(INDEX_NOT_FOUND,indexName.getIdx(), cfm.ksName, cfm.cfName));
+        return new InvalidRequestException(String.format(INDEX_NOT_FOUND, indexName.getIdx(), table.toString()));
     }
 
     static InvalidRequestException nonCustomIndexInExpression(IndexName indexName)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/restrictions/MultiColumnRestriction.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/restrictions/MultiColumnRestriction.java b/src/java/org/apache/cassandra/cql3/restrictions/MultiColumnRestriction.java
index b0cbdff..bf10024 100644
--- a/src/java/org/apache/cassandra/cql3/restrictions/MultiColumnRestriction.java
+++ b/src/java/org/apache/cassandra/cql3/restrictions/MultiColumnRestriction.java
@@ -20,7 +20,7 @@ package org.apache.cassandra.cql3.restrictions;
 import java.nio.ByteBuffer;
 import java.util.*;
 
-import org.apache.cassandra.config.ColumnDefinition;
+import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.cql3.*;
 import org.apache.cassandra.cql3.Term.Terminal;
 import org.apache.cassandra.cql3.functions.Function;
@@ -40,9 +40,9 @@ public abstract class MultiColumnRestriction implements SingleRestriction
     /**
      * The columns to which the restriction apply.
      */
-    protected final List<ColumnDefinition> columnDefs;
+    protected final List<ColumnMetadata> columnDefs;
 
-    public MultiColumnRestriction(List<ColumnDefinition> columnDefs)
+    public MultiColumnRestriction(List<ColumnMetadata> columnDefs)
     {
         this.columnDefs = columnDefs;
     }
@@ -54,19 +54,19 @@ public abstract class MultiColumnRestriction implements SingleRestriction
     }
 
     @Override
-    public ColumnDefinition getFirstColumn()
+    public ColumnMetadata getFirstColumn()
     {
         return columnDefs.get(0);
     }
 
     @Override
-    public ColumnDefinition getLastColumn()
+    public ColumnMetadata getLastColumn()
     {
         return columnDefs.get(columnDefs.size() - 1);
     }
 
     @Override
-    public List<ColumnDefinition> getColumnDefs()
+    public List<ColumnMetadata> getColumnDefs()
     {
         return columnDefs;
     }
@@ -96,14 +96,14 @@ public abstract class MultiColumnRestriction implements SingleRestriction
      */
     protected final String getColumnsInCommons(Restriction otherRestriction)
     {
-        Set<ColumnDefinition> commons = new HashSet<>(getColumnDefs());
+        Set<ColumnMetadata> commons = new HashSet<>(getColumnDefs());
         commons.retainAll(otherRestriction.getColumnDefs());
         StringBuilder builder = new StringBuilder();
-        for (ColumnDefinition columnDefinition : commons)
+        for (ColumnMetadata columnMetadata : commons)
         {
             if (builder.length() != 0)
                 builder.append(" ,");
-            builder.append(columnDefinition.name);
+            builder.append(columnMetadata.name);
         }
         return builder.toString();
     }
@@ -130,7 +130,7 @@ public abstract class MultiColumnRestriction implements SingleRestriction
     {
         protected final Term value;
 
-        public EQRestriction(List<ColumnDefinition> columnDefs, Term value)
+        public EQRestriction(List<ColumnMetadata> columnDefs, Term value)
         {
             super(columnDefs);
             this.value = value;
@@ -158,7 +158,7 @@ public abstract class MultiColumnRestriction implements SingleRestriction
         @Override
         protected boolean isSupportedBy(Index index)
         {
-            for(ColumnDefinition column : columnDefs)
+            for(ColumnMetadata column : columnDefs)
                 if (index.supportsExpression(column, Operator.EQ))
                     return true;
             return false;
@@ -185,7 +185,7 @@ public abstract class MultiColumnRestriction implements SingleRestriction
 
             for (int i = 0, m = columnDefs.size(); i < m; i++)
             {
-                ColumnDefinition columnDef = columnDefs.get(i);
+                ColumnMetadata columnDef = columnDefs.get(i);
                 filter.add(columnDef, Operator.EQ, values.get(i));
             }
         }
@@ -193,7 +193,7 @@ public abstract class MultiColumnRestriction implements SingleRestriction
 
     public abstract static class INRestriction extends MultiColumnRestriction
     {
-        public INRestriction(List<ColumnDefinition> columnDefs)
+        public INRestriction(List<ColumnMetadata> columnDefs)
         {
             super(columnDefs);
         }
@@ -208,7 +208,7 @@ public abstract class MultiColumnRestriction implements SingleRestriction
             builder.addAllElementsToAll(splitInValues);
 
             if (builder.containsNull())
-                throw invalidRequest("Invalid null value in condition for columns: %s", ColumnDefinition.toIdentifiers(columnDefs));
+                throw invalidRequest("Invalid null value in condition for columns: %s", ColumnMetadata.toIdentifiers(columnDefs));
             return builder;
         }
 
@@ -228,7 +228,7 @@ public abstract class MultiColumnRestriction implements SingleRestriction
         @Override
         protected boolean isSupportedBy(Index index)
         {
-            for (ColumnDefinition column: columnDefs)
+            for (ColumnMetadata column: columnDefs)
                 if (index.supportsExpression(column, Operator.IN))
                     return true;
             return false;
@@ -253,7 +253,7 @@ public abstract class MultiColumnRestriction implements SingleRestriction
     {
         protected final List<Term> values;
 
-        public InRestrictionWithValues(List<ColumnDefinition> columnDefs, List<Term> values)
+        public InRestrictionWithValues(List<ColumnMetadata> columnDefs, List<Term> values)
         {
             super(columnDefs);
             this.values = values;
@@ -292,7 +292,7 @@ public abstract class MultiColumnRestriction implements SingleRestriction
     {
         protected final AbstractMarker marker;
 
-        public InRestrictionWithMarker(List<ColumnDefinition> columnDefs, AbstractMarker marker)
+        public InRestrictionWithMarker(List<ColumnMetadata> columnDefs, AbstractMarker marker)
         {
             super(columnDefs);
             this.marker = marker;
@@ -323,12 +323,12 @@ public abstract class MultiColumnRestriction implements SingleRestriction
     {
         private final TermSlice slice;
 
-        public SliceRestriction(List<ColumnDefinition> columnDefs, Bound bound, boolean inclusive, Term term)
+        public SliceRestriction(List<ColumnMetadata> columnDefs, Bound bound, boolean inclusive, Term term)
         {
             this(columnDefs, TermSlice.newInstance(bound, inclusive, term));
         }
 
-        SliceRestriction(List<ColumnDefinition> columnDefs, TermSlice slice)
+        SliceRestriction(List<ColumnMetadata> columnDefs, TermSlice slice)
         {
             super(columnDefs);
             this.slice = slice;
@@ -360,7 +360,7 @@ public abstract class MultiColumnRestriction implements SingleRestriction
 
             for (int i = 0, m = columnDefs.size(); i < m; i++)
             {
-                ColumnDefinition column = columnDefs.get(i);
+                ColumnMetadata column = columnDefs.get(i);
                 Bound b = bound.reverseIfNeeded(column);
 
                 // For mixed order columns, we need to create additional slices when 2 columns are in reverse order
@@ -410,7 +410,7 @@ public abstract class MultiColumnRestriction implements SingleRestriction
         @Override
         protected boolean isSupportedBy(Index index)
         {
-            for(ColumnDefinition def : columnDefs)
+            for(ColumnMetadata def : columnDefs)
                 if (slice.isSupportedBy(def, index))
                     return true;
             return false;
@@ -443,7 +443,7 @@ public abstract class MultiColumnRestriction implements SingleRestriction
 
             if (!getFirstColumn().equals(otherRestriction.getFirstColumn()))
             {
-                ColumnDefinition column = getFirstColumn().position() > otherRestriction.getFirstColumn().position()
+                ColumnMetadata column = getFirstColumn().position() > otherRestriction.getFirstColumn().position()
                         ? getFirstColumn() : otherRestriction.getFirstColumn();
 
                 throw invalidRequest("Column \"%s\" cannot be restricted by two inequalities not starting with the same column",
@@ -458,7 +458,7 @@ public abstract class MultiColumnRestriction implements SingleRestriction
                        getColumnsInCommons(otherRestriction));
 
             SliceRestriction otherSlice = (SliceRestriction) otherRestriction;
-            List<ColumnDefinition> newColumnDefs = columnDefs.size() >= otherSlice.columnDefs.size() ?  columnDefs : otherSlice.columnDefs;
+            List<ColumnMetadata> newColumnDefs = columnDefs.size() >= otherSlice.columnDefs.size() ? columnDefs : otherSlice.columnDefs;
 
             return new SliceRestriction(newColumnDefs, slice.merge(otherSlice.slice));
         }
@@ -507,7 +507,7 @@ public abstract class MultiColumnRestriction implements SingleRestriction
 
     public static class NotNullRestriction extends MultiColumnRestriction
     {
-        public NotNullRestriction(List<ColumnDefinition> columnDefs)
+        public NotNullRestriction(List<ColumnMetadata> columnDefs)
         {
             super(columnDefs);
             assert columnDefs.size() == 1;
@@ -540,7 +540,7 @@ public abstract class MultiColumnRestriction implements SingleRestriction
         @Override
         protected boolean isSupportedBy(Index index)
         {
-            for(ColumnDefinition column : columnDefs)
+            for(ColumnMetadata column : columnDefs)
                 if (index.supportsExpression(column, Operator.IS_NOT))
                     return true;
             return false;