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 2015/05/14 20:02:13 UTC

cassandra git commit: Remove DETERMINISTIC/NON DETERMINISTIC function distinction

Repository: cassandra
Updated Branches:
  refs/heads/trunk 6288dd9d2 -> b2abcb7fc


Remove DETERMINISTIC/NON DETERMINISTIC function distinction

patch by Carl Yeksigian; reviewed by Aleksey Yeschenko for
CASSANDRA-9383


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/b2abcb7f
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/b2abcb7f
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/b2abcb7f

Branch: refs/heads/trunk
Commit: b2abcb7fc9afde553a071c4050ba4573122c2329
Parents: 6288dd9
Author: Carl Yeksigian <ca...@apache.org>
Authored: Thu May 14 12:42:46 2015 -0400
Committer: Aleksey Yeschenko <al...@apache.org>
Committed: Thu May 14 21:02:23 2015 +0300

----------------------------------------------------------------------
 doc/cql3/CQL.textile                            |   3 -
 pylib/cqlshlib/cql3handling.py                  |   1 -
 src/java/org/apache/cassandra/cql3/Cql.g        |   8 +-
 .../cassandra/cql3/functions/Function.java      |   7 -
 .../cql3/functions/JavaSourceUDFFactory.java    |  12 +-
 .../cql3/functions/NativeFunction.java          |   6 -
 .../cql3/functions/ScriptBasedUDF.java          |   5 +-
 .../cassandra/cql3/functions/TimeuuidFcts.java  |   6 -
 .../cassandra/cql3/functions/UDAggregate.java   |   5 -
 .../cassandra/cql3/functions/UDFunction.java    |  34 +-
 .../cassandra/cql3/functions/UuidFcts.java      |   6 -
 .../statements/CreateFunctionStatement.java     |   5 +-
 .../cassandra/schema/LegacySchemaTables.java    |   5 +-
 .../org/apache/cassandra/cql3/UFAuthTest.java   | 319 +++----------------
 14 files changed, 65 insertions(+), 357 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/b2abcb7f/doc/cql3/CQL.textile
----------------------------------------------------------------------
diff --git a/doc/cql3/CQL.textile b/doc/cql3/CQL.textile
index 8a227fb..89bd1b9 100644
--- a/doc/cql3/CQL.textile
+++ b/doc/cql3/CQL.textile
@@ -590,7 +590,6 @@ __Syntax:__
 
 bc(syntax).. 
 <create-function-stmt> ::= CREATE ( OR REPLACE )? 
-                            ( ( NON )? DETERMINISTIC )?
                             FUNCTION ( IF NOT EXISTS )?
                             ( ( <keyspace> '.' )? <function-name> )?
                             '(' <arg-name> <arg-type> ( ',' <arg-name> <arg-type> )* ')'
@@ -618,8 +617,6 @@ CREATE FUNCTION akeyspace.fname IF NOT EXISTS
 
 @CREATE FUNCTION@ creates or replaces a user-defined function.
 
