[ASTERIXDB-2566][TYPE][FUN] Added complete set of is_* type functions
and a generic get_type function.

- user model changes: no
- storage format changes: no
- interface changes: no

details:
- Added a is_binary type function.
- Added spatial types functions: is_point, is_line, is_rectangle, is_circle, is_polygon, is_spatial
- Added temporal type functions: is_date, is_datetime, is_time, is_duration, is_interval, is_temporal
- Added a is_uuid type function.
- Added a is_multiset function.
- Added a get_type function.

Change-Id: Icee5f2de7178e27091d457d37603ee6b4c2e0629
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/4303
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Contrib: Ian Maxon <imaxon@uci.edu>
Reviewed-by: Ian Maxon <imaxon@uci.edu>
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/gettype/gettype.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/gettype/gettype.1.query.sqlpp
new file mode 100644
index 0000000..5cc87f5
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/gettype/gettype.1.query.sqlpp
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+{
+  "a": get_type(true),
+  "b": get_type(false),
+  "c": get_type(null),
+  "d": get_type(missing),
+  "e": get_type("d"),
+  "f": gettype(4.0),
+  "g": gettype(5),
+  "h": gettype(["1", 2]),
+  "i": gettype({"a":1})
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/is_all_types/is_all_types.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/is_all_types/is_all_types.1.ddl.sqlpp
new file mode 100644
index 0000000..2462621
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/is_all_types/is_all_types.1.ddl.sqlpp
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+drop  dataverse test if exists;
+create  dataverse test;
+
+use test;
+
+create type test.AllType as
+{
+  t1: [string],
+  t2: binary,
+  t3: boolean,
+  t4: circle,
+  t5: date,
+  t6: datetime,
+  t7: duration,
+  t8: interval,
+  t9: line,
+  t10: {{string}},
+  t11: point,
+  t12: polygon,
+  t13: rectangle,
+  t14: string,
+  t15: time,
+  t16: uuid
+};
+
+create dataset `All` (AllType) primary key t16 autogenerated;
+
+insert into `All` {
+    "t1": ["a", "b"],
+    "t2": hex("ABCDEF0123456789"),
+    "t3": false,
+    "t4": circle("30.0,70.0 5.0"),
+    "t5": date("-19700101"),
+    "t6": datetime("2013-01-01T12:12:12.039Z"),
+    "t7": duration("P100Y12MT12M"),
+    "t8": interval(date("2013-01-01"), date("20130505")),
+    "t9": line("30.0,70.0 50.0,90.0"),
+    "t10": {{"a", "b"}},
+    "t11": point("1,2"),
+    "t12": polygon("1.0,1.0 2.0,2.0 3.0,3.0 4.0,4.0"),
+    "t13": rectangle("30.0,70.0 50.0,90.0"),
+    "t14": "abcde",
+    "t15": time("12:12:12.039Z")
+};
+
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/is_all_types/is_all_types.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/is_all_types/is_all_types.2.query.sqlpp
new file mode 100644
index 0000000..7b019b2
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/is_all_types/is_all_types.2.query.sqlpp
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Description  : Test variant syntax for dataset access (scan)
+ *              : using parentheses and quotes is optional
+ * Expected Res : Success
+ * Date         : 6th March 2013
+ */
+
+use test;
+
+SELECT VALUE {
+  "t1": is_array(t1),
+  "t2": is_binary(t2),
+  "t3": is_boolean(t3),
+  "t4": is_circle(t4),
+  "t5": is_date(t5),
+  "t6": is_datetime(t6),
+  "t7": is_duration(t7),
+  "t8": is_interval(t8),
+  "t9": is_line(t9),
+  "t10": is_multiset(t10),
+  "t11": is_point(t11),
+  "t12": is_polygon(t12),
+  "t13": is_rectangle(t13),
+  "t14": is_string(t14),
+  "t15": is_time(t15),
+  "t16": is_uuid(t16)
+}
+FROM `All`;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/isbinary/isbinary.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/isbinary/isbinary.1.query.sqlpp
new file mode 100644
index 0000000..90e9abd
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/isbinary/isbinary.1.query.sqlpp
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+{
+  "a": is_binary(true),
+  "b": is_binary(false),
+  "c": isbinary(null),
+  "d": isbinary(missing),
+  "e": isbin(point("1,2")),
+  "f": isbin(hex("ABCDEF0123456789")),
+  "g": is_bin(sub_binary(hex("AABBCCDD"), 4)),
+  "h": is_bin(2),
+  "i": is_bin({"a":1})
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/iscircle/iscircle.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/iscircle/iscircle.1.query.sqlpp
new file mode 100644
index 0000000..137a11e
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/iscircle/iscircle.1.query.sqlpp
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+{
+  "a": is_circle(true),
+  "b": is_circle(false),
+  "c": is_circle(null),
+  "d": is_circle(missing),
+  "e": is_circle(point("1,2")),
+  "f": iscircle(line("30.0,70.0 50.0,90.0")),
+  "g": iscircle(rectangle("30.0,70.0 50.0,90.0")),
+  "h": iscircle(circle("30.0,70.0 5.0")),
+  "i": iscircle(polygon("1.0,1.0 2.0,2.0 3.0,3.0 4.0,4.0")),
+  "j": iscircle(3)
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/isdate/isdate.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/isdate/isdate.1.query.sqlpp
new file mode 100644
index 0000000..87936ed
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/isdate/isdate.1.query.sqlpp
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+{
+  "a": is_date(true),
+  "b": is_date(false),
+  "c": is_date(null),
+  "d": is_date(missing),
+  "e": is_date(date("-19700101")),
+  "f": isdate(date("2013-01-01")),
+  "g": isdate(time("12:12:12.039Z")),
+  "h": isdate(datetime("2013-01-01T12:12:12.039Z")),
+  "i": isdate(duration("P100Y12MT12M")),
+  "j": isdate(interval(date("2013-01-01"), date("20130505"))),
+  "k": isdate(3)
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/isdatetime/isdatetime.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/isdatetime/isdatetime.1.query.sqlpp
new file mode 100644
index 0000000..59353c6
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/isdatetime/isdatetime.1.query.sqlpp
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+{
+  "a": is_datetime(true),
+  "b": is_datetime(false),
+  "c": is_datetime(null),
+  "d": is_datetime(missing),
+  "e": is_datetime(datetime("2016-02-02T12:09:22.023Z")),
+  "f": isdatetime(datetime("2011-03-03T12:10:42.011Z")),
+  "g": isdatetime(time("12:12:12.039Z")),
+  "h": is_timestamp(datetime("2013-01-01T12:12:12.039Z")),
+  "i": is_timestamp(duration("P100Y12MT12M")),
+  "j": istimestamp(interval(date("2013-01-01"), date("20130505"))),
+  "k": istimestamp(3)
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/isduration/isduration.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/isduration/isduration.1.query.sqlpp
new file mode 100644
index 0000000..988a921
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/isduration/isduration.1.query.sqlpp
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+{
+  "a": is_duration(true),
+  "b": is_duration(false),
+  "c": is_duration(null),
+  "d": is_duration(missing),
+  "e": is_duration(duration("-PT20.943S")),
+  "f": isduration(date("2013-01-01")),
+  "g": isduration(time("12:12:12.039Z")),
+  "h": isduration(datetime("2013-01-01T12:12:12.039Z")),
+  "i": isduration(duration("P100Y12MT12M")),
+  "j": isduration(interval(date("2013-01-01"), date("20130505"))),
+  "k": isduration(3)
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/isinterval/isinterval.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/isinterval/isinterval.1.query.sqlpp
new file mode 100644
index 0000000..695f122
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/isinterval/isinterval.1.query.sqlpp
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+{
+  "a": is_interval(true),
+  "b": is_interval(false),
+  "c": is_interval(null),
+  "d": is_interval(missing),
+  "e": is_interval(interval(datetime("2013-01-01T00:01:01.000Z"), datetime("2013-05-05T13:39:01.049Z"))),
+  "f": isinterval(date("2013-01-01")),
+  "g": isinterval(time("12:12:12.039Z")),
+  "h": isinterval(datetime("2013-01-01T12:12:12.039Z")),
+  "i": isinterval(duration("P100Y12MT12M")),
+  "j": isinterval(interval(date("2013-01-01"), date("20130505"))),
+  "k": isinterval(3)
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/isline/isline.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/isline/isline.1.query.sqlpp
new file mode 100644
index 0000000..3772066
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/isline/isline.1.query.sqlpp
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+{
+  "a": is_line(true),
+  "b": is_line(false),
+  "c": is_line(null),
+  "d": is_line(missing),
+  "e": is_line(point("1,2")),
+  "f": isline(line("30.0,70.0 50.0,90.0")),
+  "g": isline(rectangle("30.0,70.0 50.0,90.0")),
+  "h": isline(circle("30.0,70.0 5.0")),
+  "i": isline(polygon("1.0,1.0 2.0,2.0 3.0,3.0 4.0,4.0")),
+  "j": isline(3)
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/ismultiset/ismultiset.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/ismultiset/ismultiset.1.query.sqlpp
new file mode 100644
index 0000000..51d5d07
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/ismultiset/ismultiset.1.query.sqlpp
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+{
+  "a": is_multiset(true),
+  "b": is_multiset(false),
+  "c": is_multiset(null),
+  "d": is_multiset(missing),
+  "e": is_multiset("d"),
+  "f": ismultiset(4.0),
+  "g": ismultiset(["1", 2]),
+  "h": ismultiset({"a":1}),
+  "i": ismultiset({{"hello", 9328, "world", [1, 2, null]}})
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/ispoint/ispoint.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/ispoint/ispoint.1.query.sqlpp
new file mode 100644
index 0000000..199d7dc
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/ispoint/ispoint.1.query.sqlpp
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+{
+  "a": is_point(true),
+  "b": is_point(false),
+  "c": is_point(null),
+  "d": is_point(missing),
+  "e": is_point(point("1,2")),
+  "f": ispoint(line("30.0,70.0 50.0,90.0")),
+  "g": ispoint(rectangle("30.0,70.0 50.0,90.0")),
+  "h": ispoint(circle("30.0,70.0 5.0")),
+  "i": ispoint(polygon("1.0,1.0 2.0,2.0 3.0,3.0 4.0,4.0")),
+  "j": ispoint(3)
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/ispolygon/ispolygon.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/ispolygon/ispolygon.1.query.sqlpp
new file mode 100644
index 0000000..3776888
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/ispolygon/ispolygon.1.query.sqlpp
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+{
+  "a": is_polygon(true),
+  "b": is_polygon(false),
+  "c": is_polygon(null),
+  "d": is_polygon(missing),
+  "e": is_polygon(point("1,2")),
+  "f": ispolygon(line("30.0,70.0 50.0,90.0")),
+  "g": ispolygon(rectangle("30.0,70.0 50.0,90.0")),
+  "h": ispolygon(circle("30.0,70.0 5.0")),
+  "i": ispolygon(polygon("1.0,1.0 2.0,2.0 3.0,3.0 4.0,4.0")),
+  "j": ispolygon(3)
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/isrectangle/isrectangle.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/isrectangle/isrectangle.1.query.sqlpp
new file mode 100644
index 0000000..f1c0cc4
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/isrectangle/isrectangle.1.query.sqlpp
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+{
+  "a": is_rectangle(true),
+  "b": is_rectangle(false),
+  "c": is_rectangle(null),
+  "d": is_rectangle(missing),
+  "e": is_rectangle(point("1,2")),
+  "f": isrectangle(line("30.0,70.0 50.0,90.0")),
+  "g": isrectangle(rectangle("30.0,70.0 50.0,90.0")),
+  "h": isrectangle(circle("30.0,70.0 5.0")),
+  "i": isrectangle(polygon("1.0,1.0 2.0,2.0 3.0,3.0 4.0,4.0")),
+  "j": isrectangle(3)
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/isspatial/isspatial.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/isspatial/isspatial.1.query.sqlpp
new file mode 100644
index 0000000..36bda17
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/isspatial/isspatial.1.query.sqlpp
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+{
+  "a": is_spatial(true),
+  "b": is_spatial(false),
+  "c": is_spatial(null),
+  "d": is_spatial(missing),
+  "e": is_spatial(point("1,2")),
+  "f": isspatial(line("30.0,70.0 50.0,90.0")),
+  "g": isspatial(rectangle("30.0,70.0 50.0,90.0")),
+  "h": isspatial(circle("30.0,70.0 5.0")),
+  "i": isspatial(polygon("1.0,1.0 2.0,2.0 3.0,3.0 4.0,4.0")),
+  "j": isspatial(3)
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/istemporal/istemporal.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/istemporal/istemporal.1.query.sqlpp
new file mode 100644
index 0000000..f0403f1
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/istemporal/istemporal.1.query.sqlpp
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+{
+  "a": is_temporal(true),
+  "b": is_temporal(false),
+  "c": is_temporal(null),
+  "d": is_temporal(missing),
+  "e": is_temporal(duration("-PT20.943S")),
+  "f": istemporal(date("2013-01-01")),
+  "g": istemporal(time("12:12:12.039Z")),
+  "h": istemporal(datetime("2013-01-01T12:12:12.039Z")),
+  "i": istemporal(duration("P100Y12MT12M")),
+  "j": istemporal(interval(date("2013-01-01"), date("20130505"))),
+  "k": istemporal(3)
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/istime/istime.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/istime/istime.1.query.sqlpp
new file mode 100644
index 0000000..be03eac
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/istime/istime.1.query.sqlpp
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+{
+  "a": is_time(true),
+  "b": is_time(false),
+  "c": is_time(null),
+  "d": is_time(missing),
+  "e": is_time(time("08:00:00.000Z")),
+  "f": istime(date("2013-01-01")),
+  "g": istime(time("12:12:12.039Z")),
+  "h": istime(datetime("2013-01-01T12:12:12.039Z")),
+  "i": istime(duration("P100Y12MT12M")),
+  "j": istime(interval(date("2013-01-01"), date("20130505"))),
+  "k": istime(3)
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/isuuid/isuuid.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/isuuid/isuuid.1.query.sqlpp
new file mode 100644
index 0000000..1ac74e2
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/isuuid/isuuid.1.query.sqlpp
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+{
+  "a": is_uuid(true),
+  "b": is_uuid(false),
+  "c": is_uuid(null),
+  "d": is_uuid(missing),
+  "e": isuuid(4.0),
+  "f": isuuid(date("2013-01-01")),
+  "g": isuuid(uuid("5c848e5c-6b6a-498f-8452-8847a2957421"))
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/types/gettype/gettype.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/gettype/gettype.1.adm
new file mode 100644
index 0000000..74f25d1
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/gettype/gettype.1.adm
@@ -0,0 +1 @@
+{ "a": "boolean", "b": "boolean", "c": "null", "d": "missing", "e": "string", "f": "double", "g": "bigint", "h": "array", "i": "object" }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/types/is_all_types/is_all_types.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/is_all_types/is_all_types.1.adm
new file mode 100644
index 0000000..c8f504d
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/is_all_types/is_all_types.1.adm
@@ -0,0 +1 @@
+{ "t1": true, "t2": true, "t3": true, "t4": true, "t5": true, "t6": true, "t7": true, "t8": true, "t9": true, "t10": true, "t11": true, "t12": true, "t13": true, "t14": true, "t15": true, "t16": true }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/types/isbinary/isbinary.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/isbinary/isbinary.1.adm
new file mode 100644
index 0000000..fc8b4a8
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/isbinary/isbinary.1.adm
@@ -0,0 +1 @@
+{ "a": false, "b": false, "c": null, "e": false, "f": true, "g": true, "h": false, "i": false }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/types/iscircle/iscircle.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/iscircle/iscircle.1.adm
new file mode 100644
index 0000000..c6ae132
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/iscircle/iscircle.1.adm
@@ -0,0 +1 @@
+{ "a": false, "b": false, "c": null, "e": false, "f": false, "g": false, "h": true, "i": false, "j": false }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/types/isdate/isdate.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/isdate/isdate.1.adm
new file mode 100644
index 0000000..78ab41a
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/isdate/isdate.1.adm
@@ -0,0 +1 @@
+{ "a": false, "b": false, "c": null, "e": true, "f": true, "g": false, "h": false, "i": false, "j": false, "k": false }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/types/isdatetime/isdatetime.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/isdatetime/isdatetime.1.adm
new file mode 100644
index 0000000..42a18ca
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/isdatetime/isdatetime.1.adm
@@ -0,0 +1 @@
+{ "a": false, "b": false, "c": null, "e": true, "f": true, "g": false, "h": true, "i": false, "j": false, "k": false }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/types/isduration/isduration.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/isduration/isduration.1.adm
new file mode 100644
index 0000000..ba111e4
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/isduration/isduration.1.adm
@@ -0,0 +1 @@
+{ "a": false, "b": false, "c": null, "e": true, "f": false, "g": false, "h": false, "i": true, "j": false, "k": false }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/types/isinterval/isinterval.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/isinterval/isinterval.1.adm
new file mode 100644
index 0000000..e324a5c
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/isinterval/isinterval.1.adm
@@ -0,0 +1 @@
+{ "a": false, "b": false, "c": null, "e": true, "f": false, "g": false, "h": false, "i": false, "j": true, "k": false }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/types/isline/isline.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/isline/isline.1.adm
new file mode 100644
index 0000000..36e0675
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/isline/isline.1.adm
@@ -0,0 +1 @@
+{ "a": false, "b": false, "c": null, "e": false, "f": true, "g": false, "h": false, "i": false, "j": false }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/types/ismultiset/ismultiset.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/ismultiset/ismultiset.1.adm
new file mode 100644
index 0000000..00007d7
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/ismultiset/ismultiset.1.adm
@@ -0,0 +1 @@
+{ "a": false, "b": false, "c": null, "e": false, "f": false, "g": false, "h": false, "i": true }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/types/ispoint/ispoint.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/ispoint/ispoint.1.adm
new file mode 100644
index 0000000..f1a4eb9
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/ispoint/ispoint.1.adm
@@ -0,0 +1 @@
+{ "a": false, "b": false, "c": null, "e": true, "f": false, "g": false, "h": false, "i": false, "j": false }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/types/ispolygon/ispolygon.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/ispolygon/ispolygon.1.adm
new file mode 100644
index 0000000..619190a
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/ispolygon/ispolygon.1.adm
@@ -0,0 +1 @@
+{ "a": false, "b": false, "c": null, "e": false, "f": false, "g": false, "h": false, "i": true, "j": false }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/types/isrectangle/isrectangle.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/isrectangle/isrectangle.1.adm
new file mode 100644
index 0000000..3e64c1d
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/isrectangle/isrectangle.1.adm
@@ -0,0 +1 @@
+{ "a": false, "b": false, "c": null, "e": false, "f": false, "g": true, "h": false, "i": false, "j": false }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/types/isspatial/isspatial.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/isspatial/isspatial.1.adm
new file mode 100644
index 0000000..babf18b
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/isspatial/isspatial.1.adm
@@ -0,0 +1 @@
+{ "a": false, "b": false, "c": null, "e": true, "f": true, "g": true, "h": true, "i": true, "j": false }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/types/istemporal/istemporal.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/istemporal/istemporal.1.adm
new file mode 100644
index 0000000..13a3353
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/istemporal/istemporal.1.adm
@@ -0,0 +1 @@
+{ "a": false, "b": false, "c": null, "e": true, "f": true, "g": true, "h": true, "i": true, "j": true, "k": false }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/types/istime/istime.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/istime/istime.1.adm
new file mode 100644
index 0000000..92212a6
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/istime/istime.1.adm
@@ -0,0 +1 @@
+{ "a": false, "b": false, "c": null, "e": true, "f": false, "g": true, "h": false, "i": false, "j": false, "k": false }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/types/isuuid/isuuid.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/isuuid/isuuid.1.adm
new file mode 100644
index 0000000..bb3f445
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/isuuid/isuuid.1.adm
@@ -0,0 +1 @@
+{ "a": false, "b": false, "c": null, "e": false, "f": false, "g": true }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
index 3d3a98f..7beeb04 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
@@ -12527,6 +12527,11 @@
       </compilation-unit>
     </test-case>
     <test-case FilePath="types">
+      <compilation-unit name="gettype">
+        <output-dir compare="Text">gettype</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="types">
       <compilation-unit name="isarray">
         <output-dir compare="Text">isarray</output-dir>
       </compilation-unit>
@@ -12557,6 +12562,86 @@
       </compilation-unit>
     </test-case>
     <test-case FilePath="types">
+      <compilation-unit name="isbinary">
+        <output-dir compare="Text">isbinary</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="types">
+      <compilation-unit name="iscircle">
+        <output-dir compare="Text">iscircle</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="types">
+      <compilation-unit name="isdate">
+        <output-dir compare="Text">isdate</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="types">
+      <compilation-unit name="isdatetime">
+        <output-dir compare="Text">isdatetime</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="types">
+      <compilation-unit name="isduration">
+        <output-dir compare="Text">isduration</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="types">
+      <compilation-unit name="isinterval">
+        <output-dir compare="Text">isinterval</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="types">
+      <compilation-unit name="isline">
+        <output-dir compare="Text">isline</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="types">
+      <compilation-unit name="ismultiset">
+        <output-dir compare="Text">ismultiset</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="types">
+      <compilation-unit name="ispoint">
+        <output-dir compare="Text">ispoint</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="types">
+      <compilation-unit name="ispolygon">
+        <output-dir compare="Text">ispolygon</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="types">
+      <compilation-unit name="isrectangle">
+        <output-dir compare="Text">isrectangle</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="types">
+      <compilation-unit name="isspatial">
+        <output-dir compare="Text">isspatial</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="types">
+      <compilation-unit name="istemporal">
+        <output-dir compare="Text">istemporal</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="types">
+      <compilation-unit name="istime">
+        <output-dir compare="Text">istime</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="types">
+      <compilation-unit name="isuuid">
+        <output-dir compare="Text">isuuid</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="types">
+      <compilation-unit name="is_all_types">
+        <output-dir compare="Text">is_all_types</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="types">
       <compilation-unit name="record01">
         <output-dir compare="Text">record01</output-dir>
       </compilation-unit>
diff --git a/asterixdb/asterix-doc/src/main/markdown/builtins/11_type.md b/asterixdb/asterix-doc/src/main/markdown/builtins/11_type.md
index c9eab13..72291a6 100644
--- a/asterixdb/asterix-doc/src/main/markdown/builtins/11_type.md
+++ b/asterixdb/asterix-doc/src/main/markdown/builtins/11_type.md
@@ -19,6 +19,36 @@
 
 ## <a id="TypeFunctions">Type Functions</a> ##
 
+### get_type ###
+ * Syntax:
+
+        get_type(expr)
+
+ * Returns a string describing the type of the given `expr`. This includes incomplete information types (i.e. `missing` and `null`).
+ * Arguments:
+    * `expr` : an expression (any type is allowed).
+
+ * Example:
+
+        {
+          "a": get_type(true),
+          "b": get_type(false),
+          "c": get_type(null),
+          "d": get_type(missing),
+          "e": get_type("d"),
+          "f": gettype(4.0),
+          "g": gettype(5),
+          "h": gettype(["1", 2]),
+          "i": gettype({"a":1})
+        };
+
+
+ * The expected result is:
+
+        { "a": "boolean", "b": "boolean", "c": "null", "d": "missing", "e": "string", "f": "double", "g": "bigint", "h": "array", "i": "object" }
+        
+ The function has an alias `gettype`.
+
 ### is_array ###
  * Syntax:
 
@@ -53,6 +83,40 @@
 
  The function has an alias `isarray`.
 
+### is_multiset ###
+ * Syntax:
+
+        is_multiset(expr)
+
+ * Checks whether the given expression is evaluated to be an `multiset` value.
+ * Arguments:
+    * `expr` : an expression (any type is allowed).
+ * Return Value:
+    * a `boolean` on whether the argument is an `multiset` value or not,
+    * a `missing` if the argument is a `missing` value,
+    * a `null` if the argument is a `null` value.
+
+ * Example:
+
+        {
+          "a": is_multiset(true),
+          "b": is_multiset(false),
+          "c": is_multiset(null),
+          "d": is_multiset(missing),
+          "e": is_multiset("d"),
+          "f": ismultiset(4.0),
+          "g": ismultiset(["1", 2]),
+          "h": ismultiset({"a":1}),
+          "i": ismultiset({{"hello", 9328, "world", [1, 2, null]}})
+        };
+
+
+ * The expected result is:
+
+        { "a": false, "b": false, "c": null, "e": false, "f": false, "g": false, "h": false, "i": true }
+
+ The function has an alias `ismultiset`.
+
 ### is_atomic (is_atom) ###
  * Syntax:
 
@@ -121,6 +185,40 @@
  The function has three aliases: `isboolean`, `is_bool`, and `isbool`.
 
 
+### is_binary (is_bin) ###
+ * Syntax:
+
+        is_binary(expr)
+
+ * Checks whether the given expression is evaluated to be a `binary` value.
+ * Arguments:
+    * `expr` : an expression (any type is allowed).
+ * Return Value:
+    * a `boolean` on whether the argument is a `binary` value or not,
+    * a `missing` if the argument is a `missing` value,
+    * a `null` if the argument is a `null` value.
+
+ * Example:
+
+        {
+          "a": is_binary(true),
+          "b": is_binary(false),
+          "c": isbinary(null),
+          "d": isbinary(missing),
+          "e": isbin(point("1,2")),
+          "f": isbin(hex("ABCDEF0123456789")),
+          "g": is_bin(sub_binary(hex("AABBCCDD"), 4)),
+          "h": is_bin(2),
+          "i": is_bin({"a":1})
+        };
+
+
+ * The expected result is:
+
+        { "a": false, "b": false, "c": null, "e": false, "f": true, "g": true, "h": false, "i": false }
+
+ The function has three aliases: `isbinary`, `is_bin`, and `isbin`.
+
 ### is_number (is_num) ###
  * Syntax:
 
@@ -156,6 +254,432 @@
 
  The function has three aliases: `isnumber`, `is_num`, and `isnum`.
 
+### is_point ###
+ * Syntax:
+
+        is_point(expr)
+
+ * Checks whether the given expression is evaluated to be a `point` value.
+ * Arguments:
+    * `expr` : an expression (any type is allowed).
+ * Return Value:
+    * a `boolean` on whether the argument is a `point` value or not,
+    * a `missing` if the argument is a `missing` value,
+    * a `null` if the argument is a `null` value.
+
+ * Example:
+
+        {
+          "a": is_point(true),
+          "b": is_point(false),
+          "c": is_point(null),
+          "d": is_point(missing),
+          "e": is_point(point("1,2")),
+          "f": ispoint(line("30.0,70.0 50.0,90.0")),
+          "g": ispoint(rectangle("30.0,70.0 50.0,90.0")),
+          "h": ispoint(circle("30.0,70.0 5.0")),
+          "i": ispoint(polygon("1.0,1.0 2.0,2.0 3.0,3.0 4.0,4.0")),
+          "j": ispoint(3)
+        };
+
+
+ * The expected result is:
+
+        { "a": false, "b": false, "c": null, "e": true, "f": false, "g": false, "h": false, "i": false, "j": false }
+
+ The function has an alias `ispoint`.
+
+### is_line ###
+ * Syntax:
+
+        is_line(expr)
+
+ * Checks whether the given expression is evaluated to be a `line` value.
+ * Arguments:
+    * `expr` : an expression (any type is allowed).
+ * Return Value:
+    * a `boolean` on whether the argument is a `line` value or not,
+    * a `missing` if the argument is a `missing` value,
+    * a `null` if the argument is a `null` value.
+
+ * Example:
+
+        {
+          "a": is_line(true),
+          "b": is_line(false),
+          "c": is_line(null),
+          "d": is_line(missing),
+          "e": is_line(point("1,2")),
+          "f": isline(line("30.0,70.0 50.0,90.0")),
+          "g": isline(rectangle("30.0,70.0 50.0,90.0")),
+          "h": isline(circle("30.0,70.0 5.0")),
+          "i": isline(polygon("1.0,1.0 2.0,2.0 3.0,3.0 4.0,4.0")),
+          "j": isline(3)
+        };
+
+
+ * The expected result is:
+
+        { "a": false, "b": false, "c": null, "e": false, "f": true, "g": false, "h": false, "i": false, "j": false }
+
+ The function has an alias `isline`.
+ 
+### is_rectangle ###
+ * Syntax:
+
+        is_rectangle(expr)
+
+ * Checks whether the given expression is evaluated to be a `rectangle` value.
+ * Arguments:
+    * `expr` : an expression (any type is allowed).
+ * Return Value:
+    * a `boolean` on whether the argument is a `rectangle` value or not,
+    * a `missing` if the argument is a `missing` value,
+    * a `null` if the argument is a `null` value.
+
+ * Example:
+
+        {
+          "a": is_rectangle(true),
+          "b": is_rectangle(false),
+          "c": is_rectangle(null),
+          "d": is_rectangle(missing),
+          "e": is_rectangle(point("1,2")),
+          "f": isrectangle(line("30.0,70.0 50.0,90.0")),
+          "g": isrectangle(rectangle("30.0,70.0 50.0,90.0")),
+          "h": isrectangle(circle("30.0,70.0 5.0")),
+          "i": isrectangle(polygon("1.0,1.0 2.0,2.0 3.0,3.0 4.0,4.0")),
+          "j": isrectangle(3)
+        };
+
+
+ * The expected result is:
+
+        { "a": false, "b": false, "c": null, "e": false, "f": false, "g": true, "h": false, "i": false, "j": false }
+
+ The function has an alias `isrectangle`.
+ 
+### is_circle ###
+ * Syntax:
+
+        is_circle(expr)
+
+ * Checks whether the given expression is evaluated to be a `circle` value.
+ * Arguments:
+    * `expr` : an expression (any type is allowed).
+ * Return Value:
+    * a `boolean` on whether the argument is a `circle` value or not,
+    * a `missing` if the argument is a `missing` value,
+    * a `null` if the argument is a `null` value.
+
+ * Example:
+
+        {
+          "a": is_circle(true),
+          "b": is_circle(false),
+          "c": is_circle(null),
+          "d": is_circle(missing),
+          "e": is_circle(point("1,2")),
+          "f": iscircle(line("30.0,70.0 50.0,90.0")),
+          "g": iscircle(rectangle("30.0,70.0 50.0,90.0")),
+          "h": iscircle(circle("30.0,70.0 5.0")),
+          "i": iscircle(polygon("1.0,1.0 2.0,2.0 3.0,3.0 4.0,4.0")),
+          "j": iscircle(3)
+        };
+
+
+ * The expected result is:
+
+        { "a": false, "b": false, "c": null, "e": false, "f": false, "g": false, "h": true, "i": false, "j": false }
+
+ The function has an alias `iscircle`.
+ 
+### is_polygon ###
+ * Syntax:
+
+        is_polygon(expr)
+
+ * Checks whether the given expression is evaluated to be a `polygon` value.
+ * Arguments:
+    * `expr` : an expression (any type is allowed).
+ * Return Value:
+    * a `boolean` on whether the argument is a `polygon` value or not,
+    * a `missing` if the argument is a `missing` value,
+    * a `null` if the argument is a `null` value.
+
+ * Example:
+
+        {
+          "a": is_polygon(true),
+          "b": is_polygon(false),
+          "c": is_polygon(null),
+          "d": is_polygon(missing),
+          "e": is_polygon(point("1,2")),
+          "f": ispolygon(line("30.0,70.0 50.0,90.0")),
+          "g": ispolygon(rectangle("30.0,70.0 50.0,90.0")),
+          "h": ispolygon(circle("30.0,70.0 5.0")),
+          "i": ispolygon(polygon("1.0,1.0 2.0,2.0 3.0,3.0 4.0,4.0")),
+          "j": ispolygon(3)
+        };
+
+
+ * The expected result is:
+
+        { "a": false, "b": false, "c": null, "e": false, "f": false, "g": false, "h": false, "i": true, "j": false }
+
+ The function has an alias `ispolygon`.
+ 
+### is_spatial ###
+ * Syntax:
+
+        is_spatial(expr)
+
+ * Checks whether the given expression is evaluated to be a spatial value.
+ * Arguments:
+    * `expr` : an expression (any type is allowed).
+ * Return Value:
+    * a `boolean` on whether the argument is a `point`/`line`/`rectangle`/`circle`/`polygon` value or not,
+    * a `missing` if the argument is a `missing` value,
+    * a `null` if the argument is a `null` value.
+
+ * Example:
+
+        {
+          "a": is_spatial(true),
+          "b": is_spatial(false),
+          "c": is_spatial(null),
+          "d": is_spatial(missing),
+          "e": is_spatial(point("1,2")),
+          "f": isspatial(line("30.0,70.0 50.0,90.0")),
+          "g": isspatial(rectangle("30.0,70.0 50.0,90.0")),
+          "h": isspatial(circle("30.0,70.0 5.0")),
+          "i": isspatial(polygon("1.0,1.0 2.0,2.0 3.0,3.0 4.0,4.0")),
+          "j": isspatial(3)
+        };
+
+
+ * The expected result is:
+
+        { "a": false, "b": false, "c": null, "e": true, "f": true, "g": true, "h": true, "i": true, "j": false }
+
+ The function has an alias `isspatial`.
+ 
+### is_date ###
+ * Syntax:
+
+        is_date(expr)
+
+ * Checks whether the given expression is evaluated to be a `date` value.
+ * Arguments:
+    * `expr` : an expression (any type is allowed).
+ * Return Value:
+    * a `boolean` on whether the argument is a `date` value or not,
+    * a `missing` if the argument is a `missing` value,
+    * a `null` if the argument is a `null` value.
+
+ * Example:
+
+        {
+          "a": is_date(true),
+          "b": is_date(false),
+          "c": is_date(null),
+          "d": is_date(missing),
+          "e": is_date(date("-19700101")),
+          "f": isdate(date("2013-01-01")),
+          "g": isdate(time("12:12:12.039Z")),
+          "h": isdate(datetime("2013-01-01T12:12:12.039Z")),
+          "i": isdate(duration("P100Y12MT12M")),
+          "j": isdate(interval(date("2013-01-01"), date("20130505"))),
+          "k": isdate(3)
+        };
+
+
+ * The expected result is:
+
+        { "a": false, "b": false, "c": null, "e": true, "f": true, "g": false, "h": false, "i": false, "j": false, "k": false }
+
+ The function has an alias `isdate`.
+ 
+### is_datetime (is_timestamp) ###
+ * Syntax:
+
+        is_datetime(expr)
+
+ * Checks whether the given expression is evaluated to be a `datetime` value.
+ * Arguments:
+    * `expr` : an expression (any type is allowed).
+ * Return Value:
+    * a `boolean` on whether the argument is a `datetime` value or not,
+    * a `missing` if the argument is a `missing` value,
+    * a `null` if the argument is a `null` value.
+
+ * Example:
+
+        {
+          "a": is_datetime(true),
+          "b": is_datetime(false),
+          "c": is_datetime(null),
+          "d": is_datetime(missing),
+          "e": is_datetime(datetime("2016-02-02T12:09:22.023Z")),
+          "f": isdatetime(datetime("2011-03-03T12:10:42.011Z")),
+          "g": isdatetime(time("12:12:12.039Z")),
+          "h": is_timestamp(datetime("2013-01-01T12:12:12.039Z")),
+          "i": is_timestamp(duration("P100Y12MT12M")),
+          "j": istimestamp(interval(date("2013-01-01"), date("20130505"))),
+          "k": istimestamp(3)
+        };
+
+
+ * The expected result is:
+
+        { "a": false, "b": false, "c": null, "e": true, "f": true, "g": false, "h": true, "i": false, "j": false, "k": false }
+
+ The function has three aliases: `isdatetime`, `is_timestamp`, and `istimestamp`.
+ 
+### is_time ###
+ * Syntax:
+
+        is_time(expr)
+
+ * Checks whether the given expression is evaluated to be a `time` value.
+ * Arguments:
+    * `expr` : an expression (any type is allowed).
+ * Return Value:
+    * a `boolean` on whether the argument is a `time` value or not,
+    * a `missing` if the argument is a `missing` value,
+    * a `null` if the argument is a `null` value.
+
+ * Example:
+
+         {
+          "a": is_time(true),
+          "b": is_time(false),
+          "c": is_time(null),
+          "d": is_time(missing),
+          "e": is_time(time("08:00:00.000Z")),
+          "f": istime(date("2013-01-01")),
+          "g": istime(time("12:12:12.039Z")),
+          "h": istime(datetime("2013-01-01T12:12:12.039Z")),
+          "i": istime(duration("P100Y12MT12M")),
+          "j": istime(interval(date("2013-01-01"), date("20130505"))),
+          "k": istime(3)
+        };
+
+
+ * The expected result is:
+
+        { "a": false, "b": false, "c": null, "e": true, "f": false, "g": true, "h": false, "i": false, "j": false, "k": false }
+
+ The function has an alias `istime`.
+ 
+### is_duration ###
+ * Syntax:
+
+        is_duration(expr)
+
+ * Checks whether the given expression is evaluated to be a duration value.
+ * Arguments:
+    * `expr` : an expression (any type is allowed).
+ * Return Value:
+    * a `boolean` on whether the argument is a `duration/year_month_duration/day_time_duration` value or not,
+    * a `missing` if the argument is a `missing` value,
+    * a `null` if the argument is a `null` value.
+
+ * Example:
+
+         {
+          "a": is_duration(true),
+          "b": is_duration(false),
+          "c": is_duration(null),
+          "d": is_duration(missing),
+          "e": is_duration(duration("-PT20.943S")),
+          "f": isduration(date("2013-01-01")),
+          "g": isduration(time("12:12:12.039Z")),
+          "h": isduration(datetime("2013-01-01T12:12:12.039Z")),
+          "i": isduration(duration("P100Y12MT12M")),
+          "j": isduration(interval(date("2013-01-01"), date("20130505"))),
+          "k": isduration(3)
+        };
+
+
+ * The expected result is:
+
+        { "a": false, "b": false, "c": null, "e": true, "f": false, "g": false, "h": false, "i": true, "j": false, "k": false }
+
+ The function has an alias `isduration`.
+ 
+### is_interval ###
+ * Syntax:
+
+        is_interval(expr)
+
+ * Checks whether the given expression is evaluated to be a `interval` value.
+ * Arguments:
+    * `expr` : an expression (any type is allowed).
+ * Return Value:
+    * a `boolean` on whether the argument is a `interval` value or not,
+    * a `missing` if the argument is a `missing` value,
+    * a `null` if the argument is a `null` value.
+
+ * Example:
+
+         {
+          "a": is_interval(true),
+          "b": is_interval(false),
+          "c": is_interval(null),
+          "d": is_interval(missing),
+          "e": is_interval(interval(datetime("2013-01-01T00:01:01.000Z"), datetime("2013-05-05T13:39:01.049Z"))),
+          "f": isinterval(date("2013-01-01")),
+          "g": isinterval(time("12:12:12.039Z")),
+          "h": isinterval(datetime("2013-01-01T12:12:12.039Z")),
+          "i": isinterval(duration("P100Y12MT12M")),
+          "j": isinterval(interval(date("2013-01-01"), date("20130505"))),
+          "k": isinterval(3)
+        };
+
+
+ * The expected result is:
+
+        { "a": false, "b": false, "c": null, "e": true, "f": false, "g": false, "h": false, "i": false, "j": true, "k": false }
+
+ The function has an alias `isinterval`.
+ 
+### is_temporal ###
+ * Syntax:
+
+        is_temporal(expr)
+
+ * Checks whether the given expression is evaluated to be a temporal value.
+ * Arguments:
+    * `expr` : an expression (any type is allowed).
+ * Return Value:
+    * a `boolean` on whether the argument is a `date/datetime/time/duration/year_month_duration/day_time_duration/interval` value or not,
+    * a `missing` if the argument is a `missing` value,
+    * a `null` if the argument is a `null` value.
+
+ * Example:
+
+         {
+          "a": is_temporal(true),
+          "b": is_temporal(false),
+          "c": is_temporal(null),
+          "d": is_temporal(missing),
+          "e": is_temporal(duration("-PT20.943S")),
+          "f": istemporal(date("2013-01-01")),
+          "g": istemporal(time("12:12:12.039Z")),
+          "h": istemporal(datetime("2013-01-01T12:12:12.039Z")),
+          "i": istemporal(duration("P100Y12MT12M")),
+          "j": istemporal(interval(date("2013-01-01"), date("20130505"))),
+          "k": istemporal(3)
+        };
+
+
+ * The expected result is:
+
+        { "a": false, "b": false, "c": null, "e": true, "f": true, "g": true, "h": true, "i": true, "j": true, "k": false }
+
+ The function has an alias `istemporal`.
+ 
 ### is_object (is_obj) ###
  * Syntax:
 
@@ -225,6 +749,38 @@
 
  The function has three aliases: `isstring`, `is_str`, and `isstr`.
 
+### is_uuid ###
+ * Syntax:
+
+        is_uuid(expr)
+
+ * Checks whether the given expression is evaluated to be a `uuid` value.
+ * Arguments:
+    * `expr` : an expression (any type is allowed).
+ * Return Value:
+    * a `boolean` on whether the argument is a `uuid` value or not,
+    * a `missing` if the argument is a `missing` value,
+    * a `null` if the argument is a `null` value.
+
+ * Example:
+
+         {
+          "a": is_uuid(true),
+          "b": is_uuid(false),
+          "c": is_uuid(null),
+          "d": is_uuid(missing),
+          "e": isuuid(4.0),
+          "f": isuuid(date("2013-01-01")),
+          "g": isuuid(uuid("5c848e5c-6b6a-498f-8452-8847a2957421"))
+        };
+
+
+ * The expected result is:
+
+        { "a": false, "b": false, "c": null, "e": false, "f": false, "g": true }
+
+ The function has an alias `isuuid`.
+
 
 ### is_null ###
  * Syntax:
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/CommonFunctionMapUtil.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/CommonFunctionMapUtil.java
index c87f4dc..0d74272 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/CommonFunctionMapUtil.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/CommonFunctionMapUtil.java
@@ -74,6 +74,7 @@
         addFunctionMapping("regex_split", "regexp-split");
 
         // Type functions.
+        addFunctionMapping("gettype", "get-type"); // istype, internal: is-type
         addFunctionMapping("isnull", "is-null"); // isnull, internal: is-null
         addFunctionMapping("ismissing", "is-missing"); // ismissing, internal: is-missing
         addFunctionMapping("isunknown", "is-unknown"); // isunknown, internal: is-unknown
@@ -83,6 +84,24 @@
         addFunctionMapping("isboolean", "is-boolean"); // isboolean, internal: is-boolean
         addFunctionMapping("isbool", "is-boolean"); // isbool, internal: is-boolean
         addFunctionMapping("is_bool", "is-boolean"); // is_bool, internal: is-boolean
+        addFunctionMapping("isbinary", "is-binary"); // isbinary, internal: is-binary
+        addFunctionMapping("isbin", "is-binary"); // isbin, internal: is-binary
+        addFunctionMapping("is_bin", "is-binary"); // is_bin, internal: is-binary
+        addFunctionMapping("ispoint", "is-point"); // ispoint, internal: is-point
+        addFunctionMapping("isline", "is-line"); // isline, internal: is-line
+        addFunctionMapping("isrectangle", "is-rectangle"); // isrectangle, internal: is-rectangle
+        addFunctionMapping("iscircle", "is-circle"); // iscircle, internal: is-circle
+        addFunctionMapping("ispolygon", "is-polygon"); // ispolygon, internal: is-polygon
+        addFunctionMapping("isspatial", "is-spatial"); // isspatial, internal: is-spatial
+        addFunctionMapping("isdate", "is-date"); // isdate, internal: is-date
+        addFunctionMapping("isdatetime", "is-datetime"); // isdatetime, internal: is-datetime
+        addFunctionMapping("istimestamp", "is-datetime"); // istimestamp, internal: is-datetime
+        addFunctionMapping("is_timestamp", "is-datetime"); // is_timestamp, internal: is-datetime
+        addFunctionMapping("istime", "is-time"); // istime, internal: is-time
+        addFunctionMapping("isduration", "is-duration"); // isduration, internal: is-duration
+        addFunctionMapping("isinterval", "is-interval"); // isinterval, internal: is-interval
+        addFunctionMapping("istemporal", "is-temporal"); // istemporal, internal: is-temporal
+        addFunctionMapping("isuuid", "is-uuid"); // isuuid, internal: is-uuid
         addFunctionMapping("isnumber", "is-number"); // isnumber, internal: is-number
         addFunctionMapping("isnum", "is-number"); // isnum, internal: is-number
         addFunctionMapping("is_num", "is-number"); // is_num, internal: is-number
@@ -90,6 +109,7 @@
         addFunctionMapping("isstr", "is-string"); // isstr, internal: is-string
         addFunctionMapping("is_str", "is-string"); // is_str, internal: is-string
         addFunctionMapping("isarray", "is-array"); // isarray, internal: is-array
+        addFunctionMapping("ismultiset", "is-multiset"); // ismultiset, internal: is-multiset
         addFunctionMapping("isobject", "is-object"); // isobject, internal: is-object
         addFunctionMapping("isobj", "is-object"); // isobj, internal: is-object
         addFunctionMapping("is_obj", "is-object"); // is_obj, internal: is-object
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java
index 46a1268..51f5acd 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java
@@ -1487,6 +1487,30 @@
             new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-atomic", 1);
     public static final FunctionIdentifier IS_BOOLEAN =
             new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-boolean", 1);
+    public static final FunctionIdentifier IS_BINARY =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-binary", 1);
+    public static final FunctionIdentifier IS_POINT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-point", 1);
+    public static final FunctionIdentifier IS_LINE = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-line", 1);
+    public static final FunctionIdentifier IS_RECTANGLE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-rectangle", 1);
+    public static final FunctionIdentifier IS_CIRCLE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-circle", 1);
+    public static final FunctionIdentifier IS_POLYGON =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-polygon", 1);
+    public static final FunctionIdentifier IS_SPATIAL =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-spatial", 1);
+    public static final FunctionIdentifier IS_DATE = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-date", 1);
+    public static final FunctionIdentifier IS_DATETIME =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-datetime", 1);
+    public static final FunctionIdentifier IS_TIME = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-time", 1);
+    public static final FunctionIdentifier IS_DURATION =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-duration", 1);
+    public static final FunctionIdentifier IS_INTERVAL =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-interval", 1);
+    public static final FunctionIdentifier IS_TEMPORAL =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-temporal", 1);
+    public static final FunctionIdentifier IS_UUID = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-uuid", 1);
     public static final FunctionIdentifier IS_NUMBER =
             new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-number", 1);
     public static final FunctionIdentifier IS_STRING =
@@ -1495,6 +1519,10 @@
             new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-array", 1);
     public static final FunctionIdentifier IS_OBJECT =
             new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-object", 1);
+    public static final FunctionIdentifier IS_MULTISET =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-multiset", 1);
+    public static final FunctionIdentifier GET_TYPE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-type", 1);
 
     public static final FunctionIdentifier IS_SYSTEM_NULL =
             new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-system-null", 1);
@@ -1580,12 +1608,29 @@
         addFunction(IS_SYSTEM_NULL, ABooleanTypeComputer.INSTANCE, true);
         addFunction(IS_ATOMIC, ABooleanTypeComputer.INSTANCE, true);
         addFunction(IS_BOOLEAN, ABooleanTypeComputer.INSTANCE, true);
+        addFunction(IS_BINARY, ABooleanTypeComputer.INSTANCE, true);
+        addFunction(IS_POINT, ABooleanTypeComputer.INSTANCE, true);
+        addFunction(IS_LINE, ABooleanTypeComputer.INSTANCE, true);
+        addFunction(IS_RECTANGLE, ABooleanTypeComputer.INSTANCE, true);
+        addFunction(IS_CIRCLE, ABooleanTypeComputer.INSTANCE, true);
+        addFunction(IS_POLYGON, ABooleanTypeComputer.INSTANCE, true);
+        addFunction(IS_SPATIAL, ABooleanTypeComputer.INSTANCE, true);
+        addFunction(IS_DATE, ABooleanTypeComputer.INSTANCE, true);
+        addFunction(IS_DATETIME, ABooleanTypeComputer.INSTANCE, true);
+        addFunction(IS_TIME, ABooleanTypeComputer.INSTANCE, true);
+        addFunction(IS_DURATION, ABooleanTypeComputer.INSTANCE, true);
+        addFunction(IS_INTERVAL, ABooleanTypeComputer.INSTANCE, true);
+        addFunction(IS_TEMPORAL, ABooleanTypeComputer.INSTANCE, true);
+        addFunction(IS_UUID, ABooleanTypeComputer.INSTANCE, true);
         addFunction(IS_NUMBER, ABooleanTypeComputer.INSTANCE, true);
         addFunction(IS_STRING, ABooleanTypeComputer.INSTANCE, true);
         addFunction(IS_ARRAY, ABooleanTypeComputer.INSTANCE, true);
         addFunction(IS_OBJECT, ABooleanTypeComputer.INSTANCE, true);
+        addFunction(IS_MULTISET, ABooleanTypeComputer.INSTANCE, true);
         addFunction(NOT, ABooleanTypeComputer.INSTANCE, true);
 
+        addFunction(GET_TYPE, AStringTypeComputer.INSTANCE, true);
+
         addPrivateFunction(EQ, BooleanFunctionTypeComputer.INSTANCE, true);
         addPrivateFunction(LE, BooleanFunctionTypeComputer.INSTANCE, true);
         addPrivateFunction(GE, BooleanFunctionTypeComputer.INSTANCE, true);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/AbstractMultiTypeCheckEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/AbstractMultiTypeCheckEvaluator.java
new file mode 100644
index 0000000..b5ada68
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/AbstractMultiTypeCheckEvaluator.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.runtime.evaluators.common;
+
+import java.io.DataOutput;
+
+import org.apache.asterix.dataflow.data.nontagged.serde.AObjectSerializerDeserializer;
+import org.apache.asterix.om.base.ABoolean;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.api.IPointable;
+import org.apache.hyracks.data.std.primitive.VoidPointable;
+import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
+import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
+
+/**
+ * For evaluators which must check more than one type.
+ */
+public abstract class AbstractMultiTypeCheckEvaluator implements IScalarEvaluator {
+    protected static final AObjectSerializerDeserializer aObjectSerializerDeserializer =
+            AObjectSerializerDeserializer.INSTANCE;
+
+    protected final ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
+    protected final DataOutput out = resultStorage.getDataOutput();
+    protected final IPointable argPtr = new VoidPointable();
+    protected final IScalarEvaluator eval;
+    protected ABoolean res;
+
+    private byte[] acceptedTypeTags;
+
+    public AbstractMultiTypeCheckEvaluator(IScalarEvaluator argEval, byte... acceptedTypeTags) {
+        this.eval = argEval;
+        this.acceptedTypeTags = acceptedTypeTags;
+    }
+
+    @Override
+    public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
+        eval.evaluate(tuple, argPtr);
+        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
+            return;
+        }
+
+        res = isMatch(argPtr.getByteArray()[argPtr.getStartOffset()]) ? ABoolean.TRUE : ABoolean.FALSE;
+        resultStorage.reset();
+        aObjectSerializerDeserializer.serialize(res, out);
+        result.set(resultStorage);
+    }
+
+    protected boolean isMatch(byte typeTag) {
+        for (byte tt : acceptedTypeTags) {
+            if (typeTag == tt) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/AbstractTypeCheckEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/AbstractTypeCheckEvaluator.java
index 203c664..d08b53b 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/AbstractTypeCheckEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/AbstractTypeCheckEvaluator.java
@@ -23,7 +23,7 @@
 
 import org.apache.asterix.dataflow.data.nontagged.serde.AObjectSerializerDeserializer;
 import org.apache.asterix.om.base.ABoolean;
-import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.data.std.api.IPointable;
@@ -32,19 +32,21 @@
 import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
 public abstract class AbstractTypeCheckEvaluator implements IScalarEvaluator {
+    protected static final AObjectSerializerDeserializer aObjectSerializerDeserializer =
+            AObjectSerializerDeserializer.INSTANCE;
 
-    protected enum Value {
-        TRUE,
-        FALSE,
-        MISSING
-    }
-
-    protected static final byte[] MISSING_BYTES = new byte[] { ATypeTag.SERIALIZED_MISSING_TYPE_TAG };
     protected final ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
     protected final DataOutput out = resultStorage.getDataOutput();
     protected final IPointable argPtr = new VoidPointable();
     protected final IScalarEvaluator eval;
-    protected static final AObjectSerializerDeserializer aObjSerDer = AObjectSerializerDeserializer.INSTANCE;
+    protected ABoolean res;
+
+    private byte acceptedTypeTag;
+
+    public AbstractTypeCheckEvaluator(IScalarEvaluator argEval, byte acceptedTypeTag) {
+        this.acceptedTypeTag = acceptedTypeTag;
+        this.eval = argEval;
+    }
 
     public AbstractTypeCheckEvaluator(IScalarEvaluator argEval) {
         this.eval = argEval;
@@ -53,17 +55,17 @@
     @Override
     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
         eval.evaluate(tuple, argPtr);
-        Value match = isMatch(argPtr.getByteArray()[argPtr.getStartOffset()]);
-        if (match == Value.MISSING) {
-            result.set(MISSING_BYTES, 0, MISSING_BYTES.length);
+        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
             return;
         }
-        ABoolean res = match == Value.TRUE ? ABoolean.TRUE : ABoolean.FALSE;
+
+        res = isMatch(argPtr.getByteArray()[argPtr.getStartOffset()]) ? ABoolean.TRUE : ABoolean.FALSE;
         resultStorage.reset();
-        aObjSerDer.serialize(res, out);
+        aObjectSerializerDeserializer.serialize(res, out);
         result.set(resultStorage);
     }
 
-    protected abstract Value isMatch(byte typeTag);
-
+    protected boolean isMatch(byte typeTag) {
+        return typeTag == acceptedTypeTag;
+    }
 }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/GetTypeDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/GetTypeDescriptor.java
new file mode 100644
index 0000000..843ef62
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/GetTypeDescriptor.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.runtime.evaluators.functions;
+
+import java.io.DataOutput;
+import java.io.IOException;
+
+import org.apache.asterix.om.functions.BuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.api.IPointable;
+import org.apache.hyracks.data.std.primitive.VoidPointable;
+import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
+import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
+import org.apache.hyracks.util.string.UTF8StringWriter;
+
+public class GetTypeDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+    public static final IFunctionDescriptorFactory FACTORY = GetTypeDescriptor::new;
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
+        return new IScalarEvaluatorFactory() {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
+                return new IScalarEvaluator() {
+                    private ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
+                    private DataOutput dataOutput = resultStorage.getDataOutput();
+                    private IScalarEvaluator inputEval = args[0].createScalarEvaluator(ctx);
+                    final IPointable inputArg = new VoidPointable();
+
+                    private StringBuilder stringBuilder = new StringBuilder();
+                    private final UTF8StringWriter writer = new UTF8StringWriter();
+
+                    @Override
+                    public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
+                        resultStorage.reset();
+                        inputEval.evaluate(tuple, inputArg);
+
+                        byte[] bytes = inputArg.getByteArray();
+                        int offset = inputArg.getStartOffset();
+                        stringBuilder.append(ATypeTag.VALUE_TYPE_MAPPING[bytes[offset]].toString());
+
+                        try {
+                            dataOutput.writeByte(ATypeTag.SERIALIZED_STRING_TYPE_TAG);
+                            writer.writeUTF8(stringBuilder.toString(), dataOutput);
+                        } catch (IOException e) {
+                            throw HyracksDataException.create(e);
+                        }
+                        result.set(resultStorage);
+                    }
+                };
+
+            }
+        };
+
+    }
+
+    @Override
+    public FunctionIdentifier getIdentifier() {
+        return BuiltinFunctions.GET_TYPE;
+    }
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsArrayDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsArrayDescriptor.java
index 1405f2e..bf47e08 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsArrayDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsArrayDescriptor.java
@@ -20,9 +20,7 @@
 package org.apache.asterix.runtime.evaluators.functions;
 
 import org.apache.asterix.common.annotations.MissingNullInOutFunction;
-import org.apache.asterix.om.base.ABoolean;
 import org.apache.asterix.om.functions.BuiltinFunctions;
-import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
@@ -32,18 +30,11 @@
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.data.std.api.IPointable;
-import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
 @MissingNullInOutFunction
 public class IsArrayDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+    public static final IFunctionDescriptorFactory FACTORY = IsArrayDescriptor::new;
     private static final long serialVersionUID = 1L;
-    public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
-        @Override
-        public IFunctionDescriptor createFunctionDescriptor() {
-            return new IsArrayDescriptor();
-        }
-    };
 
     @Override
     public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
@@ -52,33 +43,8 @@
 
             @Override
             public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
-                final IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
-                return new AbstractTypeCheckEvaluator(eval) {
-
-                    // Overridden because other functions using the same class shouldn't perform the missing/null check
-                    @Override
-                    public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
-                        eval.evaluate(tuple, argPtr);
-
-                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
-                            return;
-                        }
-
-                        Value match = isMatch(argPtr.getByteArray()[argPtr.getStartOffset()]);
-                        if (match == Value.MISSING) {
-                            result.set(MISSING_BYTES, 0, MISSING_BYTES.length);
-                            return;
-                        }
-                        ABoolean res = match == Value.TRUE ? ABoolean.TRUE : ABoolean.FALSE;
-                        resultStorage.reset();
-                        aObjSerDer.serialize(res, out);
-                        result.set(resultStorage);
-                    }
-
-                    @Override
-                    protected Value isMatch(byte typeTag) {
-                        return typeTag == ATypeTag.SERIALIZED_ORDEREDLIST_TYPE_TAG ? Value.TRUE : Value.FALSE;
-                    }
+                return new AbstractTypeCheckEvaluator(args[0].createScalarEvaluator(ctx),
+                        ATypeTag.SERIALIZED_ORDEREDLIST_TYPE_TAG) {
                 };
             }
         };
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsAtomicDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsAtomicDescriptor.java
index dded7ed..775b8be 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsAtomicDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsAtomicDescriptor.java
@@ -20,9 +20,7 @@
 package org.apache.asterix.runtime.evaluators.functions;
 
 import org.apache.asterix.common.annotations.MissingNullInOutFunction;
-import org.apache.asterix.om.base.ABoolean;
 import org.apache.asterix.om.functions.BuiltinFunctions;
-import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.EnumDeserializer;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
@@ -32,18 +30,11 @@
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.data.std.api.IPointable;
-import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
 @MissingNullInOutFunction
 public class IsAtomicDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+    public static final IFunctionDescriptorFactory FACTORY = IsAtomicDescriptor::new;
     private static final long serialVersionUID = 1L;
-    public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
-        @Override
-        public IFunctionDescriptor createFunctionDescriptor() {
-            return new IsAtomicDescriptor();
-        }
-    };
 
     @Override
     public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
@@ -52,37 +43,11 @@
 
             @Override
             public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
-                final IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
-                return new AbstractTypeCheckEvaluator(eval) {
-
-                    // TODO(Hussain) Consider making a different AbstractTypeCheckEvaluator class for the methods
-                    // that require the Missing/Null checks, that should keep the code cleaner. Currently, this is the
-                    // scenario because some functions require Missing/Null checks while others don't, and they're
-                    // extending the same base class, so the evaluate(...) needs to be overridden
-                    @Override
-                    public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
-                        eval.evaluate(tuple, argPtr);
-
-                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
-                            return;
-                        }
-
-                        Value match = isMatch(argPtr.getByteArray()[argPtr.getStartOffset()]);
-                        if (match == Value.MISSING) {
-                            result.set(MISSING_BYTES, 0, MISSING_BYTES.length);
-                            return;
-                        }
-                        ABoolean res = match == Value.TRUE ? ABoolean.TRUE : ABoolean.FALSE;
-                        resultStorage.reset();
-                        aObjSerDer.serialize(res, out);
-                        result.set(resultStorage);
-                    }
+                return new AbstractTypeCheckEvaluator(args[0].createScalarEvaluator(ctx)) {
 
                     @Override
-                    protected Value isMatch(byte typeTag) {
-                        return EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(typeTag).isDerivedType() ? Value.FALSE
-                                : Value.TRUE;
-
+                    protected boolean isMatch(byte typeTag) {
+                        return !EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(typeTag).isDerivedType();
                     }
                 };
             }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsBinaryDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsBinaryDescriptor.java
new file mode 100644
index 0000000..c1e3213
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsBinaryDescriptor.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.runtime.evaluators.functions;
+
+import org.apache.asterix.common.annotations.MissingNullInOutFunction;
+import org.apache.asterix.om.functions.BuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.common.AbstractTypeCheckEvaluator;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+@MissingNullInOutFunction
+public class IsBinaryDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+    public static final IFunctionDescriptorFactory FACTORY = IsBinaryDescriptor::new;
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
+        return new IScalarEvaluatorFactory() {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
+                return new AbstractTypeCheckEvaluator(args[0].createScalarEvaluator(ctx),
+                        ATypeTag.SERIALIZED_BINARY_TYPE_TAG) {
+                };
+            }
+        };
+    }
+
+    @Override
+    public FunctionIdentifier getIdentifier() {
+        return BuiltinFunctions.IS_BINARY;
+    }
+
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsBooleanDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsBooleanDescriptor.java
index 101bdc6..9c6e101 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsBooleanDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsBooleanDescriptor.java
@@ -20,9 +20,7 @@
 package org.apache.asterix.runtime.evaluators.functions;
 
 import org.apache.asterix.common.annotations.MissingNullInOutFunction;
-import org.apache.asterix.om.base.ABoolean;
 import org.apache.asterix.om.functions.BuiltinFunctions;
-import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
@@ -32,18 +30,11 @@
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.data.std.api.IPointable;
-import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
 @MissingNullInOutFunction
 public class IsBooleanDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+    public static final IFunctionDescriptorFactory FACTORY = IsBooleanDescriptor::new;
     private static final long serialVersionUID = 1L;
-    public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
-        @Override
-        public IFunctionDescriptor createFunctionDescriptor() {
-            return new IsBooleanDescriptor();
-        }
-    };
 
     @Override
     public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
@@ -52,33 +43,8 @@
 
             @Override
             public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
-                final IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
-                return new AbstractTypeCheckEvaluator(eval) {
-
-                    // Overridden because other functions using the same class shouldn't perform the missing/null check
-                    @Override
-                    public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
-                        eval.evaluate(tuple, argPtr);
-
-                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
-                            return;
-                        }
-
-                        Value match = isMatch(argPtr.getByteArray()[argPtr.getStartOffset()]);
-                        if (match == Value.MISSING) {
-                            result.set(MISSING_BYTES, 0, MISSING_BYTES.length);
-                            return;
-                        }
-                        ABoolean res = match == Value.TRUE ? ABoolean.TRUE : ABoolean.FALSE;
-                        resultStorage.reset();
-                        aObjSerDer.serialize(res, out);
-                        result.set(resultStorage);
-                    }
-
-                    @Override
-                    protected Value isMatch(byte typeTag) {
-                        return typeTag == ATypeTag.SERIALIZED_BOOLEAN_TYPE_TAG ? Value.TRUE : Value.FALSE;
-                    }
+                return new AbstractTypeCheckEvaluator(args[0].createScalarEvaluator(ctx),
+                        ATypeTag.SERIALIZED_BOOLEAN_TYPE_TAG) {
                 };
             }
         };
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsCircleDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsCircleDescriptor.java
new file mode 100644
index 0000000..d0c7fdf
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsCircleDescriptor.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.runtime.evaluators.functions;
+
+import org.apache.asterix.common.annotations.MissingNullInOutFunction;
+import org.apache.asterix.om.functions.BuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.common.AbstractTypeCheckEvaluator;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+@MissingNullInOutFunction
+public class IsCircleDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+    public static final IFunctionDescriptorFactory FACTORY = IsCircleDescriptor::new;
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
+        return new IScalarEvaluatorFactory() {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
+                return new AbstractTypeCheckEvaluator(args[0].createScalarEvaluator(ctx),
+                        ATypeTag.SERIALIZED_CIRCLE_TYPE_TAG) {
+                };
+            }
+        };
+    }
+
+    @Override
+    public FunctionIdentifier getIdentifier() {
+        return BuiltinFunctions.IS_CIRCLE;
+    }
+
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsDateDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsDateDescriptor.java
new file mode 100644
index 0000000..98e812f
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsDateDescriptor.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.runtime.evaluators.functions;
+
+import org.apache.asterix.common.annotations.MissingNullInOutFunction;
+import org.apache.asterix.om.functions.BuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.common.AbstractTypeCheckEvaluator;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+@MissingNullInOutFunction
+public class IsDateDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+    public static final IFunctionDescriptorFactory FACTORY = IsDateDescriptor::new;
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
+        return new IScalarEvaluatorFactory() {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
+                return new AbstractTypeCheckEvaluator(args[0].createScalarEvaluator(ctx),
+                        ATypeTag.SERIALIZED_DATE_TYPE_TAG) {
+                };
+            }
+        };
+    }
+
+    @Override
+    public FunctionIdentifier getIdentifier() {
+        return BuiltinFunctions.IS_DATE;
+    }
+
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsDatetimeDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsDatetimeDescriptor.java
new file mode 100644
index 0000000..5a72609
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsDatetimeDescriptor.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.runtime.evaluators.functions;
+
+import org.apache.asterix.common.annotations.MissingNullInOutFunction;
+import org.apache.asterix.om.functions.BuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.common.AbstractTypeCheckEvaluator;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+@MissingNullInOutFunction
+public class IsDatetimeDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+    public static final IFunctionDescriptorFactory FACTORY = IsDatetimeDescriptor::new;
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
+        return new IScalarEvaluatorFactory() {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
+                return new AbstractTypeCheckEvaluator(args[0].createScalarEvaluator(ctx),
+                        ATypeTag.SERIALIZED_DATETIME_TYPE_TAG) {
+                };
+            }
+        };
+    }
+
+    @Override
+    public FunctionIdentifier getIdentifier() {
+        return BuiltinFunctions.IS_DATETIME;
+    }
+
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsDurationDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsDurationDescriptor.java
new file mode 100644
index 0000000..bf13cbb
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsDurationDescriptor.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.runtime.evaluators.functions;
+
+import org.apache.asterix.common.annotations.MissingNullInOutFunction;
+import org.apache.asterix.om.functions.BuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.common.AbstractMultiTypeCheckEvaluator;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+@MissingNullInOutFunction
+public class IsDurationDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+    public static final IFunctionDescriptorFactory FACTORY = IsDurationDescriptor::new;
+    private static final long serialVersionUID = 1L;
+
+    private static final byte[] checkedTypes = new byte[] { ATypeTag.SERIALIZED_DURATION_TYPE_TAG,
+            ATypeTag.SERIALIZED_YEAR_MONTH_DURATION_TYPE_TAG, ATypeTag.SERIALIZED_DAY_TIME_DURATION_TYPE_TAG };
+
+    @Override
+    public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
+        return new IScalarEvaluatorFactory() {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
+                return new AbstractMultiTypeCheckEvaluator(args[0].createScalarEvaluator(ctx), checkedTypes) {
+                };
+            }
+        };
+    }
+
+    @Override
+    public FunctionIdentifier getIdentifier() {
+        return BuiltinFunctions.IS_DURATION;
+    }
+
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsIntervalDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsIntervalDescriptor.java
new file mode 100644
index 0000000..0c1fd02
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsIntervalDescriptor.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.runtime.evaluators.functions;
+
+import org.apache.asterix.common.annotations.MissingNullInOutFunction;
+import org.apache.asterix.om.functions.BuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.common.AbstractTypeCheckEvaluator;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+@MissingNullInOutFunction
+public class IsIntervalDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+    public static final IFunctionDescriptorFactory FACTORY = IsIntervalDescriptor::new;
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
+        return new IScalarEvaluatorFactory() {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
+                return new AbstractTypeCheckEvaluator(args[0].createScalarEvaluator(ctx),
+                        ATypeTag.SERIALIZED_INTERVAL_TYPE_TAG) {
+                };
+            }
+        };
+    }
+
+    @Override
+    public FunctionIdentifier getIdentifier() {
+        return BuiltinFunctions.IS_INTERVAL;
+    }
+
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsLineDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsLineDescriptor.java
new file mode 100644
index 0000000..1f62417
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsLineDescriptor.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.runtime.evaluators.functions;
+
+import org.apache.asterix.common.annotations.MissingNullInOutFunction;
+import org.apache.asterix.om.functions.BuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.common.AbstractTypeCheckEvaluator;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+@MissingNullInOutFunction
+public class IsLineDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+    public static final IFunctionDescriptorFactory FACTORY = IsLineDescriptor::new;
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
+        return new IScalarEvaluatorFactory() {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
+                return new AbstractTypeCheckEvaluator(args[0].createScalarEvaluator(ctx),
+                        ATypeTag.SERIALIZED_LINE_TYPE_TAG) {
+                };
+            }
+        };
+    }
+
+    @Override
+    public FunctionIdentifier getIdentifier() {
+        return BuiltinFunctions.IS_LINE;
+    }
+
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsMissingDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsMissingDescriptor.java
index 7509535..8c8f5c2 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsMissingDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsMissingDescriptor.java
@@ -18,8 +18,8 @@
  */
 package org.apache.asterix.runtime.evaluators.functions;
 
