Merge "trace_processor: fix multiple bugs with filtering and casting"
diff --git a/src/trace_processor/sqlite_utils.h b/src/trace_processor/sqlite_utils.h
index 4c700f9..0d3dc94 100644
--- a/src/trace_processor/sqlite_utils.h
+++ b/src/trace_processor/sqlite_utils.h
@@ -95,29 +95,29 @@
 template <>
 inline uint8_t ExtractSqliteValue(sqlite3_value* value) {
   auto type = sqlite3_value_type(value);
-  PERFETTO_DCHECK(type == SQLITE_INTEGER || type == SQLITE_FLOAT);
+  PERFETTO_DCHECK(type == SQLITE_INTEGER);
   return static_cast<uint8_t>(sqlite3_value_int(value));
 }
 
 template <>
 inline uint32_t ExtractSqliteValue(sqlite3_value* value) {
   auto type = sqlite3_value_type(value);
-  PERFETTO_DCHECK(type == SQLITE_INTEGER || type == SQLITE_FLOAT);
-  return static_cast<uint32_t>(sqlite3_value_int(value));
+  PERFETTO_DCHECK(type == SQLITE_INTEGER);
+  return static_cast<uint32_t>(sqlite3_value_int64(value));
 }
 
 template <>
 inline uint64_t ExtractSqliteValue(sqlite3_value* value) {
   auto type = sqlite3_value_type(value);
-  PERFETTO_DCHECK(type == SQLITE_INTEGER || type == SQLITE_FLOAT);
-  return static_cast<uint64_t>(sqlite3_value_int(value));
+  PERFETTO_DCHECK(type == SQLITE_INTEGER);
+  return static_cast<uint64_t>(sqlite3_value_int64(value));
 }
 
 template <>
 inline int64_t ExtractSqliteValue(sqlite3_value* value) {
   auto type = sqlite3_value_type(value);
-  PERFETTO_DCHECK(type == SQLITE_INTEGER || type == SQLITE_FLOAT);
-  return static_cast<int64_t>(sqlite3_value_int(value));
+  PERFETTO_DCHECK(type == SQLITE_INTEGER);
+  return static_cast<int64_t>(sqlite3_value_int64(value));
 }
 
 template <>
diff --git a/src/trace_processor/storage_schema.h b/src/trace_processor/storage_schema.h
index d50efd4..ebca90f 100644
--- a/src/trace_processor/storage_schema.h
+++ b/src/trace_processor/storage_schema.h
@@ -131,11 +131,14 @@
     }
 
     Predicate Filter(int op, sqlite3_value* value) const override {
-      auto binary_op = sqlite_utils::GetPredicateForOp<T>(op);
-      T extracted = sqlite_utils::ExtractSqliteValue<T>(value);
-      return [this, binary_op, extracted](uint32_t idx) {
-        return binary_op((*deque_)[idx], extracted);
-      };
+      auto type = sqlite3_value_type(value);
+      if (type == SQLITE_INTEGER && std::is_integral<T>::value) {
+        return FilterWithCast<int64_t>(op, value);
+      } else if (type == SQLITE_INTEGER || type == SQLITE_FLOAT) {
+        return FilterWithCast<double>(op, value);
+      } else {
+        PERFETTO_FATAL("Unexpected sqlite value to compare against");
+      }
     }
 
     Comparator Sort(const QueryConstraints::OrderBy& ob) const override {
@@ -172,6 +175,16 @@
     }
 
    private:
+    template <typename C>
+    Predicate FilterWithCast(int op, sqlite3_value* value) const {
+      auto binary_op = sqlite_utils::GetPredicateForOp<C>(op);
+      C extracted = sqlite_utils::ExtractSqliteValue<C>(value);
+      return [this, binary_op, extracted](uint32_t idx) {
+        auto val = static_cast<C>((*deque_)[idx]);
+        return binary_op(val, extracted);
+      };
+    }
+
     const std::deque<T>* deque_ = nullptr;
     bool is_naturally_ordered_ = false;
   };
diff --git a/test/trace_processor/android_sched_and_ps_b119496959.out b/test/trace_processor/android_sched_and_ps_b119496959.out
new file mode 100644
index 0000000..480ada8
--- /dev/null
+++ b/test/trace_processor/android_sched_and_ps_b119496959.out
@@ -0,0 +1,11 @@
+"ts","cpu"
+81473797824982,3
+81473797942847,3
+81473798135399,0
+81473798786857,2
+81473798875451,3
+81473799019930,2
+81473799079982,0
+81473800089357,3
+81473800144461,3
+81473800441805,3
diff --git a/test/trace_processor/b119496959.sql b/test/trace_processor/b119496959.sql
new file mode 100644
index 0000000..be4460c
--- /dev/null
+++ b/test/trace_processor/b119496959.sql
@@ -0,0 +1 @@
+select ts, cpu from sched where ts >= 81473797418963 limit 10
diff --git a/test/trace_processor/index b/test/trace_processor/index
index ea24c2d..81dbe9f 100644
--- a/test/trace_processor/index
+++ b/test/trace_processor/index
@@ -5,6 +5,7 @@
 ../data/android_sched_and_ps.pb slice_span_join_b118665515.sql android_sched_and_ps_slice_span_join_b118665515.out
 ../data/android_sched_and_ps.pb b119301023.sql android_sched_and_ps_b119301023.out
 ../data/android_sched_and_ps.pb stats.sql android_sched_and_ps_stats.out
+../data/android_sched_and_ps.pb b119496959.sql android_sched_and_ps_b119496959.out
 synth_1.py smoke.sql synth_1_smoke.out
 synth_1.py filter_sched.sql synth_1_filter_sched.out
 synth_1.py filter_counters.sql synth_1_filter_counters.out