-Functions are either @DETERMINISTIC@ or @NON DETERMINISTIC@. A deterministic function always returns the same value for the same input values. A non-deterministic function may not. Examples of deterministic functions are math functions like _add_ or _sin_. Examples of non-deterministic functions are: _now_ or _random_. Functions are assumed to be deterministic by default.
-
 h4(#functionSignature). Function Signature
 
 Signatures are used to distinguish individual functions. The signature consists of:

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b2abcb7f/pylib/cqlshlib/cql3handling.py
----------------------------------------------------------------------
diff --git a/pylib/cqlshlib/cql3handling.py b/pylib/cqlshlib/cql3handling.py
index bc638b6..add4a7f 100644
--- a/pylib/cqlshlib/cql3handling.py
+++ b/pylib/cqlshlib/cql3handling.py
@@ -1023,7 +1023,6 @@ syntax_rules += r'''
 
 <createFunctionStatement> ::= "CREATE" ("OR" "REPLACE")? "FUNCTION"
                             ("IF" "NOT" "EXISTS")?
-                            ("NON"? "DETERMINISTIC")?
                             <userFunctionName>
                             ( "(" ( newcol=<cident> <storageType>
                               ( "," [newcolname]=<cident> <storageType> )* )?

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b2abcb7f/src/java/org/apache/cassandra/cql3/Cql.g
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/Cql.g b/src/java/org/apache/cassandra/cql3/Cql.g
index ca68396..bd47825 100644
--- a/src/java/org/apache/cassandra/cql3/Cql.g
+++ b/src/java/org/apache/cassandra/cql3/Cql.g
@@ -593,12 +593,10 @@ createFunctionStatement returns [CreateFunctionStatement expr]
         boolean orReplace = false;
         boolean ifNotExists = false;
 
-        boolean deterministic = true;
         List<ColumnIdentifier> argsNames = new ArrayList<>();
         List<CQL3Type.Raw> argsTypes = new ArrayList<>();
     }
     : K_CREATE (K_OR K_REPLACE { orReplace = true; })?
-      ((K_NON { deterministic = false; })? K_DETERMINISTIC)?
       K_FUNCTION
       (K_IF K_NOT K_EXISTS { ifNotExists = true; })?
       fn=functionName
@@ -611,7 +609,7 @@ createFunctionStatement returns [CreateFunctionStatement expr]
       K_RETURNS rt = comparatorType
       K_LANGUAGE language = IDENT
       K_AS body = STRING_LITERAL
-      { $expr = new CreateFunctionStatement(fn, $language.text.toLowerCase(), $body.text, deterministic, argsNames, argsTypes, rt, orReplace, ifNotExists); }
+      { $expr = new CreateFunctionStatement(fn, $language.text.toLowerCase(), $body.text, argsNames, argsTypes, rt, orReplace, ifNotExists); }
     ;
 
 dropFunctionStatement returns [DropFunctionStatement expr]
@@ -1550,8 +1548,6 @@ basic_unreserved_keyword returns [String str]
         | K_INITCOND
         | K_RETURNS
         | K_LANGUAGE
-        | K_NON
-        | K_DETERMINISTIC
         | K_JSON
         ) { $str = $k.text; }
     ;
@@ -1680,10 +1676,8 @@ K_FINALFUNC:   F I N A L F U N C;
 K_INITCOND:    I N I T C O N D;
 K_RETURNS:     R E T U R N S;
 K_LANGUAGE:    L A N G U A G E;
-K_NON:         N O N;
 K_OR:          O R;
 K_REPLACE:     R E P L A C E;
-K_DETERMINISTIC: D E T E R M I N I S T I C;
 
 K_JSON:        J S O N;
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b2abcb7f/src/java/org/apache/cassandra/cql3/functions/Function.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/functions/Function.java b/src/java/org/apache/cassandra/cql3/functions/Function.java
index 6fb9ba2..56119f7 100644
--- a/src/java/org/apache/cassandra/cql3/functions/Function.java
+++ b/src/java/org/apache/cassandra/cql3/functions/Function.java
@@ -30,13 +30,6 @@ public interface Function
     public AbstractType<?> returnType();
 
     /**
-     * Checks whether the function is a pure function (as in doesn't depend on, nor produce side effects) or not.
-     *
-     * @return <code>true</code> if the function is a pure function, <code>false</code> otherwise.
-     */
-    public boolean isPure();
-
-    /**
      * Checks whether the function is a native/hard coded one or not.
      *
      * @return <code>true</code> if the function is a native/hard coded one, <code>false</code> otherwise.

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b2abcb7f/src/java/org/apache/cassandra/cql3/functions/JavaSourceUDFFactory.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/functions/JavaSourceUDFFactory.java b/src/java/org/apache/cassandra/cql3/functions/JavaSourceUDFFactory.java
index 1abb40b..eddb2e6 100644
--- a/src/java/org/apache/cassandra/cql3/functions/JavaSourceUDFFactory.java
+++ b/src/java/org/apache/cassandra/cql3/functions/JavaSourceUDFFactory.java
@@ -52,8 +52,7 @@ public final class JavaSourceUDFFactory
                                List<ColumnIdentifier> argNames,
                                List<AbstractType<?>> argTypes,
                                AbstractType<?> returnType,
-                               String body,
-                               boolean deterministic)
+                               String body)
     throws InvalidRequestException
     {
         // argDataTypes is just the C* internal argTypes converted to the Java Driver DataType
@@ -99,11 +98,11 @@ public final class JavaSourceUDFFactory
                 cc.toClass().getDeclaredConstructor(
                    FunctionName.class, List.class, List.class, DataType[].class,
                    AbstractType.class, DataType.class,
-                   String.class, boolean.class);
+                   String.class);
             return (UDFunction) ctor.newInstance(
                    name, argNames, argTypes, argDataTypes,
                    returnType, returnDataType,
-                   body, deterministic);
+                   body);
         }
         catch (NotFoundException | CannotCompileException | NoSuchMethodException | LinkageError | InstantiationException | IllegalAccessException e)
         {
@@ -145,9 +144,8 @@ public final class JavaSourceUDFFactory
                "com.datastax.driver.core.DataType[] argDataTypes, " +
                "org.apache.cassandra.db.marshal.AbstractType returnType, " +
                "com.datastax.driver.core.DataType returnDataType, " +
-               "String body," +
-               "boolean deterministic)\n{" +
-               "  super(name, argNames, argTypes, argDataTypes, returnType, returnDataType, \"java\", body, deterministic);\n" +
+               "String body)\n{" +
+               "  super(name, argNames, argTypes, argDataTypes, returnType, returnDataType, \"java\", body);\n" +
                "}";
     }
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b2abcb7f/src/java/org/apache/cassandra/cql3/functions/NativeFunction.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/functions/NativeFunction.java b/src/java/org/apache/cassandra/cql3/functions/NativeFunction.java
index bff7688..df66ea0 100644
--- a/src/java/org/apache/cassandra/cql3/functions/NativeFunction.java
+++ b/src/java/org/apache/cassandra/cql3/functions/NativeFunction.java
@@ -31,12 +31,6 @@ public abstract class NativeFunction extends AbstractFunction
         super(FunctionName.nativeFunction(name), Arrays.asList(argTypes), returnType);
     }
 
-    // Most of our functions are pure, the other ones should override this
-    public boolean isPure()
-    {
-        return true;
-    }
-
     public boolean isNative()
     {
         return true;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b2abcb7f/src/java/org/apache/cassandra/cql3/functions/ScriptBasedUDF.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/functions/ScriptBasedUDF.java b/src/java/org/apache/cassandra/cql3/functions/ScriptBasedUDF.java
index 4fe6ac9..b38f483 100644
--- a/src/java/org/apache/cassandra/cql3/functions/ScriptBasedUDF.java
+++ b/src/java/org/apache/cassandra/cql3/functions/ScriptBasedUDF.java
@@ -67,11 +67,10 @@ public class ScriptBasedUDF extends UDFunction
                    List<AbstractType<?>> argTypes,
                    AbstractType<?> returnType,
                    String language,
-                   String body,
-                   boolean deterministic)
+                   String body)
     throws InvalidRequestException
     {
-        super(name, argNames, argTypes, returnType, language, body, deterministic);
+        super(name, argNames, argTypes, returnType, language, body);
 
         Compilable scriptEngine = scriptEngines.get(language);
         if (scriptEngine == null)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b2abcb7f/src/java/org/apache/cassandra/cql3/functions/TimeuuidFcts.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/functions/TimeuuidFcts.java b/src/java/org/apache/cassandra/cql3/functions/TimeuuidFcts.java
index c1c3490..d24572b 100644
--- a/src/java/org/apache/cassandra/cql3/functions/TimeuuidFcts.java
+++ b/src/java/org/apache/cassandra/cql3/functions/TimeuuidFcts.java
@@ -35,12 +35,6 @@ public abstract class TimeuuidFcts
         {
             return ByteBuffer.wrap(UUIDGen.getTimeUUIDBytes());
         }
-
-        @Override
-        public boolean isPure()
-        {
-            return false;
-        }
     };
 
     public static final Function minTimeuuidFct = new NativeScalarFunction("mintimeuuid", TimeUUIDType.instance, TimestampType.instance)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b2abcb7f/src/java/org/apache/cassandra/cql3/functions/UDAggregate.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/functions/UDAggregate.java b/src/java/org/apache/cassandra/cql3/functions/UDAggregate.java
index e4cbd55..f5a1af0 100644
--- a/src/java/org/apache/cassandra/cql3/functions/UDAggregate.java
+++ b/src/java/org/apache/cassandra/cql3/functions/UDAggregate.java
@@ -113,11 +113,6 @@ public class UDAggregate extends AbstractFunction implements AggregateFunction
         return true;
     }
 
-    public boolean isPure()
-    {
-        return false;
-    }
-
     public boolean isNative()
     {
         return false;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b2abcb7f/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 4672451..a56af6e 100644
--- a/src/java/org/apache/cassandra/cql3/functions/UDFunction.java
+++ b/src/java/org/apache/cassandra/cql3/functions/UDFunction.java
@@ -46,7 +46,6 @@ public abstract class UDFunction extends AbstractFunction implements ScalarFunct
 
     protected final String language;
     protected final String body;
-    protected final boolean isDeterministic;
 
     protected final DataType[] argDataTypes;
     protected final DataType returnDataType;
@@ -56,11 +55,10 @@ public abstract class UDFunction extends AbstractFunction implements ScalarFunct
                          List<AbstractType<?>> argTypes,
                          AbstractType<?> returnType,
                          String language,
-                         String body,
-                         boolean isDeterministic)
+                         String body)
     {
         this(name, argNames, argTypes, UDHelper.driverTypes(argTypes), returnType,
-             UDHelper.driverType(returnType), language, body, isDeterministic);
+             UDHelper.driverType(returnType), language, body);
     }
 
     protected UDFunction(FunctionName name,
@@ -70,15 +68,13 @@ public abstract class UDFunction extends AbstractFunction implements ScalarFunct
                          AbstractType<?> returnType,
                          DataType returnDataType,
                          String language,
-                         String body,
-                         boolean isDeterministic)
+                         String body)
     {
         super(name, argTypes, returnType);
         assert new HashSet<>(argNames).size() == argNames.size() : "duplicate argument names";
         this.argNames = argNames;
         this.language = language;
         this.body = body;
-        this.isDeterministic = isDeterministic;
         this.argDataTypes = argDataTypes;
         this.returnDataType = returnDataType;
     }
@@ -88,14 +84,13 @@ public abstract class UDFunction extends AbstractFunction implements ScalarFunct
                                     List<AbstractType<?>> argTypes,
                                     AbstractType<?> returnType,
                                     String language,
-                                    String body,
-                                    boolean isDeterministic)
+                                    String body)
     throws InvalidRequestException
     {
         switch (language)
         {
-            case "java": return JavaSourceUDFFactory.buildUDF(name, argNames, argTypes, returnType, body, isDeterministic);
-            default: return new ScriptBasedUDF(name, argNames, argTypes, returnType, language, body, isDeterministic);
+            case "java": return JavaSourceUDFFactory.buildUDF(name, argNames, argTypes, returnType, body);
+            default: return new ScriptBasedUDF(name, argNames, argTypes, returnType, language, body);
         }
     }
 
@@ -116,7 +111,7 @@ public abstract class UDFunction extends AbstractFunction implements ScalarFunct
                                                   String body,
                                                   final InvalidRequestException reason)
     {
-        return new UDFunction(name, argNames, argTypes, returnType, language, body, true)
+        return new UDFunction(name, argNames, argTypes, returnType, language, body)
         {
             public ByteBuffer execute(int protocolVersion, List<ByteBuffer> parameters) throws InvalidRequestException
             {
@@ -134,11 +129,6 @@ public abstract class UDFunction extends AbstractFunction implements ScalarFunct
         return false;
     }
 
-    public boolean isPure()
-    {
-        return isDeterministic;
-    }
-
     public boolean isNative()
     {
         return false;
@@ -149,11 +139,6 @@ public abstract class UDFunction extends AbstractFunction implements ScalarFunct
         return argNames;
     }
 
-    public boolean isDeterministic()
-    {
-        return isDeterministic;
-    }
-
     public String body()
     {
         return body;
@@ -201,14 +186,13 @@ public abstract class UDFunction extends AbstractFunction implements ScalarFunct
             && Functions.typeEquals(argTypes, that.argTypes)
             && Functions.typeEquals(returnType, that.returnType)
             && Objects.equal(language, that.language)
-            && Objects.equal(body, that.body)
-            && Objects.equal(isDeterministic, that.isDeterministic);
+            && Objects.equal(body, that.body);
     }
 
     @Override
     public int hashCode()
     {
-        return Objects.hashCode(name, argNames, argTypes, returnType, language, body, isDeterministic);
+        return Objects.hashCode(name, argNames, argTypes, returnType, language, body);
     }
 
     public void userTypeUpdated(String ksName, String typeName)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b2abcb7f/src/java/org/apache/cassandra/cql3/functions/UuidFcts.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/functions/UuidFcts.java b/src/java/org/apache/cassandra/cql3/functions/UuidFcts.java
index afb5aae..0aa3ac4 100644
--- a/src/java/org/apache/cassandra/cql3/functions/UuidFcts.java
+++ b/src/java/org/apache/cassandra/cql3/functions/UuidFcts.java
@@ -32,11 +32,5 @@ public abstract class UuidFcts
         {
             return UUIDSerializer.instance.serialize(UUID.randomUUID());
         }
-
-        @Override
-        public boolean isPure()
-        {
-            return false;
-        }
     };
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b2abcb7f/src/java/org/apache/cassandra/cql3/statements/CreateFunctionStatement.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/statements/CreateFunctionStatement.java b/src/java/org/apache/cassandra/cql3/statements/CreateFunctionStatement.java
index 4e1e03a..faab043 100644
--- a/src/java/org/apache/cassandra/cql3/statements/CreateFunctionStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/CreateFunctionStatement.java
@@ -45,7 +45,6 @@ public final class CreateFunctionStatement extends SchemaAlteringStatement
     private FunctionName functionName;
     private final String language;
     private final String body;
-    private final boolean deterministic;
 
     private final List<ColumnIdentifier> argNames;
     private final List<CQL3Type.Raw> argRawTypes;
@@ -59,7 +58,6 @@ public final class CreateFunctionStatement extends SchemaAlteringStatement
     public CreateFunctionStatement(FunctionName functionName,
                                    String language,
                                    String body,
-                                   boolean deterministic,
                                    List<ColumnIdentifier> argNames,
                                    List<CQL3Type.Raw> argRawTypes,
                                    CQL3Type.Raw rawReturnType,
@@ -69,7 +67,6 @@ public final class CreateFunctionStatement extends SchemaAlteringStatement
         this.functionName = functionName;
         this.language = language;
         this.body = body;
-        this.deterministic = deterministic;
         this.argNames = argNames;
         this.argRawTypes = argRawTypes;
         this.rawReturnType = rawReturnType;
@@ -161,7 +158,7 @@ public final class CreateFunctionStatement extends SchemaAlteringStatement
                                                                 functionName, returnType.asCQL3Type(), old.returnType().asCQL3Type()));
         }
 
-        this.udFunction = UDFunction.create(functionName, argNames, argTypes, returnType, language, body, deterministic);
+        this.udFunction = UDFunction.create(functionName, argNames, argTypes, returnType, language, body);
         this.replaced = old != null;
 
         MigrationManager.announceNewFunction(udFunction, isLocalOnly);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b2abcb7f/src/java/org/apache/cassandra/schema/LegacySchemaTables.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/schema/LegacySchemaTables.java b/src/java/org/apache/cassandra/schema/LegacySchemaTables.java
index 51040a1..4eb800b 100644
--- a/src/java/org/apache/cassandra/schema/LegacySchemaTables.java
+++ b/src/java/org/apache/cassandra/schema/LegacySchemaTables.java
@@ -160,7 +160,6 @@ public class LegacySchemaTables
                 + "argument_names list<text>,"
                 + "argument_types list<text>,"
                 + "body text,"
-                + "is_deterministic boolean,"
                 + "language text,"
                 + "return_type text,"
                 + "PRIMARY KEY ((keyspace_name), function_name, signature))");
@@ -1284,7 +1283,6 @@ public class LegacySchemaTables
         }
 
         adder.add("body", function.body());
-        adder.add("is_deterministic", function.isDeterministic());
         adder.add("language", function.language());
         adder.add("return_type", function.returnType().toString());
     }
@@ -1333,13 +1331,12 @@ public class LegacySchemaTables
 
         AbstractType<?> returnType = parseType(row.getString("return_type"));
 
-        boolean isDeterministic = row.getBoolean("is_deterministic");
         String language = row.getString("language");
         String body = row.getString("body");
 
         try
         {
-            return UDFunction.create(name, argNames, argTypes, returnType, language, body, isDeterministic);
+            return UDFunction.create(name, argNames, argTypes, returnType, language, body);
         }
         catch (InvalidRequestException e)
         {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b2abcb7f/test/unit/org/apache/cassandra/cql3/UFAuthTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/cql3/UFAuthTest.java b/test/unit/org/apache/cassandra/cql3/UFAuthTest.java
index 3f0768e..1d63d29 100644
--- a/test/unit/org/apache/cassandra/cql3/UFAuthTest.java
+++ b/test/unit/org/apache/cassandra/cql3/UFAuthTest.java
@@ -78,9 +78,9 @@ public class UFAuthTest extends CQLTester
     }
 
     @Test
-    public void nonDeterministicFunctionInSelection() throws Throwable
+    public void functionInSelection() throws Throwable
     {
-        String functionName = createSimpleFunction(false);
+        String functionName = createSimpleFunction();
         String cql = String.format("SELECT k, %s FROM %s WHERE k = 1;",
                                    functionCall(functionName),
                                    KEYSPACE + "." + currentTable());
@@ -88,29 +88,9 @@ public class UFAuthTest extends CQLTester
     }
 
     @Test
-    public void deterministicFunctionInSelection() throws Throwable
+    public void functionInSelectPKRestriction() throws Throwable
     {
-        String functionName = createSimpleFunction(true);
-        String cql = String.format("SELECT k, %s FROM %s WHERE k = 1;",
-                                   functionCall(functionName),
-                                   KEYSPACE + "." + currentTable());
-        assertPermissionsOnFunction(cql, functionName);
-    }
-
-    @Test
-    public void nonDeterministicFunctionInSelectPKRestriction() throws Throwable
-    {
-        String functionName = createSimpleFunction(false);
-        String cql = String.format("SELECT * FROM %s WHERE k = %s",
-                                   KEYSPACE + "." + currentTable(),
-                                   functionCall(functionName));
-        assertPermissionsOnFunction(cql, functionName);
-    }
-
-    @Test
-    public void deterministicFunctionInSelectPKRestriction() throws Throwable
-    {
-        String functionName = createSimpleFunction(true);
+        String functionName = createSimpleFunction();
         String cql = String.format("SELECT * FROM %s WHERE k = %s",
                                    KEYSPACE + "." + currentTable(),
                                    functionCall(functionName));
@@ -118,19 +98,9 @@ public class UFAuthTest extends CQLTester
     }
 
     @Test
-    public void nonDeterministicFunctionInSelectClusteringRestriction() throws Throwable
-    {
-        String functionName = createSimpleFunction(false);
-        String cql = String.format("SELECT * FROM %s WHERE k = 0 AND v1 = %s",
-                                   KEYSPACE + "." + currentTable(),
-                                   functionCall(functionName));
-        assertPermissionsOnFunction(cql, functionName);
-    }
-
-    @Test
-    public void deterministicFunctionInSelectClusteringRestriction() throws Throwable
+    public void functionInSelectClusteringRestriction() throws Throwable
     {
-        String functionName = createSimpleFunction(true);
+        String functionName = createSimpleFunction();
         String cql = String.format("SELECT * FROM %s WHERE k = 0 AND v1 = %s",
                                    KEYSPACE + "." + currentTable(),
                                    functionCall(functionName));
@@ -138,20 +108,9 @@ public class UFAuthTest extends CQLTester
     }
 
     @Test
-    public void nonDeterministicFunctionInSelectInRestriction() throws Throwable
-    {
-        String functionName = createSimpleFunction(false);
-        String cql = String.format("SELECT * FROM %s WHERE k IN (%s, %s)",
-                                   KEYSPACE + "." + currentTable(),
-                                   functionCall(functionName),
-                                   functionCall(functionName));
-        assertPermissionsOnFunction(cql, functionName);
-    }
-
-    @Test
-    public void deterministicFunctionInSelectInRestriction() throws Throwable
+    public void functionInSelectInRestriction() throws Throwable
     {
-        String functionName = createSimpleFunction(true);
+        String functionName = createSimpleFunction();
         String cql = String.format("SELECT * FROM %s WHERE k IN (%s, %s)",
                                    KEYSPACE + "." + currentTable(),
                                    functionCall(functionName),
@@ -160,10 +119,10 @@ public class UFAuthTest extends CQLTester
     }
 
     @Test
-    public void nonDeterministicFunctionInSelectMultiColumnInRestriction() throws Throwable
+    public void functionInSelectMultiColumnInRestriction() throws Throwable
     {
         setupTable("CREATE TABLE %s (k int, v1 int, v2 int, v3 int, PRIMARY KEY (k, v1, v2))");
-        String functionName = createSimpleFunction(false);
+        String functionName = createSimpleFunction();
         String cql = String.format("SELECT * FROM %s WHERE k=0 AND (v1, v2) IN ((%s, %s))",
                                    KEYSPACE + "." + currentTable(),
                                    functionCall(functionName),
@@ -172,35 +131,10 @@ public class UFAuthTest extends CQLTester
     }
 
     @Test
-    public void deterministicFunctionInSelectMultiColumnInRestriction() throws Throwable
-    {
-        setupTable("CREATE TABLE %s (k int, v1 int, v2 int, v3 int, PRIMARY KEY (k, v1, v2))");
-        String functionName = createSimpleFunction(true);
-        String cql = String.format("SELECT * FROM %s WHERE k=0 AND (v1, v2) IN ((%s, %s))",
-                                   KEYSPACE + "." + currentTable(),
-                                   functionCall(functionName),
-                                   functionCall(functionName));
-        assertPermissionsOnFunction(cql, functionName);
-    }
-
-
-    @Test
-    public void nonDeterministicFunctionInSelectMultiColumnEQRestriction() throws Throwable
-    {
-        setupTable("CREATE TABLE %s (k int, v1 int, v2 int, v3 int, PRIMARY KEY (k, v1, v2))");
-        String functionName = createSimpleFunction(false);
-        String cql = String.format("SELECT * FROM %s WHERE k=0 AND (v1, v2) = (%s, %s)",
-                                   KEYSPACE + "." + currentTable(),
-                                   functionCall(functionName),
-                                   functionCall(functionName));
-        assertPermissionsOnFunction(cql, functionName);
-    }
-
-    @Test
-    public void deterministicFunctionInSelectMultiColumnEQRestriction() throws Throwable
+    public void functionInSelectMultiColumnEQRestriction() throws Throwable
     {
         setupTable("CREATE TABLE %s (k int, v1 int, v2 int, v3 int, PRIMARY KEY (k, v1, v2))");
-        String functionName = createSimpleFunction(true);
+        String functionName = createSimpleFunction();
         String cql = String.format("SELECT * FROM %s WHERE k=0 AND (v1, v2) = (%s, %s)",
                                    KEYSPACE + "." + currentTable(),
                                    functionCall(functionName),
@@ -209,22 +143,10 @@ public class UFAuthTest extends CQLTester
     }
 
     @Test
-    public void nonDeterministicFunctionInSelectMultiColumnSliceRestriction() throws Throwable
-    {
-        setupTable("CREATE TABLE %s (k int, v1 int, v2 int, v3 int, PRIMARY KEY (k, v1, v2))");
-        String functionName = createSimpleFunction(false);
-        String cql = String.format("SELECT * FROM %s WHERE k=0 AND (v1, v2) > (%s, %s)",
-                                   KEYSPACE + "." + currentTable(),
-                                   functionCall(functionName),
-                                   functionCall(functionName));
-        assertPermissionsOnFunction(cql, functionName);
-    }
-
-    @Test
-    public void deterministicFunctionInSelectMultiColumnSliceRestriction() throws Throwable
+    public void functionInSelectMultiColumnSliceRestriction() throws Throwable
     {
         setupTable("CREATE TABLE %s (k int, v1 int, v2 int, v3 int, PRIMARY KEY (k, v1, v2))");
-        String functionName = createSimpleFunction(true);
+        String functionName = createSimpleFunction();
         String cql = String.format("SELECT * FROM %s WHERE k=0 AND (v1, v2) < (%s, %s)",
                                    KEYSPACE + "." + currentTable(),
                                    functionCall(functionName),
@@ -233,19 +155,9 @@ public class UFAuthTest extends CQLTester
     }
 
     @Test
-    public void nonDeterministicFunctionInSelectTokenEQRestriction() throws Throwable
-    {
-        String functionName = createSimpleFunction(false);
-        String cql = String.format("SELECT * FROM %s WHERE token(k) = token(%s)",
-                                   KEYSPACE + "." + currentTable(),
-                                   functionCall(functionName));
-        assertPermissionsOnFunction(cql, functionName);
-    }
-
-    @Test
-    public void deterministicFunctionInSelectTokenEQRestriction() throws Throwable
+    public void functionInSelectTokenEQRestriction() throws Throwable
     {
-        String functionName = createSimpleFunction(true);
+        String functionName = createSimpleFunction();
         String cql = String.format("SELECT * FROM %s WHERE token(k) = token(%s)",
                                    KEYSPACE + "." + currentTable(),
                                    functionCall(functionName));
@@ -253,38 +165,19 @@ public class UFAuthTest extends CQLTester
     }
 
     @Test
-    public void nonDeterministicFunctionInSelectTokenSliceRestriction() throws Throwable
-    {
-        String functionName = createSimpleFunction(false);
-        String cql = String.format("SELECT * FROM %s WHERE token(k) > token(%s)",
-                                   KEYSPACE + "." + currentTable(),
-                                   functionCall(functionName));
-        assertPermissionsOnFunction(cql, functionName);
-    }
-
-    @Test
-    public void deterministicFunctionInSelectTokenSliceRestriction() throws Throwable
+    public void functionInSelectTokenSliceRestriction() throws Throwable
     {
-        String functionName = createSimpleFunction(true);
+        String functionName = createSimpleFunction();
         String cql = String.format("SELECT * FROM %s WHERE token(k) < token(%s)",
                                    KEYSPACE + "." + currentTable(),
                                    functionCall(functionName));
         assertPermissionsOnFunction(cql, functionName);
     }
-    @Test
-    public void nonDeterministicFunctionInPKForInsert() throws Throwable
-    {
-        String functionName = createSimpleFunction(false);
-        String cql = String.format("INSERT INTO %s (k, v1 ,v2) VALUES (%s, 0, 0)",
-                                   KEYSPACE + "." + currentTable(),
-                                   functionCall(functionName));
-        assertPermissionsOnFunction(cql, functionName);
-    }
 
     @Test
-    public void deterministicFunctionInPKForInsert() throws Throwable
+    public void functionInPKForInsert() throws Throwable
     {
-        String functionName = createSimpleFunction(true);
+        String functionName = createSimpleFunction();
         String cql = String.format("INSERT INTO %s (k, v1, v2) VALUES (%s, 0, 0)",
                                    KEYSPACE + "." + currentTable(),
                                    functionCall(functionName));
@@ -292,19 +185,9 @@ public class UFAuthTest extends CQLTester
     }
 
     @Test
-    public void nonDeterministicFunctionInClusteringValuesForInsert() throws Throwable
-    {
-        String functionName = createSimpleFunction(false);
-        String cql = String.format("INSERT INTO %s (k, v1, v2) VALUES (0, %s, 0)",
-                                   KEYSPACE + "." + currentTable(),
-                                   functionCall(functionName));
-        assertPermissionsOnFunction(cql, functionName);
-    }
-
-    @Test
-    public void deterministicFunctionInClusteringValuesForInsert() throws Throwable
+    public void functionInClusteringValuesForInsert() throws Throwable
     {
-        String functionName = createSimpleFunction(true);
+        String functionName = createSimpleFunction();
         String cql = String.format("INSERT INTO %s (k, v1, v2) VALUES (0, %s, 0)",
                                    KEYSPACE + "." + currentTable(),
                                    functionCall(functionName));
@@ -312,19 +195,9 @@ public class UFAuthTest extends CQLTester
     }
 
     @Test
-    public void nonDeterministicFunctionInPKForDelete() throws Throwable
-    {
-        String functionName = createSimpleFunction(false);
-        String cql = String.format("DELETE FROM %s WHERE k = %s",
-                                   KEYSPACE + "." + currentTable(),
-                                   functionCall(functionName));
-        assertPermissionsOnFunction(cql, functionName);
-    }
-
-    @Test
-    public void deterministicFunctionInPKForDelete() throws Throwable
+    public void functionInPKForDelete() throws Throwable
     {
-        String functionName = createSimpleFunction(true);
+        String functionName = createSimpleFunction();
         String cql = String.format("DELETE FROM %s WHERE k = %s",
                                    KEYSPACE + "." + currentTable(),
                                    functionCall(functionName));
@@ -332,20 +205,9 @@ public class UFAuthTest extends CQLTester
     }
 
     @Test
-    public void nonDeterministicFunctionInClusteringValuesForDelete() throws Throwable
+    public void functionInClusteringValuesForDelete() throws Throwable
     {
-        String functionName = createSimpleFunction(false);
-        String cql = String.format("DELETE FROM %s WHERE k = 0 AND v1 = %s",
-                                   KEYSPACE + "." + currentTable(),
-                                   functionCall(functionName));
-        assertPermissionsOnFunction(cql, functionName);
-    }
-
-    @Test
-
-    public void deterministicFunctionInClusteringValuesForDelete() throws Throwable
-    {
-        String functionName = createSimpleFunction(true);
+        String functionName = createSimpleFunction();
         String cql = String.format("DELETE FROM %s WHERE k = 0 AND v1 = %s",
                                    KEYSPACE + "." + currentTable(),
                                    functionCall(functionName));
@@ -359,7 +221,7 @@ public class UFAuthTest extends CQLTester
         List<String> functions = new ArrayList<>();
         for (int i = 0; i < 3; i++)
         {
-            String functionName = createSimpleFunction(false);
+            String functionName = createSimpleFunction();
             ModificationStatement stmt =
             (ModificationStatement) getStatement(String.format("INSERT INTO %s (k, v1, v2) " +
                                                                "VALUES (%s, %s, %s)",
@@ -382,21 +244,9 @@ public class UFAuthTest extends CQLTester
     }
 
     @Test
-    public void testNestedNonDeterministicFunctions() throws Throwable
-    {
-        String innerFunctionName = createSimpleFunction(false);
-        String outerFunctionName = createFunction("int",
-                                                  "CREATE NON DETERMINISTIC FUNCTION %s(input int) " +
-                                                  " RETURNS int" +
-                                                  " LANGUAGE java" +
-                                                  " AS 'return Integer.valueOf(0);'");
-        assertPermissionsOnNestedFunctions(innerFunctionName, outerFunctionName);
-    }
-
-    @Test
-    public void testNestedDeterministicFunctions() throws Throwable
+    public void testNestedFunctions() throws Throwable
     {
-        String innerFunctionName = createSimpleFunction(true);
+        String innerFunctionName = createSimpleFunction();
         String outerFunctionName = createFunction("int",
                                                   "CREATE FUNCTION %s(input int) " +
                                                   " RETURNS int" +
@@ -406,41 +256,10 @@ public class UFAuthTest extends CQLTester
     }
 
     @Test
-    public void testNestedMixedFunctions() throws Throwable
-    {
-        String innerFunctionName = createSimpleFunction(true);
-        String outerFunctionName = createFunction("int",
-                                                  "CREATE NON DETERMINISTIC FUNCTION %s(input int) " +
-                                                  " RETURNS int" +
-                                                  " LANGUAGE java" +
-                                                  " AS 'return Integer.valueOf(0);'");
-        assertPermissionsOnNestedFunctions(innerFunctionName, outerFunctionName);
-
-        innerFunctionName = createSimpleFunction(false);
-        outerFunctionName = createFunction("int",
-                                           "CREATE FUNCTION %s(input int) " +
-                                           " RETURNS int" +
-                                           " LANGUAGE java" +
-                                           " AS 'return Integer.valueOf(0);'");
-        assertPermissionsOnNestedFunctions(innerFunctionName, outerFunctionName);
-    }
-
-    @Test
-    public void nonDeterministicFunctionInStaticColumnRestrictionInSelect() throws Throwable
-    {
-        setupTable("CREATE TABLE %s (k int, s int STATIC, v1 int, v2 int, PRIMARY KEY(k, v1))");
-        String functionName = createSimpleFunction(false);
-        String cql = String.format("SELECT k FROM %s WHERE k = 0 AND s = %s",
-                                   KEYSPACE + "." + currentTable(),
-                                   functionCall(functionName));
-        assertPermissionsOnFunction(cql, functionName);
-    }
-
-    @Test
-    public void deterministicFunctionInStaticColumnRestrictionInSelect() throws Throwable
+    public void functionInStaticColumnRestrictionInSelect() throws Throwable
     {
         setupTable("CREATE TABLE %s (k int, s int STATIC, v1 int, v2 int, PRIMARY KEY(k, v1))");
-        String functionName = createSimpleFunction(true);
+        String functionName = createSimpleFunction();
         String cql = String.format("SELECT k FROM %s WHERE k = 0 AND s = %s",
                                    KEYSPACE + "." + currentTable(),
                                    functionCall(functionName));
@@ -448,41 +267,19 @@ public class UFAuthTest extends CQLTester
     }
 
     @Test
-    public void nonDeterministicFunctionInRegularCondition() throws Throwable
-    {
-        String functionName = createSimpleFunction(false);
-        String cql = String.format("UPDATE %s SET v2 = 0 WHERE k = 0 AND v1 = 0 IF v2 = %s",
-                                   KEYSPACE + "." + currentTable(),
-                                   functionCall(functionName));
-        assertPermissionsOnFunction(cql, functionName);
-    }
-
-    @Test
-    public void deterministicFunctionInRegularCondition() throws Throwable
+    public void functionInRegularCondition() throws Throwable
     {
-        String functionName = createSimpleFunction(true);
+        String functionName = createSimpleFunction();
         String cql = String.format("UPDATE %s SET v2 = 0 WHERE k = 0 AND v1 = 0 IF v2 = %s",
                                    KEYSPACE + "." + currentTable(),
                                    functionCall(functionName));
         assertPermissionsOnFunction(cql, functionName);
     }
-
-    @Test
-    public void nonDeterministicFunctionInStaticColumnCondition() throws Throwable
-    {
-        setupTable("CREATE TABLE %s (k int, s int STATIC, v1 int, v2 int, PRIMARY KEY(k, v1))");
-        String functionName = createSimpleFunction(false);
-        String cql = String.format("UPDATE %s SET v2 = 0 WHERE k = 0 AND v1 = 0 IF s = %s",
-                                   KEYSPACE + "." + currentTable(),
-                                   functionCall(functionName));
-        assertPermissionsOnFunction(cql, functionName);
-    }
-
     @Test
-    public void deterministicFunctionInStaticColumnCondition() throws Throwable
+    public void functionInStaticColumnCondition() throws Throwable
     {
         setupTable("CREATE TABLE %s (k int, s int STATIC, v1 int, v2 int, PRIMARY KEY(k, v1))");
-        String functionName = createSimpleFunction(true);
+        String functionName = createSimpleFunction();
         String cql = String.format("UPDATE %s SET v2 = 0 WHERE k = 0 AND v1 = 0 IF s = %s",
                                    KEYSPACE + "." + currentTable(),
                                    functionCall(functionName));
@@ -490,22 +287,10 @@ public class UFAuthTest extends CQLTester
     }
 
     @Test
-    public void nonDeterministicFunctionInCollectionLiteralCondition() throws Throwable
-    {
-        setupTable("CREATE TABLE %s (k int, v1 int, m_val map<int, int>, PRIMARY KEY(k))");
-        String functionName = createSimpleFunction(false);
-        String cql = String.format("UPDATE %s SET v1 = 0 WHERE k = 0 IF m_val = {%s : %s}",
-                                   KEYSPACE + "." + currentTable(),
-                                   functionCall(functionName),
-                                   functionCall(functionName));
-        assertPermissionsOnFunction(cql, functionName);
-    }
-
-    @Test
-    public void deterministicFunctionInCollectionLiteralCondition() throws Throwable
+    public void functionInCollectionLiteralCondition() throws Throwable
     {
         setupTable("CREATE TABLE %s (k int, v1 int, m_val map<int, int>, PRIMARY KEY(k))");
-        String functionName = createSimpleFunction(true);
+        String functionName = createSimpleFunction();
         String cql = String.format("UPDATE %s SET v1 = 0 WHERE k = 0 IF m_val = {%s : %s}",
                                    KEYSPACE + "." + currentTable(),
                                    functionCall(functionName),
@@ -514,22 +299,10 @@ public class UFAuthTest extends CQLTester
     }
 
     @Test
-    public void nonDeterministicFunctionInCollectionElementCondition() throws Throwable
-    {
-        setupTable("CREATE TABLE %s (k int, v1 int, m_val map<int, int>, PRIMARY KEY(k))");
-        String functionName = createSimpleFunction(false);
-        String cql = String.format("UPDATE %s SET v1 = 0 WHERE k = 0 IF m_val[%s] = %s",
-                                   KEYSPACE + "." + currentTable(),
-                                   functionCall(functionName),
-                                   functionCall(functionName));
-        assertPermissionsOnFunction(cql, functionName);
-    }
-
-    @Test
-    public void deterministicFunctionInCollectionElementCondition() throws Throwable
+    public void functionInCollectionElementCondition() throws Throwable
     {
         setupTable("CREATE TABLE %s (k int, v1 int, m_val map<int, int>, PRIMARY KEY(k))");
-        String functionName = createSimpleFunction(true);
+        String functionName = createSimpleFunction();
         String cql = String.format("UPDATE %s SET v1 = 0 WHERE k = 0 IF m_val[%s] = %s",
                                    KEYSPACE + "." + currentTable(),
                                    functionCall(functionName),
@@ -546,7 +319,7 @@ public class UFAuthTest extends CQLTester
         getStatement(cql).checkAccess(clientState);
 
         // with non-terminal arguments, so evaluated at execution
-        String functionName = createSimpleFunction(false);
+        String functionName = createSimpleFunction();
         grantExecuteOnFunction(functionName);
         cql = String.format("UPDATE %s SET v2 = 0 WHERE k = blobasint(intasblob(%s))",
                             KEYSPACE + "." + currentTable(),
@@ -612,10 +385,10 @@ public class UFAuthTest extends CQLTester
     }
 
     @Test
-    public void nonDeterministicFunctionWrappingAggregate() throws Throwable
+    public void functionWrappingAggregate() throws Throwable
     {
         String outerFunc = createFunction("int",
-                                          "CREATE NON DETERMINISTIC FUNCTION %s(input int) " +
+                                          "CREATE FUNCTION %s(input int) " +
                                           "RETURNS int " +
                                           "LANGUAGE java " +
                                           "AS 'return input;'");
@@ -643,10 +416,10 @@ public class UFAuthTest extends CQLTester
     }
 
     @Test
-    public void aggregateWrappingNonDeterministicFunction() throws Throwable
+    public void aggregateWrappingFunction() throws Throwable
     {
         String innerFunc = createFunction("int",
-                                          "CREATE NON DETERMINISTIC FUNCTION %s(input int) " +
+                                          "CREATE FUNCTION %s(input int) " +
                                           "RETURNS int " +
                                           "LANGUAGE java " +
                                           "AS 'return input;'");
@@ -809,10 +582,10 @@ public class UFAuthTest extends CQLTester
                               "AS 'return a;'");
     }
 
-    private String createSimpleFunction(boolean deterministic) throws Throwable
+    private String createSimpleFunction() throws Throwable
     {
         return createFunction("",
-                              "CREATE " + (deterministic ? "" : " NON ") +  " DETERMINISTIC FUNCTION %s() " +
+                              "CREATE FUNCTION %s() " +
                               "  RETURNS int " +
                               "  LANGUAGE java " +
                               "  AS 'return Integer.valueOf(0);'");