+import org.apache.asterix.om.base.ABoolean;
 import org.apache.asterix.om.functions.BuiltinFunctions;
-import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
@@ -29,15 +29,12 @@
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.api.IPointable;
+import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
 public class IsMissingDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+    public static final IFunctionDescriptorFactory FACTORY = IsMissingDescriptor::new;
     private static final long serialVersionUID = 1L;
-    public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
-        @Override
-        public IFunctionDescriptor createFunctionDescriptor() {
-            return new IsMissingDescriptor();
-        }
-    };
 
     @Override
     public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
@@ -46,12 +43,16 @@
 
             @Override
             public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
-                final IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
-                return new AbstractTypeCheckEvaluator(eval) {
+                return new AbstractTypeCheckEvaluator(args[0].createScalarEvaluator(ctx),
+                        ATypeTag.SERIALIZED_MISSING_TYPE_TAG) {
 
                     @Override
-                    protected Value isMatch(byte typeTag) {
-                        return typeTag == ATypeTag.SERIALIZED_MISSING_TYPE_TAG ? Value.TRUE : Value.FALSE;
+                    public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
+                        eval.evaluate(tuple, argPtr);
+                        res = isMatch(argPtr.getByteArray()[argPtr.getStartOffset()]) ? ABoolean.TRUE : ABoolean.FALSE;
+                        resultStorage.reset();
+                        aObjectSerializerDeserializer.serialize(res, out);
+                        result.set(resultStorage);
                     }
                 };
             }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsMultisetDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsMultisetDescriptor.java
