|
7 | 7 | * Create Date: 2025/05/08
|
8 | 8 | *
|
9 | 9 | */
|
| 10 | +#include <cql2cpp/cql2cpp.h> |
10 | 11 | #include <gtest/gtest.h>
|
11 | 12 | #include <sqlite3.h>
|
12 |
| -// #include <spatialite.h> |
| 13 | +// |
| 14 | +#include <spatialite.h> |
13 | 15 |
|
14 |
| -TEST(WHERE, CASE1) { |
| 16 | +#include <fstream> |
| 17 | + |
| 18 | +TEST(SQL_SPATIAL, CASE1) { |
| 19 | + spatialite_init(0); |
15 | 20 | sqlite3 *db;
|
16 | 21 | sqlite3_open("./test.sqlite", &db);
|
17 | 22 | char *error_msg = 0;
|
18 |
| - sqlite3_exec(db, "PRAGMA strict = OFF;", NULL, 0, &error_msg); |
19 |
| - sqlite3_exec( |
20 |
| - db, "CREATE TABLE IF NOT EXISTS feature(ID INT PRIMARY KEY, NAME TEXT)", |
21 |
| - NULL, 0, &error_msg); |
22 |
| - |
23 |
| - std::string sql = "SELECT * FROM feature WHERE field = \"Yu\";"; |
24 |
| - sqlite3_stmt *stmt; |
25 |
| - int rc = sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, NULL); |
26 |
| - if (rc != SQLITE_OK) |
27 |
| - std::cerr << "prepare error " << rc << ": " << sqlite3_errmsg(db) << std::endl; |
| 23 | + |
| 24 | + int ret; |
| 25 | + |
| 26 | + ret = sqlite3_enable_load_extension(db, 1); |
| 27 | + EXPECT_EQ(ret, SQLITE_OK); |
| 28 | + |
| 29 | + ret = sqlite3_load_extension(db, "mod_spatialite.so", NULL, NULL); |
| 30 | + |
| 31 | + ret = sqlite3_exec(db, "PRAGMA strict = OFF;", NULL, 0, &error_msg); |
| 32 | + if (ret != SQLITE_OK) LOG(ERROR) << error_msg; |
| 33 | + EXPECT_EQ(ret, SQLITE_OK); |
| 34 | + |
| 35 | + ret = sqlite3_exec(db, "SELECT spatialite_version();", NULL, 0, &error_msg); |
| 36 | + if (ret != SQLITE_OK) LOG(ERROR) << error_msg; |
| 37 | + EXPECT_EQ(ret, SQLITE_OK); |
| 38 | + |
| 39 | + ret = sqlite3_exec(db, |
| 40 | + "CREATE TABLE IF NOT EXISTS feature(ID INT PRIMARY KEY);", |
| 41 | + NULL, 0, &error_msg); |
| 42 | + if (ret != SQLITE_OK) LOG(ERROR) << error_msg; |
| 43 | + EXPECT_EQ(ret, SQLITE_OK); |
| 44 | + |
| 45 | + ret = sqlite3_exec(db, |
| 46 | + "SELECT AddGeometryColumn('feature', 'geom', 4326, 'POLYGON', 'XY');", |
| 47 | + NULL, 0, &error_msg); |
| 48 | + if (ret != SQLITE_OK) LOG(ERROR) << error_msg; |
| 49 | + EXPECT_EQ(ret, SQLITE_OK); |
| 50 | + |
| 51 | + ret = sqlite3_exec( |
| 52 | + db, "SELECT * FROM feature WHERE ST_INTERSECTS('geom' ,ST_GeomFromText('POINT(36 32)'));", NULL, |
| 53 | + 0, &error_msg); |
| 54 | + if (ret != SQLITE_OK) LOG(ERROR) << error_msg; |
| 55 | + EXPECT_EQ(ret, SQLITE_OK); |
28 | 56 | }
|
29 | 57 |
|
| 58 | +class SqlTest : public testing::Test { |
| 59 | + protected: |
| 60 | + std::string case_name_; |
| 61 | + std::string prefix_; |
| 62 | + |
| 63 | + public: |
| 64 | + void SetUp() override { |
| 65 | + FLAGS_colorlogtostderr = true; |
| 66 | + case_name_ = std::string( |
| 67 | + testing::UnitTest::GetInstance()->current_test_info()->name()); |
| 68 | + prefix_ = "supported/1.0/examples/text/"; |
| 69 | + spatialite_init(0); |
| 70 | + } |
| 71 | + void TearDown() override {} |
| 72 | + static std::string hyphen(const std::string &case_name) { |
| 73 | + std::string s = case_name; |
| 74 | + std::replace(s.begin(), s.end(), '_', '-'); |
| 75 | + return s; |
| 76 | + } |
| 77 | + |
| 78 | + bool Parse(const std::string &case_name) { |
| 79 | + std::ifstream fin(prefix_ + case_name + ".txt"); |
| 80 | + EXPECT_TRUE(fin.good()); |
| 81 | + EXPECT_TRUE(fin.is_open()); |
| 82 | + std::string query; |
| 83 | + query.assign(std::istreambuf_iterator<char>(fin), |
| 84 | + std::istreambuf_iterator<char>()); |
| 85 | + fin.close(); |
| 86 | + |
| 87 | + LOG(INFO) << query; |
| 88 | + |
| 89 | + // Create DB |
| 90 | + sqlite3 *db; |
| 91 | + sqlite3_open("./test.sqlite", &db); |
| 92 | + char *error_msg = 0; |
| 93 | + sqlite3_enable_load_extension(db, 1); |
| 94 | + sqlite3_load_extension(db, "mod_spatialite.so", NULL, NULL); |
| 95 | + sqlite3_exec(db, "PRAGMA strict = OFF;", NULL, 0, &error_msg); |
| 96 | + sqlite3_exec(db, "SELECT load_extension('mod_spatialite');", NULL, 0, |
| 97 | + &error_msg); |
| 98 | + sqlite3_exec(db, |
| 99 | + "CREATE TABLE IF NOT EXISTS feature(ID INT PRIMARY KEY, " |
| 100 | + "PLACEHOLDER TEXT)", |
| 101 | + NULL, 0, &error_msg); |
| 102 | + |
| 103 | + // Parse query to get queryables |
| 104 | + cql2cpp::Cql2Cpp<void *> cql2cpp; |
| 105 | + std::string error_str; |
| 106 | + auto root = cql2cpp.ParseAsAst(query, &error_str); |
| 107 | + |
| 108 | + // add queryables into table |
| 109 | + std::set<std::string> queryables; |
| 110 | + for (const auto &node : *root) { |
| 111 | + if (node->type() == cql2cpp::NodeType::PropertyName) |
| 112 | + queryables.insert(value_str(node->origin_value())); |
| 113 | + } |
| 114 | + for (const auto &queryable : queryables) |
| 115 | + sqlite3_exec( |
| 116 | + db, |
| 117 | + ("ALTER TABLE feature ADD COLUMN " + queryable + " TEXT;").c_str(), |
| 118 | + NULL, 0, &error_msg); |
| 119 | + |
| 120 | + std::string sql_where; |
| 121 | + std::string err_str; |
| 122 | + EXPECT_TRUE(cql2cpp.ConvertToSQL(query, &sql_where, &err_str)); |
| 123 | + |
| 124 | + // use "prepare" to check the WHERE clause |
| 125 | + std::string sql = "SELECT * FROM feature WHERE " + sql_where; |
| 126 | + sqlite3_stmt *stmt; |
| 127 | + int rc = sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, NULL); |
| 128 | + if (rc != SQLITE_OK) |
| 129 | + std::cerr << "prepare error " << rc << ": " << sqlite3_errmsg(db) |
| 130 | + << std::endl; |
| 131 | + return rc == SQLITE_OK; |
| 132 | + } |
| 133 | +}; |
| 134 | + |
| 135 | +// TEST_F(SqlTest, clause6_01) { EXPECT_TRUE(Parse(case_name_)); } |
| 136 | +TEST_F(SqlTest, clause6_02a) { EXPECT_TRUE(Parse(case_name_)); } |
| 137 | +// TEST_F(SqlTest, clause6_02b) { EXPECT_TRUE(Parse(case_name_)); } |
| 138 | +TEST_F(SqlTest, clause6_02c) { EXPECT_TRUE(Parse(case_name_)); } |
| 139 | +TEST_F(SqlTest, clause6_03) { EXPECT_TRUE(Parse(case_name_)); } |
| 140 | +TEST_F(SqlTest, clause7_01) { EXPECT_TRUE(Parse(case_name_)); } |
| 141 | +TEST_F(SqlTest, clause7_02) { EXPECT_TRUE(Parse(case_name_)); } |
| 142 | +TEST_F(SqlTest, clause7_03a) { EXPECT_TRUE(Parse(case_name_)); } |
| 143 | +TEST_F(SqlTest, clause7_03b) { EXPECT_TRUE(Parse(case_name_)); } |
| 144 | +// TEST_F(SqlTest, clause7_07) { EXPECT_TRUE(Parse(case_name_)); } |
| 145 | +// TEST_F(SqlTest, clause7_10) { EXPECT_TRUE(Parse(case_name_)); } |
| 146 | +// TEST_F(SqlTest, clause7_15) { EXPECT_TRUE(Parse(case_name_)); } |
| 147 | +// TEST_F(SqlTest, clause7_16) { EXPECT_TRUE(Parse(case_name_)); } |
| 148 | +TEST_F(SqlTest, clause7_19) { EXPECT_TRUE(Parse(case_name_)); } |
| 149 | +// TEST_F(SqlTest, example01) { EXPECT_TRUE(Parse(case_name_)); } |
| 150 | +// TEST_F(SqlTest, example02) { EXPECT_TRUE(Parse(case_name_)); } |
| 151 | +// TEST_F(SqlTest, example03) { EXPECT_TRUE(Parse(case_name_)); } |
| 152 | +// TEST_F(SqlTest, example04) { EXPECT_TRUE(Parse(case_name_)); } |
| 153 | +// TEST_F(SqlTest, example05a) { EXPECT_TRUE(Parse(case_name_)); } |
| 154 | +// TEST_F(SqlTest, example05b) { EXPECT_TRUE(Parse(case_name_)); } |
| 155 | +// TEST_F(SqlTest, example06a) { EXPECT_TRUE(Parse(case_name_)); } |
| 156 | +// TEST_F(SqlTest, example06b) { EXPECT_TRUE(Parse(case_name_)); } |
| 157 | +// TEST_F(SqlTest, example07) { EXPECT_TRUE(Parse(case_name_)); } |
| 158 | +// TEST_F(SqlTest, example08) { EXPECT_TRUE(Parse(case_name_)); } |
| 159 | +// TEST_F(SqlTest, example09) { EXPECT_TRUE(Parse(case_name_)); } |
| 160 | +// TEST_F(SqlTest, example10) { EXPECT_TRUE(Parse(case_name_)); } |
| 161 | +// TEST_F(SqlTest, example11) { EXPECT_TRUE(Parse(case_name_)); } |
| 162 | +// TEST_F(SqlTest, example12) { EXPECT_TRUE(Parse(case_name_)); } |
| 163 | +// TEST_F(SqlTest, example13) { EXPECT_TRUE(Parse(case_name_)); } |
| 164 | +// TEST_F(SqlTest, example14) { EXPECT_TRUE(Parse(case_name_)); } |
| 165 | +// TEST_F(SqlTest, example15) { EXPECT_TRUE(Parse(case_name_)); } |
| 166 | +// TEST_F(SqlTest, example16) { EXPECT_TRUE(Parse(case_name_)); } |
| 167 | +// TEST_F(SqlTest, example17) { EXPECT_TRUE(Parse(case_name_)); } |
| 168 | +// TEST_F(SqlTest, example18) { EXPECT_TRUE(Parse(case_name_)); } |
| 169 | +// TEST_F(SqlTest, example19) { EXPECT_TRUE(Parse(case_name_)); } |
| 170 | +// TEST_F(SqlTest, example23) { EXPECT_TRUE(Parse(case_name_)); } |
| 171 | +// TEST_F(SqlTest, example24) { EXPECT_TRUE(Parse(case_name_)); } |
| 172 | +// TEST_F(SqlTest, example25) { EXPECT_TRUE(Parse(case_name_)); } |
| 173 | +// TEST_F(SqlTest, example28) { EXPECT_TRUE(Parse(case_name_)); } |
| 174 | +// TEST_F(SqlTest, example29) { EXPECT_TRUE(Parse(case_name_)); } |
| 175 | +// TEST_F(SqlTest, example30) { EXPECT_TRUE(Parse(case_name_)); } |
| 176 | +// TEST_F(SqlTest, example31) { EXPECT_TRUE(Parse(case_name_)); } |
| 177 | +// TEST_F(SqlTest, example32) { EXPECT_TRUE(Parse(case_name_)); } |
| 178 | +// TEST_F(SqlTest, example33) { EXPECT_TRUE(Parse(case_name_)); } |
| 179 | +// TEST_F(SqlTest, example34) { EXPECT_TRUE(Parse(case_name_)); } |
| 180 | +// TEST_F(SqlTest, example35) { EXPECT_TRUE(Parse(case_name_)); } |
| 181 | +// TEST_F(SqlTest, example36) { EXPECT_TRUE(Parse(case_name_)); } |
| 182 | +// TEST_F(SqlTest, example36_alt01) { EXPECT_TRUE(Parse(hyphen(case_name_))); } |
| 183 | +// TEST_F(SqlTest, example37) { EXPECT_TRUE(Parse(case_name_)); } |
| 184 | +// TEST_F(SqlTest, example38) { EXPECT_TRUE(Parse(case_name_)); } |
| 185 | +// TEST_F(SqlTest, example38_alt01) { EXPECT_TRUE(Parse(hyphen(case_name_))); } |
| 186 | +// TEST_F(SqlTest, example39) { EXPECT_TRUE(Parse(case_name_)); } |
| 187 | +// TEST_F(SqlTest, example40) { EXPECT_TRUE(Parse(case_name_)); } |
| 188 | +// TEST_F(SqlTest, example40_alt01) { EXPECT_TRUE(Parse(hyphen(case_name_))); } |
| 189 | +// TEST_F(SqlTest, example41) { EXPECT_TRUE(Parse(case_name_)); } |
| 190 | +// TEST_F(SqlTest, example42) { EXPECT_TRUE(Parse(case_name_)); } |
| 191 | +// TEST_F(SqlTest, example42_alt01) { EXPECT_TRUE(Parse(hyphen(case_name_))); } |
| 192 | +// TEST_F(SqlTest, example43) { EXPECT_TRUE(Parse(case_name_)); } |
| 193 | +// TEST_F(SqlTest, example43_alt01) { EXPECT_TRUE(Parse(hyphen(case_name_))); } |
| 194 | +// TEST_F(SqlTest, example44) { EXPECT_TRUE(Parse(case_name_)); } |
| 195 | +// TEST_F(SqlTest, example44_alt01) { EXPECT_TRUE(Parse(hyphen(case_name_))); } |
| 196 | +// TEST_F(SqlTest, example46) { EXPECT_TRUE(Parse(case_name_)); } |
| 197 | +// TEST_F(SqlTest, example46_alt01) { EXPECT_TRUE(Parse(hyphen(case_name_))); } |
| 198 | +// TEST_F(SqlTest, example47) { EXPECT_TRUE(Parse(case_name_)); } |
| 199 | +// TEST_F(SqlTest, example48) { EXPECT_TRUE(Parse(case_name_)); } |
| 200 | +// TEST_F(SqlTest, example49_alt01) { EXPECT_TRUE(Parse(hyphen(case_name_))); } |
| 201 | +// TEST_F(SqlTest, example50) { EXPECT_TRUE(Parse(case_name_)); } |
| 202 | +// TEST_F(SqlTest, example51) { EXPECT_TRUE(Parse(case_name_)); } |
| 203 | +// TEST_F(SqlTest, example52) { EXPECT_TRUE(Parse(case_name_)); } |
| 204 | +// TEST_F(SqlTest, example68) { EXPECT_TRUE(Parse(case_name_)); } |
| 205 | +// TEST_F(SqlTest, example69) { EXPECT_TRUE(Parse(case_name_)); } |
| 206 | +// TEST_F(SqlTest, example71) { EXPECT_TRUE(Parse(case_name_)); } |
| 207 | +// TEST_F(SqlTest, example72) { EXPECT_TRUE(Parse(case_name_)); } |
| 208 | +// TEST_F(SqlTest, example73) { EXPECT_TRUE(Parse(case_name_)); } |
| 209 | +// TEST_F(SqlTest, example74) { EXPECT_TRUE(Parse(case_name_)); } |
| 210 | +// TEST_F(SqlTest, example75) { EXPECT_TRUE(Parse(case_name_)); } |
| 211 | +// TEST_F(SqlTest, example76) { EXPECT_TRUE(Parse(case_name_)); } |
| 212 | +// TEST_F(SqlTest, example77) { EXPECT_TRUE(Parse(case_name_)); } |
| 213 | +// TEST_F(SqlTest, example78) { EXPECT_TRUE(Parse(case_name_)); } |
| 214 | +// TEST_F(SqlTest, example79) { EXPECT_TRUE(Parse(case_name_)); } |
| 215 | +// TEST_F(SqlTest, example80) { EXPECT_TRUE(Parse(case_name_)); } |
| 216 | +// TEST_F(SqlTest, example81) { EXPECT_TRUE(Parse(case_name_)); } |
| 217 | +// TEST_F(SqlTest, example83) { EXPECT_TRUE(Parse(case_name_)); } |
| 218 | +// TEST_F(SqlTest, example84) { EXPECT_TRUE(Parse(case_name_)); } |
| 219 | +// TEST_F(SqlTest, example85) { EXPECT_TRUE(Parse(case_name_)); } |
| 220 | +// TEST_F(SqlTest, example85_alt01) { EXPECT_TRUE(Parse(hyphen(case_name_))); } |
| 221 | +// TEST_F(SqlTest, example86) { EXPECT_TRUE(Parse(case_name_)); } |
0 commit comments