new file mode 100644
index 0000000..49710c0
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsMultisetDescriptor.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.runtime.evaluators.functions;
+
+import org.apache.asterix.common.annotations.MissingNullInOutFunction;
+import org.apache.asterix.om.functions.BuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.common.AbstractTypeCheckEvaluator;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+@MissingNullInOutFunction
+public class IsMultisetDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+    public static final IFunctionDescriptorFactory FACTORY = IsMultisetDescriptor::new;
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
+        return new IScalarEvaluatorFactory() {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
+                return new AbstractTypeCheckEvaluator(args[0].createScalarEvaluator(ctx),
+                        ATypeTag.SERIALIZED_UNORDEREDLIST_TYPE_TAG) {
+                };
+            }
+        };
+    }
+
+    @Override
+    public FunctionIdentifier getIdentifier() {
+        return BuiltinFunctions.IS_MULTISET;
+    }
+
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsNullDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsNullDescriptor.java
index 7347b83..1c4aa8e 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsNullDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsNullDescriptor.java
@@ -18,8 +18,8 @@
  */
 package org.apache.asterix.runtime.evaluators.functions;
 
+import org.apache.asterix.om.base.ABoolean;
 import org.apache.asterix.om.functions.BuiltinFunctions;
-import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
@@ -29,15 +29,12 @@
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.api.IPointable;
+import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
 public class IsNullDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+    public static final IFunctionDescriptorFactory FACTORY = IsNullDescriptor::new;
     private static final long serialVersionUID = 1L;
-    public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
-        @Override
-        public IFunctionDescriptor createFunctionDescriptor() {
-            return new IsNullDescriptor();
-        }
-    };
 
     @Override
     public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
@@ -46,15 +43,25 @@
 
             @Override
             public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
-                final IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
-                return new AbstractTypeCheckEvaluator(eval) {
+                return new AbstractTypeCheckEvaluator(args[0].createScalarEvaluator(ctx),
+                        ATypeTag.SERIALIZED_NULL_TYPE_TAG) {
+                    private final byte[] MISSING_BYTES = new byte[] { ATypeTag.SERIALIZED_MISSING_TYPE_TAG };
 
                     @Override
-                    protected Value isMatch(byte typeTag) {
-                        if (typeTag == ATypeTag.SERIALIZED_MISSING_TYPE_TAG) {
-                            return Value.MISSING;
+                    public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
+                        eval.evaluate(tuple, argPtr);
+
+                        // We handle the missing case first and separately.
+                        byte tt = argPtr.getByteArray()[argPtr.getStartOffset()];
+                        if (tt == ATypeTag.SERIALIZED_MISSING_TYPE_TAG) {
+                            result.set(MISSING_BYTES, 0, MISSING_BYTES.length);
+                            return;
                         }
-                        return typeTag == ATypeTag.SERIALIZED_NULL_TYPE_TAG ? Value.TRUE : Value.FALSE;
+
+                        res = isMatch(tt) ? ABoolean.TRUE : ABoolean.FALSE;
+                        resultStorage.reset();
+                        aObjectSerializerDeserializer.serialize(res, out);
+                        result.set(resultStorage);
                     }
                 };
             }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsNumberDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsNumberDescriptor.java
index 03dcae6..9e70669 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsNumberDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsNumberDescriptor.java
@@ -20,30 +20,24 @@
 package org.apache.asterix.runtime.evaluators.functions;
 
 import org.apache.asterix.common.annotations.MissingNullInOutFunction;
-import org.apache.asterix.om.base.ABoolean;
 import org.apache.asterix.om.functions.BuiltinFunctions;
-import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
-import org.apache.asterix.runtime.evaluators.common.AbstractTypeCheckEvaluator;
+import org.apache.asterix.runtime.evaluators.common.AbstractMultiTypeCheckEvaluator;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.data.std.api.IPointable;
-import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
 @MissingNullInOutFunction
 public class IsNumberDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+    public static final IFunctionDescriptorFactory FACTORY = IsNumberDescriptor::new;
     private static final long serialVersionUID = 1L;
-    public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
-        @Override
-        public IFunctionDescriptor createFunctionDescriptor() {
-            return new IsNumberDescriptor();
-        }
-    };
+    private static final byte[] checkedTypes = new byte[] { ATypeTag.SERIALIZED_INT8_TYPE_TAG,
+            ATypeTag.SERIALIZED_INT16_TYPE_TAG, ATypeTag.SERIALIZED_INT32_TYPE_TAG, ATypeTag.SERIALIZED_INT64_TYPE_TAG,
+            ATypeTag.SERIALIZED_FLOAT_TYPE_TAG, ATypeTag.SERIALIZED_DOUBLE_TYPE_TAG };
 
     @Override
     public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
@@ -52,38 +46,7 @@
 
             @Override
             public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
-                final IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
-                return new AbstractTypeCheckEvaluator(eval) {
-
-                    // Overridden because other functions using the same class shouldn't perform the missing/null check
-                    @Override
-                    public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
-                        eval.evaluate(tuple, argPtr);
-
-                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
-                            return;
-                        }
-
-                        Value match = isMatch(argPtr.getByteArray()[argPtr.getStartOffset()]);
-                        if (match == Value.MISSING) {
-                            result.set(MISSING_BYTES, 0, MISSING_BYTES.length);
-                            return;
-                        }
-                        ABoolean res = match == Value.TRUE ? ABoolean.TRUE : ABoolean.FALSE;
-                        resultStorage.reset();
-                        aObjSerDer.serialize(res, out);
-                        result.set(resultStorage);
-                    }
-
-                    @Override
-                    protected Value isMatch(byte typeTag) {
-                        return typeTag == ATypeTag.SERIALIZED_INT8_TYPE_TAG
-                                || typeTag == ATypeTag.SERIALIZED_INT16_TYPE_TAG
-                                || typeTag == ATypeTag.SERIALIZED_INT32_TYPE_TAG
-                                || typeTag == ATypeTag.SERIALIZED_INT64_TYPE_TAG
-                                || typeTag == ATypeTag.SERIALIZED_FLOAT_TYPE_TAG
-                                || typeTag == ATypeTag.SERIALIZED_DOUBLE_TYPE_TAG ? Value.TRUE : Value.FALSE;
-                    }
+                return new AbstractMultiTypeCheckEvaluator(args[0].createScalarEvaluator(ctx), checkedTypes) {
                 };
             }
         };
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsNumericAddCompatibleDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsNumericAddCompatibleDescriptor.java
index 46d5666..9dc1e0a 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsNumericAddCompatibleDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsNumericAddCompatibleDescriptor.java
@@ -19,17 +19,19 @@
 
 package org.apache.asterix.runtime.evaluators.functions;
 
+import org.apache.asterix.om.base.ABoolean;
 import org.apache.asterix.om.functions.BuiltinFunctions;
-import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
-import org.apache.asterix.runtime.evaluators.common.AbstractTypeCheckEvaluator;
+import org.apache.asterix.runtime.evaluators.common.AbstractMultiTypeCheckEvaluator;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.api.IPointable;
+import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
 /**
  * Returns {@code TRUE} if the argument type is one of the types that are allowed on the left side of
@@ -57,15 +59,15 @@
  * @see AbstractNumericArithmeticEval
  */
 public class IsNumericAddCompatibleDescriptor extends AbstractScalarFunctionDynamicDescriptor {
-
+    public static final IFunctionDescriptorFactory FACTORY = IsNumericAddCompatibleDescriptor::new;
     private static final long serialVersionUID = 1L;
-
-    public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
-        @Override
-        public IFunctionDescriptor createFunctionDescriptor() {
-            return new IsNumericAddCompatibleDescriptor();
-        }
-    };
+    private static final byte[] checkedTypes = new byte[] { ATypeTag.SERIALIZED_MISSING_TYPE_TAG,
+            ATypeTag.SERIALIZED_NULL_TYPE_TAG, ATypeTag.SERIALIZED_INT8_TYPE_TAG, ATypeTag.SERIALIZED_INT16_TYPE_TAG,
+            ATypeTag.SERIALIZED_INT32_TYPE_TAG, ATypeTag.SERIALIZED_INT64_TYPE_TAG, ATypeTag.SERIALIZED_FLOAT_TYPE_TAG,
+            ATypeTag.SERIALIZED_DOUBLE_TYPE_TAG, ATypeTag.SERIALIZED_DATETIME_TYPE_TAG,
+            ATypeTag.SERIALIZED_TIME_TYPE_TAG, ATypeTag.SERIALIZED_DATE_TYPE_TAG,
+            ATypeTag.SERIALIZED_YEAR_MONTH_DURATION_TYPE_TAG, ATypeTag.SERIALIZED_DAY_TIME_DURATION_TYPE_TAG,
+            ATypeTag.SERIALIZED_DURATION_TYPE_TAG };
 
     @Override
     public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
@@ -74,29 +76,14 @@
 
             @Override
             public IScalarEvaluator createScalarEvaluator(IEvaluatorContext ctx) throws HyracksDataException {
-                return new AbstractTypeCheckEvaluator(args[0].createScalarEvaluator(ctx)) {
+                return new AbstractMultiTypeCheckEvaluator(args[0].createScalarEvaluator(ctx), checkedTypes) {
                     @Override
-                    protected Value isMatch(byte typeTag) {
-                        ATypeTag tt = ATypeTag.VALUE_TYPE_MAPPING[typeTag];
-                        switch (tt) {
-                            case MISSING:
-                            case NULL:
-                            case TINYINT:
-                            case SMALLINT:
-                            case INTEGER:
-                            case BIGINT:
-                            case FLOAT:
-                            case DOUBLE:
-                            case DATE:
-                            case DATETIME:
-                            case TIME:
-                            case DURATION:
-                            case YEARMONTHDURATION:
-                            case DAYTIMEDURATION:
-                                return Value.TRUE;
-                            default:
-                                return Value.FALSE;
-                        }
+                    public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
+                        eval.evaluate(tuple, argPtr);
+                        res = isMatch(argPtr.getByteArray()[argPtr.getStartOffset()]) ? ABoolean.TRUE : ABoolean.FALSE;
+                        resultStorage.reset();
+                        aObjectSerializerDeserializer.serialize(res, out);
+                        result.set(resultStorage);
                     }
                 };
             }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsObjectDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsObjectDescriptor.java
index e28b6a4..7948f17 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsObjectDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsObjectDescriptor.java
@@ -20,9 +20,7 @@
 package org.apache.asterix.runtime.evaluators.functions;
 
 import org.apache.asterix.common.annotations.MissingNullInOutFunction;
-import org.apache.asterix.om.base.ABoolean;
 import org.apache.asterix.om.functions.BuiltinFunctions;
-import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
@@ -32,18 +30,11 @@
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.data.std.api.IPointable;
-import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
 @MissingNullInOutFunction
 public class IsObjectDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+    public static final IFunctionDescriptorFactory FACTORY = IsObjectDescriptor::new;
     private static final long serialVersionUID = 1L;
-    public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
-        @Override
-        public IFunctionDescriptor createFunctionDescriptor() {
-            return new IsObjectDescriptor();
-        }
-    };
 
     @Override
     public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
@@ -52,36 +43,8 @@
 
             @Override
             public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
-                final IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
-                return new AbstractTypeCheckEvaluator(eval) {
-
-                    // TODO(Hussain) Consider making a different AbstractTypeCheckEvaluator class for the methods
-                    // that require the Missing/Null checks, that should keep the code cleaner. Currently, this is the
-                    // scenario because some functions require Missing/Null checks while others don't, and they're
-                    // extending the same base class, so the evaluate(...) needs to be overridden
-                    @Override
-                    public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
-                        eval.evaluate(tuple, argPtr);
-
-                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
-                            return;
-                        }
-
-                        Value match = isMatch(argPtr.getByteArray()[argPtr.getStartOffset()]);
-                        if (match == Value.MISSING) {
-                            result.set(MISSING_BYTES, 0, MISSING_BYTES.length);
-                            return;
-                        }
-                        ABoolean res = match == Value.TRUE ? ABoolean.TRUE : ABoolean.FALSE;
-                        resultStorage.reset();
-                        aObjSerDer.serialize(res, out);
-                        result.set(resultStorage);
-                    }
-
-                    @Override
-                    protected Value isMatch(byte typeTag) {
-                        return typeTag == ATypeTag.SERIALIZED_RECORD_TYPE_TAG ? Value.TRUE : Value.FALSE;
-                    }
+                return new AbstractTypeCheckEvaluator(args[0].createScalarEvaluator(ctx),
+                        ATypeTag.SERIALIZED_RECORD_TYPE_TAG) {
                 };
             }
         };
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsPointDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsPointDescriptor.java
new file mode 100644
index 0000000..89e88db
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsPointDescriptor.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.runtime.evaluators.functions;
+
+import org.apache.asterix.common.annotations.MissingNullInOutFunction;
+import org.apache.asterix.om.functions.BuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.common.AbstractTypeCheckEvaluator;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+@MissingNullInOutFunction
+public class IsPointDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+    public static final IFunctionDescriptorFactory FACTORY = IsPointDescriptor::new;
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
+        return new IScalarEvaluatorFactory() {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
+                return new AbstractTypeCheckEvaluator(args[0].createScalarEvaluator(ctx),
+                        ATypeTag.SERIALIZED_POINT_TYPE_TAG) {
+                };
+            }
+        };
+    }
+
+    @Override
+    public FunctionIdentifier getIdentifier() {
+        return BuiltinFunctions.IS_POINT;
+    }
+
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsPolygonDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsPolygonDescriptor.java
new file mode 100644
index 0000000..be98f14
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsPolygonDescriptor.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.runtime.evaluators.functions;
+
+import org.apache.asterix.common.annotations.MissingNullInOutFunction;
+import org.apache.asterix.om.functions.BuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.common.AbstractTypeCheckEvaluator;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+@MissingNullInOutFunction
+public class IsPolygonDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+    public static final IFunctionDescriptorFactory FACTORY = IsPolygonDescriptor::new;
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
+        return new IScalarEvaluatorFactory() {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
+                return new AbstractTypeCheckEvaluator(args[0].createScalarEvaluator(ctx),
+                        ATypeTag.SERIALIZED_POLYGON_TYPE_TAG) {
+                };
+            }
+        };
+    }
+
+    @Override
+    public FunctionIdentifier getIdentifier() {
+        return BuiltinFunctions.IS_POLYGON;
+    }
+
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsRectangleDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsRectangleDescriptor.java
new file mode 100644
index 0000000..57fb915
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsRectangleDescriptor.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.runtime.evaluators.functions;
+
+import org.apache.asterix.common.annotations.MissingNullInOutFunction;
+import org.apache.asterix.om.functions.BuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.common.AbstractTypeCheckEvaluator;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+@MissingNullInOutFunction
+public class IsRectangleDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+    public static final IFunctionDescriptorFactory FACTORY = IsRectangleDescriptor::new;
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
+        return new IScalarEvaluatorFactory() {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
+                return new AbstractTypeCheckEvaluator(args[0].createScalarEvaluator(ctx),
+                        ATypeTag.SERIALIZED_RECTANGLE_TYPE_TAG) {
+                };
+            }
+        };
+    }
+
+    @Override
+    public FunctionIdentifier getIdentifier() {
+        return BuiltinFunctions.IS_RECTANGLE;
+    }
+
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsSpatialDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsSpatialDescriptor.java
new file mode 100644
index 0000000..9c86e92
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsSpatialDescriptor.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.runtime.evaluators.functions;
+
+import org.apache.asterix.common.annotations.MissingNullInOutFunction;
+import org.apache.asterix.om.functions.BuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.common.AbstractMultiTypeCheckEvaluator;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+@MissingNullInOutFunction
+public class IsSpatialDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+    public static final IFunctionDescriptorFactory FACTORY = IsSpatialDescriptor::new;
+    private static final long serialVersionUID = 1L;
+
+    private static final byte[] checkedTypes =
+            new byte[] { ATypeTag.SERIALIZED_POINT_TYPE_TAG, ATypeTag.SERIALIZED_POINT3D_TYPE_TAG,
+                    ATypeTag.SERIALIZED_LINE_TYPE_TAG, ATypeTag.SERIALIZED_RECTANGLE_TYPE_TAG,
+                    ATypeTag.SERIALIZED_CIRCLE_TYPE_TAG, ATypeTag.SERIALIZED_POLYGON_TYPE_TAG };
+
+    @Override
+    public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
+        return new IScalarEvaluatorFactory() {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
+                return new AbstractMultiTypeCheckEvaluator(args[0].createScalarEvaluator(ctx), checkedTypes) {
+                };
+            }
+        };
+    }
+
+    @Override
+    public FunctionIdentifier getIdentifier() {
+        return BuiltinFunctions.IS_SPATIAL;
+    }
+
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsStringDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsStringDescriptor.java
index 2de91e6..d17164a 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsStringDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsStringDescriptor.java
@@ -20,9 +20,7 @@
 package org.apache.asterix.runtime.evaluators.functions;
 
 import org.apache.asterix.common.annotations.MissingNullInOutFunction;
-import org.apache.asterix.om.base.ABoolean;
 import org.apache.asterix.om.functions.BuiltinFunctions;
-import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
@@ -32,18 +30,11 @@
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.data.std.api.IPointable;
-import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
 @MissingNullInOutFunction
 public class IsStringDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+    public static final IFunctionDescriptorFactory FACTORY = IsStringDescriptor::new;
     private static final long serialVersionUID = 1L;
-    public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
-        @Override
-        public IFunctionDescriptor createFunctionDescriptor() {
-            return new IsStringDescriptor();
-        }
-    };
 
     @Override
     public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
@@ -52,33 +43,8 @@
 
             @Override
             public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
-                final IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
-                return new AbstractTypeCheckEvaluator(eval) {
-
-                    // Overridden because other functions using the same class shouldn't perform the missing/null check
-                    @Override
-                    public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
-                        eval.evaluate(tuple, argPtr);
-
-                        if (PointableHelper.checkAndSetMissingOrNull(result, argPtr)) {
-                            return;
-                        }
-
-                        Value match = isMatch(argPtr.getByteArray()[argPtr.getStartOffset()]);
-                        if (match == Value.MISSING) {
-                            result.set(MISSING_BYTES, 0, MISSING_BYTES.length);
-                            return;
-                        }
-                        ABoolean res = match == Value.TRUE ? ABoolean.TRUE : ABoolean.FALSE;
-                        resultStorage.reset();
-                        aObjSerDer.serialize(res, out);
-                        result.set(resultStorage);
-                    }
-
-                    @Override
-                    protected Value isMatch(byte typeTag) {
-                        return typeTag == ATypeTag.SERIALIZED_STRING_TYPE_TAG ? Value.TRUE : Value.FALSE;
-                    }
+                return new AbstractTypeCheckEvaluator(args[0].createScalarEvaluator(ctx),
+                        ATypeTag.SERIALIZED_STRING_TYPE_TAG) {
                 };
             }
         };
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsSystemNullDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsSystemNullDescriptor.java
index 3062e92..686d736 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsSystemNullDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsSystemNullDescriptor.java
@@ -18,58 +18,41 @@
  */
 package org.apache.asterix.runtime.evaluators.functions;
 
-import java.io.DataOutput;
-
-import org.apache.asterix.dataflow.data.nontagged.serde.AObjectSerializerDeserializer;
 import org.apache.asterix.om.base.ABoolean;
 import org.apache.asterix.om.functions.BuiltinFunctions;
-import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.common.AbstractTypeCheckEvaluator;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.data.std.api.IPointable;
-import org.apache.hyracks.data.std.primitive.VoidPointable;
-import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
 import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
 public class IsSystemNullDescriptor extends AbstractScalarFunctionDynamicDescriptor {
-
+    public static final IFunctionDescriptorFactory FACTORY = IsSystemNullDescriptor::new;
     private static final long serialVersionUID = 1L;
-    public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
-        @Override
-        public IFunctionDescriptor createFunctionDescriptor() {
-            return new IsSystemNullDescriptor();
-        }
-    };
 
     @Override
     public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
         return new IScalarEvaluatorFactory() {
-
             private static final long serialVersionUID = 1L;
 
             @Override
             public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
-                return new IScalarEvaluator() {
-
-                    private ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
-                    private DataOutput out = resultStorage.getDataOutput();
-                    private IPointable argPtr = new VoidPointable();
-                    private IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
-                    private final AObjectSerializerDeserializer aObjSerDer = AObjectSerializerDeserializer.INSTANCE;
+                return new AbstractTypeCheckEvaluator(args[0].createScalarEvaluator(ctx),
+                        ATypeTag.SERIALIZED_SYSTEM_NULL_TYPE_TAG) {
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
                         eval.evaluate(tuple, argPtr);
-                        boolean isSystemNull = argPtr.getByteArray()[argPtr
-                                .getStartOffset()] == ATypeTag.SERIALIZED_SYSTEM_NULL_TYPE_TAG;
-                        ABoolean res = isSystemNull ? ABoolean.TRUE : ABoolean.FALSE;
-                        aObjSerDer.serialize(res, out);
+                        res = isMatch(argPtr.getByteArray()[argPtr.getStartOffset()]) ? ABoolean.TRUE : ABoolean.FALSE;
+                        resultStorage.reset();
+                        aObjectSerializerDeserializer.serialize(res, out);
+                        result.set(resultStorage);
                     }
                 };
             }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsTemporalDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsTemporalDescriptor.java
new file mode 100644
index 0000000..140591d
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsTemporalDescriptor.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.runtime.evaluators.functions;
+
+import org.apache.asterix.common.annotations.MissingNullInOutFunction;
+import org.apache.asterix.om.functions.BuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.common.AbstractMultiTypeCheckEvaluator;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+@MissingNullInOutFunction
+public class IsTemporalDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+    public static final IFunctionDescriptorFactory FACTORY = IsTemporalDescriptor::new;
+    private static final long serialVersionUID = 1L;
+
+    private static final byte[] checkedArgs = new byte[] { ATypeTag.SERIALIZED_DATE_TYPE_TAG,
+            ATypeTag.SERIALIZED_DATETIME_TYPE_TAG, ATypeTag.SERIALIZED_TIME_TYPE_TAG,
+            ATypeTag.SERIALIZED_DURATION_TYPE_TAG, ATypeTag.SERIALIZED_YEAR_MONTH_DURATION_TYPE_TAG,
+            ATypeTag.SERIALIZED_DAY_TIME_DURATION_TYPE_TAG, ATypeTag.SERIALIZED_INTERVAL_TYPE_TAG };
+
+    @Override
+    public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
+        return new IScalarEvaluatorFactory() {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
+                return new AbstractMultiTypeCheckEvaluator(args[0].createScalarEvaluator(ctx), checkedArgs) {
+                };
+            }
+        };
+    }
+
+    @Override
+    public FunctionIdentifier getIdentifier() {
+        return BuiltinFunctions.IS_TEMPORAL;
+    }
+
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsTimeDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsTimeDescriptor.java
new file mode 100644
index 0000000..1b9d96c
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsTimeDescriptor.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.runtime.evaluators.functions;
+
+import org.apache.asterix.common.annotations.MissingNullInOutFunction;
+import org.apache.asterix.om.functions.BuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.common.AbstractTypeCheckEvaluator;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+@MissingNullInOutFunction
+public class IsTimeDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+    public static final IFunctionDescriptorFactory FACTORY = IsTimeDescriptor::new;
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
+        return new IScalarEvaluatorFactory() {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
+                return new AbstractTypeCheckEvaluator(args[0].createScalarEvaluator(ctx),
+                        ATypeTag.SERIALIZED_TIME_TYPE_TAG) {
+                };
+            }
+        };
+    }
+
+    @Override
+    public FunctionIdentifier getIdentifier() {
+        return BuiltinFunctions.IS_TIME;
+    }
+
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsUUIDDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsUUIDDescriptor.java
new file mode 100644
index 0000000..bd8df75
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsUUIDDescriptor.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.runtime.evaluators.functions;
+
+import org.apache.asterix.common.annotations.MissingNullInOutFunction;
+import org.apache.asterix.om.functions.BuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.common.AbstractTypeCheckEvaluator;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+@MissingNullInOutFunction
+public class IsUUIDDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+    public static final IFunctionDescriptorFactory FACTORY = IsUUIDDescriptor::new;
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
+        return new IScalarEvaluatorFactory() {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
+                return new AbstractTypeCheckEvaluator(args[0].createScalarEvaluator(ctx),
+                        ATypeTag.SERIALIZED_UUID_TYPE_TAG) {
+                };
+            }
+        };
+    }
+
+    @Override
+    public FunctionIdentifier getIdentifier() {
+        return BuiltinFunctions.IS_UUID;
+    }
+
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsUnknownDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsUnknownDescriptor.java
index a15f8e10..fadcf35 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsUnknownDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsUnknownDescriptor.java
@@ -18,26 +18,23 @@
  */
 package org.apache.asterix.runtime.evaluators.functions;
 
+import org.apache.asterix.om.base.ABoolean;
 import org.apache.asterix.om.functions.BuiltinFunctions;
-import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
-import org.apache.asterix.runtime.evaluators.common.AbstractTypeCheckEvaluator;
+import org.apache.asterix.runtime.evaluators.common.AbstractMultiTypeCheckEvaluator;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.api.IPointable;
+import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
 public class IsUnknownDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+    public static final IFunctionDescriptorFactory FACTORY = IsUnknownDescriptor::new;
     private static final long serialVersionUID = 1L;
-    public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
-        @Override
-        public IFunctionDescriptor createFunctionDescriptor() {
-            return new IsUnknownDescriptor();
-        }
-    };
 
     @Override
     public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
@@ -46,13 +43,16 @@
 
             @Override
             public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
-                final IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
-                return new AbstractTypeCheckEvaluator(eval) {
+                return new AbstractMultiTypeCheckEvaluator(args[0].createScalarEvaluator(ctx),
+                        ATypeTag.SERIALIZED_NULL_TYPE_TAG, ATypeTag.SERIALIZED_MISSING_TYPE_TAG) {
 
                     @Override
-                    protected Value isMatch(byte typeTag) {
-                        return (typeTag == ATypeTag.SERIALIZED_NULL_TYPE_TAG
-                                || typeTag == ATypeTag.SERIALIZED_MISSING_TYPE_TAG) ? Value.TRUE : Value.FALSE;
+                    public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
+                        eval.evaluate(tuple, argPtr);
+                        res = isMatch(argPtr.getByteArray()[argPtr.getStartOffset()]) ? ABoolean.TRUE : ABoolean.FALSE;
+                        resultStorage.reset();
+                        aObjectSerializerDeserializer.serialize(res, out);
+                        result.set(resultStorage);
                     }
                 };
             }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java
index 515518d..e1c9164 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java
@@ -337,6 +337,7 @@
 import org.apache.asterix.runtime.evaluators.functions.FullTextContainsWithoutOptionDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.GetItemDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.GetJobParameterByNameDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.GetTypeDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.IfInfDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.IfMissingDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.IfMissingOrNullDescriptor;
@@ -347,14 +348,29 @@
 import org.apache.asterix.runtime.evaluators.functions.InjectFailureDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.IsArrayDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.IsAtomicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.IsBinaryDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.IsBooleanDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.IsCircleDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.IsDateDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.IsDatetimeDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.IsDurationDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.IsIntervalDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.IsLineDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.IsMissingDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.IsMultisetDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.IsNullDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.IsNumberDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.IsNumericAddCompatibleDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.IsObjectDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.IsPointDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.IsPolygonDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.IsRectangleDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.IsSpatialDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.IsStringDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.IsSystemNullDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.IsTemporalDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.IsTimeDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.IsUUIDDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.IsUnknownDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.LenDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.NotDescriptor;
@@ -1156,12 +1172,28 @@
         fc.add(DurationFromIntervalDescriptor.FACTORY);
 
         // Type functions.
+        fc.add(GetTypeDescriptor.FACTORY);
         fc.add(IsArrayDescriptor.FACTORY);
         fc.add(IsAtomicDescriptor.FACTORY);
         fc.add(IsBooleanDescriptor.FACTORY);
         fc.add(IsNumberDescriptor.FACTORY);
         fc.add(IsObjectDescriptor.FACTORY);
         fc.add(IsStringDescriptor.FACTORY);
+        fc.add(IsBinaryDescriptor.FACTORY);
+        fc.add(IsPointDescriptor.FACTORY);
+        fc.add(IsLineDescriptor.FACTORY);
+        fc.add(IsRectangleDescriptor.FACTORY);
+        fc.add(IsCircleDescriptor.FACTORY);
+        fc.add(IsPolygonDescriptor.FACTORY);
+        fc.add(IsSpatialDescriptor.FACTORY);
+        fc.add(IsDateDescriptor.FACTORY);
+        fc.add(IsDatetimeDescriptor.FACTORY);
+        fc.add(IsTimeDescriptor.FACTORY);
+        fc.add(IsDurationDescriptor.FACTORY);
+        fc.add(IsIntervalDescriptor.FACTORY);
+        fc.add(IsTemporalDescriptor.FACTORY);
+        fc.add(IsUUIDDescriptor.FACTORY);
+        fc.add(IsMultisetDescriptor.FACTORY);
         fc.add(ToArrayDescriptor.FACTORY);
         fc.add(ToAtomicDescriptor.FACTORY);
         fc.add(ToBigIntDescriptor.FACTORY);