TestSqlValueAndTuple.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562
  1. /*
  2. * Copyright (c) 2021, Jan de Visser <jan@de-visser.net>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <unistd.h>
  7. #include <LibSQL/Meta.h>
  8. #include <LibSQL/Row.h>
  9. #include <LibSQL/Tuple.h>
  10. #include <LibSQL/Value.h>
  11. #include <LibTest/TestCase.h>
  12. TEST_CASE(null_value)
  13. {
  14. SQL::Value v(SQL::SQLType::Null);
  15. EXPECT(v.type() == SQL::SQLType::Null);
  16. EXPECT(v.is_null());
  17. v = "Test";
  18. EXPECT(v.is_null());
  19. EXPECT(v.to_string() == "(null)");
  20. }
  21. TEST_CASE(text_value)
  22. {
  23. {
  24. SQL::Value v(SQL::SQLType::Text);
  25. EXPECT(v.is_null());
  26. v = "Test";
  27. EXPECT(!v.is_null());
  28. EXPECT(v.to_string() == "Test");
  29. }
  30. {
  31. SQL::Value v(SQL::SQLType::Text, String("String Test"));
  32. EXPECT(!v.is_null());
  33. EXPECT(v.to_string() == "String Test");
  34. }
  35. {
  36. SQL::Value v(SQL::SQLType::Text, "const char * Test");
  37. EXPECT(!v.is_null());
  38. EXPECT_EQ(v.to_string(), "const char * Test");
  39. }
  40. {
  41. SQL::Value v(String("String Test"));
  42. EXPECT(v.type() == SQL::SQLType::Text);
  43. EXPECT(!v.is_null());
  44. EXPECT(v.to_string() == "String Test");
  45. }
  46. {
  47. SQL::Value v(SQL::SQLType::Text, SQL::Value(42));
  48. EXPECT(v.type() == SQL::SQLType::Text);
  49. EXPECT(!v.is_null());
  50. EXPECT(v.to_string() == "42");
  51. }
  52. }
  53. TEST_CASE(assign_null)
  54. {
  55. SQL::Value v("Test");
  56. EXPECT(!v.is_null());
  57. v = SQL::Value::null();
  58. EXPECT(v.is_null());
  59. }
  60. TEST_CASE(text_value_to_other_types)
  61. {
  62. {
  63. SQL::Value v(SQL::SQLType::Text, "42");
  64. EXPECT(v.to_int().has_value());
  65. EXPECT_EQ(v.to_int().value(), 42);
  66. EXPECT(v.to_double().has_value());
  67. EXPECT(v.to_double().value() - 42.0 < NumericLimits<double>().epsilon());
  68. }
  69. {
  70. SQL::Value v("true");
  71. EXPECT(v.to_bool().has_value());
  72. EXPECT(v.to_bool().value());
  73. }
  74. {
  75. SQL::Value v("false");
  76. EXPECT(v.to_bool().has_value());
  77. EXPECT(!v.to_bool().value());
  78. }
  79. }
  80. TEST_CASE(serialize_text_value)
  81. {
  82. SQL::Value v("Test");
  83. EXPECT(v.to_string() == "Test");
  84. SQL::Serializer serializer;
  85. serializer.serialize<SQL::Value>(v);
  86. serializer.rewind();
  87. auto v2 = serializer.deserialize<SQL::Value>();
  88. EXPECT(v2.to_string() == "Test");
  89. }
  90. TEST_CASE(integer_value)
  91. {
  92. {
  93. SQL::Value v(SQL::SQLType::Integer);
  94. EXPECT(v.is_null());
  95. v = 42;
  96. EXPECT(!v.is_null());
  97. EXPECT(v.to_int().value() == 42);
  98. EXPECT(v.to_string() == "42");
  99. EXPECT(v.to_double().has_value());
  100. EXPECT(v.to_double().value() - 42.0 < NumericLimits<double>().epsilon());
  101. EXPECT(v.to_bool().has_value());
  102. EXPECT(v.to_bool().value());
  103. }
  104. {
  105. SQL::Value v(0);
  106. EXPECT(!v.is_null());
  107. EXPECT(v.to_int().value() == 0);
  108. EXPECT(v.to_bool().has_value());
  109. EXPECT(!v.to_bool().value());
  110. }
  111. {
  112. SQL::Value v(SQL::SQLType::Integer, "42");
  113. EXPECT_EQ(v.to_int().value(), 42);
  114. }
  115. {
  116. SQL::Value v(SQL::SQLType::Integer, SQL::Value("42"));
  117. EXPECT_EQ(v.to_int().value(), 42);
  118. }
  119. {
  120. SQL::Value text("42");
  121. SQL::Value integer(SQL::SQLType::Integer);
  122. integer = text;
  123. EXPECT_EQ(integer.to_int().value(), 42);
  124. }
  125. }
  126. TEST_CASE(serialize_int_value)
  127. {
  128. SQL::Value v(42);
  129. EXPECT_EQ(v.type(), SQL::SQLType::Integer);
  130. EXPECT_EQ(v.to_int().value(), 42);
  131. SQL::Serializer serializer;
  132. serializer.serialize<SQL::Value>(v);
  133. serializer.rewind();
  134. auto v2 = serializer.deserialize<SQL::Value>();
  135. EXPECT(!v2.is_null());
  136. EXPECT_EQ(v2.type(), SQL::SQLType::Integer);
  137. EXPECT_EQ(v2.to_int().value(), 42);
  138. EXPECT(v2 == v);
  139. }
  140. TEST_CASE(float_value)
  141. {
  142. {
  143. SQL::Value v(SQL::SQLType::Float);
  144. EXPECT(v.is_null());
  145. v = 3.14;
  146. EXPECT(!v.is_null());
  147. EXPECT(v.to_double().has_value());
  148. EXPECT(v.to_double().value() - 3.14 < NumericLimits<double>().epsilon());
  149. EXPECT(v.to_int().has_value());
  150. EXPECT_EQ(v.to_int().value(), 3);
  151. EXPECT_EQ(v.to_string(), "3.14");
  152. EXPECT(v.to_bool().has_value());
  153. EXPECT(v.to_bool().value());
  154. v = 0.0;
  155. EXPECT(!v.is_null());
  156. EXPECT(v.to_double().has_value());
  157. EXPECT(v.to_double().value() < NumericLimits<double>().epsilon());
  158. EXPECT(v.to_int().has_value());
  159. EXPECT_EQ(v.to_int().value(), 0);
  160. EXPECT_EQ(v.to_string(), "0");
  161. EXPECT(v.to_bool().has_value());
  162. EXPECT(!v.to_bool().value());
  163. }
  164. {
  165. SQL::Value v(3.14);
  166. EXPECT(!v.is_null());
  167. EXPECT(v.to_double().value() - 3.14 < NumericLimits<double>().epsilon());
  168. }
  169. {
  170. SQL::Value v(3.51);
  171. EXPECT(!v.is_null());
  172. EXPECT_EQ(v.to_int().value(), 4);
  173. }
  174. {
  175. SQL::Value v(-3.14);
  176. EXPECT_EQ(v.to_int().value(), -3);
  177. }
  178. {
  179. SQL::Value v(-3.51);
  180. EXPECT_EQ(v.to_int().value(), -4);
  181. }
  182. {
  183. SQL::Value v(SQL::SQLType::Float, "3.14");
  184. EXPECT(v.to_double().value() - 3.14 < NumericLimits<double>().epsilon());
  185. }
  186. }
  187. TEST_CASE(serialize_float_value)
  188. {
  189. SQL::Value v(3.14);
  190. EXPECT_EQ(v.type(), SQL::SQLType::Float);
  191. EXPECT(v.to_double().value() - 3.14 < NumericLimits<double>().epsilon());
  192. SQL::Serializer serializer;
  193. serializer.serialize<SQL::Value>(v);
  194. serializer.rewind();
  195. auto v2 = serializer.deserialize<SQL::Value>();
  196. EXPECT(!v2.is_null());
  197. EXPECT_EQ(v2.type(), SQL::SQLType::Float);
  198. EXPECT(v.to_double().value() - 3.14 < NumericLimits<double>().epsilon());
  199. }
  200. TEST_CASE(assign_int_to_text_value)
  201. {
  202. SQL::Value text(SQL::SQLType::Text);
  203. text = 42;
  204. EXPECT_EQ(text.to_string(), "42");
  205. }
  206. TEST_CASE(copy_value)
  207. {
  208. SQL::Value text(SQL::SQLType::Text, 42);
  209. SQL::Value copy(text);
  210. EXPECT_EQ(copy.to_string(), "42");
  211. }
  212. TEST_CASE(compare_text_to_int)
  213. {
  214. SQL::Value text(SQL::SQLType::Text);
  215. text = 42;
  216. SQL::Value integer(SQL::SQLType::Integer);
  217. integer = 42;
  218. EXPECT(text == integer);
  219. EXPECT(integer == text);
  220. }
  221. TEST_CASE(bool_value)
  222. {
  223. {
  224. SQL::Value v(SQL::SQLType::Boolean);
  225. EXPECT(v.is_null());
  226. v = true;
  227. EXPECT(!v.is_null());
  228. EXPECT(v.to_bool().has_value());
  229. EXPECT(v.to_bool().value());
  230. EXPECT_EQ(v.to_int().value(), 1);
  231. EXPECT_EQ(v.to_string(), "true");
  232. EXPECT(!v.to_double().has_value());
  233. }
  234. {
  235. SQL::Value v(SQL::SQLType::Boolean, false);
  236. EXPECT(!v.is_null());
  237. EXPECT(v.to_bool().has_value());
  238. EXPECT(!v.to_bool().value());
  239. EXPECT_EQ(v.to_int().value(), 0);
  240. EXPECT_EQ(v.to_string(), "false");
  241. EXPECT(!v.to_double().has_value());
  242. }
  243. {
  244. SQL::Value v(true);
  245. EXPECT_EQ(v.type(), SQL::SQLType::Boolean);
  246. EXPECT(!v.is_null());
  247. EXPECT(v.to_bool().has_value());
  248. EXPECT(v.to_bool().value());
  249. }
  250. }
  251. TEST_CASE(serialize_boolean_value)
  252. {
  253. SQL::Value v(true);
  254. EXPECT_EQ(v.type(), SQL::SQLType::Boolean);
  255. EXPECT_EQ(v.to_bool(), true);
  256. SQL::Serializer serializer;
  257. serializer.serialize<SQL::Value>(v);
  258. serializer.rewind();
  259. auto v2 = serializer.deserialize<SQL::Value>();
  260. EXPECT(!v2.is_null());
  261. EXPECT_EQ(v2.type(), SQL::SQLType::Boolean);
  262. EXPECT_EQ(v2.to_bool(), true);
  263. EXPECT_EQ(v, v2);
  264. }
  265. TEST_CASE(tuple_value)
  266. {
  267. NonnullRefPtr<SQL::TupleDescriptor> descriptor = adopt_ref(*new SQL::TupleDescriptor);
  268. descriptor->append({ "schema", "table", "col1", SQL::SQLType::Text, SQL::Order::Ascending });
  269. descriptor->append({ "schema", "table", "col2", SQL::SQLType::Integer, SQL::Order::Descending });
  270. auto v = SQL::Value::create_tuple(descriptor);
  271. Vector<SQL::Value> values;
  272. values.append(SQL::Value("Test"));
  273. values.append(SQL::Value(42));
  274. v = values;
  275. auto values2 = v.to_vector();
  276. EXPECT(values2.has_value());
  277. EXPECT_EQ(values, values2.value());
  278. }
  279. TEST_CASE(copy_tuple_value)
  280. {
  281. NonnullRefPtr<SQL::TupleDescriptor> descriptor = adopt_ref(*new SQL::TupleDescriptor);
  282. descriptor->append({ "schema", "table", "col1", SQL::SQLType::Text, SQL::Order::Ascending });
  283. descriptor->append({ "schema", "table", "col2", SQL::SQLType::Integer, SQL::Order::Descending });
  284. auto v = SQL::Value::create_tuple(descriptor);
  285. Vector<SQL::Value> values;
  286. values.append(SQL::Value("Test"));
  287. values.append(SQL::Value(42));
  288. v = values;
  289. auto values2 = v;
  290. EXPECT(values2.type() == v.type());
  291. EXPECT(!values2.is_null());
  292. EXPECT_EQ(values, values2.to_vector().value());
  293. }
  294. TEST_CASE(tuple_value_wrong_type)
  295. {
  296. NonnullRefPtr<SQL::TupleDescriptor> descriptor = adopt_ref(*new SQL::TupleDescriptor);
  297. descriptor->append({ "schema", "table", "col1", SQL::SQLType::Text, SQL::Order::Ascending });
  298. auto v = SQL::Value::create_tuple(descriptor);
  299. Vector<SQL::Value> values;
  300. values.append(SQL::Value(42));
  301. v = values;
  302. EXPECT(v.is_null());
  303. }
  304. TEST_CASE(tuple_value_too_many_values)
  305. {
  306. NonnullRefPtr<SQL::TupleDescriptor> descriptor = adopt_ref(*new SQL::TupleDescriptor);
  307. descriptor->append({ "schema", "table", "col1", SQL::SQLType::Text, SQL::Order::Ascending });
  308. auto v = SQL::Value::create_tuple(descriptor);
  309. Vector<SQL::Value> values;
  310. values.append(SQL::Value("Test"));
  311. values.append(SQL::Value(42));
  312. v = values;
  313. EXPECT(v.is_null());
  314. }
  315. TEST_CASE(tuple_value_not_enough_values)
  316. {
  317. NonnullRefPtr<SQL::TupleDescriptor> descriptor = adopt_ref(*new SQL::TupleDescriptor);
  318. descriptor->append({ "schema", "table", "col1", SQL::SQLType::Text, SQL::Order::Ascending });
  319. descriptor->append({ "schema", "table", "col2", SQL::SQLType::Integer, SQL::Order::Ascending });
  320. auto v = SQL::Value::create_tuple(descriptor);
  321. Vector<SQL::Value> values;
  322. values.append(SQL::Value("Test"));
  323. v = values;
  324. EXPECT(!v.is_null());
  325. auto values_opt = v.to_vector();
  326. EXPECT(values_opt.has_value());
  327. EXPECT_EQ(values_opt.value().size(), 2u);
  328. auto col2 = values_opt.value()[1];
  329. EXPECT_EQ(col2.type(), SQL::SQLType::Integer);
  330. EXPECT(col2.is_null());
  331. }
  332. TEST_CASE(serialize_tuple_value)
  333. {
  334. NonnullRefPtr<SQL::TupleDescriptor> descriptor = adopt_ref(*new SQL::TupleDescriptor);
  335. descriptor->append({ "schema", "table", "col1", SQL::SQLType::Text, SQL::Order::Ascending });
  336. descriptor->append({ "schema", "table", "col2", SQL::SQLType::Integer, SQL::Order::Descending });
  337. auto v = SQL::Value::create_tuple(descriptor);
  338. Vector<SQL::Value> values;
  339. values.append(SQL::Value("Test"));
  340. values.append(SQL::Value(42));
  341. v = values;
  342. SQL::Serializer serializer;
  343. serializer.serialize<SQL::Value>(v);
  344. serializer.rewind();
  345. auto v2 = serializer.deserialize<SQL::Value>();
  346. EXPECT(!v2.is_null());
  347. EXPECT_EQ(v2.type(), SQL::SQLType::Tuple);
  348. EXPECT_EQ(v, v2);
  349. }
  350. TEST_CASE(array_value)
  351. {
  352. auto v = SQL::Value::create_array(SQL::SQLType::Text, 3);
  353. Vector<SQL::Value> values;
  354. values.append(SQL::Value("Test 1"));
  355. values.append(SQL::Value("Test 2"));
  356. v = values;
  357. auto values2 = v.to_vector();
  358. EXPECT(values2.has_value());
  359. EXPECT_EQ(values, values2.value());
  360. }
  361. TEST_CASE(array_value_wrong_type)
  362. {
  363. auto v = SQL::Value::create_array(SQL::SQLType::Text, 2);
  364. Vector<SQL::Value> values;
  365. values.append(SQL::Value("Test 1"));
  366. values.append(SQL::Value(42));
  367. v = values;
  368. EXPECT(v.is_null());
  369. }
  370. TEST_CASE(array_value_too_many_values)
  371. {
  372. auto v = SQL::Value::create_array(SQL::SQLType::Text, 2);
  373. Vector<SQL::Value> values;
  374. values.append(SQL::Value("Test 1"));
  375. values.append(SQL::Value("Test 2"));
  376. values.append(SQL::Value("Test 3"));
  377. v = values;
  378. EXPECT(v.is_null());
  379. }
  380. TEST_CASE(copy_array_value)
  381. {
  382. auto v = SQL::Value::create_array(SQL::SQLType::Text, 3);
  383. Vector<SQL::Value> values;
  384. values.append(SQL::Value("Test 1"));
  385. values.append(SQL::Value("Test 2"));
  386. v = values;
  387. auto values2 = v;
  388. EXPECT(values2.type() == v.type());
  389. EXPECT(!values2.is_null());
  390. EXPECT_EQ(values, values2.to_vector().value());
  391. }
  392. TEST_CASE(serialize_array_value)
  393. {
  394. auto v = SQL::Value::create_array(SQL::SQLType::Text, 3);
  395. Vector<SQL::Value> values;
  396. values.append(SQL::Value("Test 1"));
  397. values.append(SQL::Value("Test 2"));
  398. v = values;
  399. SQL::Serializer serializer;
  400. serializer.serialize<SQL::Value>(v);
  401. serializer.rewind();
  402. auto v2 = serializer.deserialize<SQL::Value>();
  403. EXPECT(!v2.is_null());
  404. EXPECT_EQ(v2.type(), SQL::SQLType::Array);
  405. EXPECT_EQ(v, v2);
  406. }
  407. TEST_CASE(order_text_values)
  408. {
  409. SQL::Value v1(SQL::SQLType::Text);
  410. v1 = "Test_A";
  411. SQL::Value v2(SQL::SQLType::Text);
  412. v2 = "Test_B";
  413. EXPECT(v1 <= v2);
  414. EXPECT(v1 < v2);
  415. EXPECT(v2 >= v1);
  416. EXPECT(v2 > v1);
  417. }
  418. TEST_CASE(order_int_values)
  419. {
  420. SQL::Value v1(SQL::SQLType::Integer);
  421. v1 = 12;
  422. SQL::Value v2(SQL::SQLType::Integer);
  423. v2 = 42;
  424. EXPECT(v1 <= v2);
  425. EXPECT(v1 < v2);
  426. EXPECT(v2 >= v1);
  427. EXPECT(v2 > v1);
  428. }
  429. TEST_CASE(tuple)
  430. {
  431. NonnullRefPtr<SQL::TupleDescriptor> descriptor = adopt_ref(*new SQL::TupleDescriptor);
  432. descriptor->append({ "schema", "table", "col1", SQL::SQLType::Text, SQL::Order::Ascending });
  433. descriptor->append({ "schema", "table", "col2", SQL::SQLType::Integer, SQL::Order::Descending });
  434. SQL::Tuple tuple(descriptor);
  435. tuple["col1"] = "Test";
  436. tuple["col2"] = 42;
  437. EXPECT(tuple[0] == "Test");
  438. EXPECT(tuple[1] == 42);
  439. }
  440. TEST_CASE(serialize_tuple)
  441. {
  442. NonnullRefPtr<SQL::TupleDescriptor> descriptor = adopt_ref(*new SQL::TupleDescriptor);
  443. descriptor->append({ "schema", "table", "col1", SQL::SQLType::Text, SQL::Order::Ascending });
  444. descriptor->append({ "schema", "table", "col2", SQL::SQLType::Integer, SQL::Order::Descending });
  445. SQL::Tuple tuple(descriptor);
  446. tuple["col1"] = "Test";
  447. tuple["col2"] = 42;
  448. EXPECT_EQ(tuple[0], "Test");
  449. EXPECT_EQ(tuple[1], 42);
  450. SQL::Serializer serializer;
  451. serializer.serialize<SQL::Tuple>(tuple);
  452. serializer.rewind();
  453. auto tuple2 = serializer.deserialize<SQL::Tuple>();
  454. EXPECT(tuple2[0] == "Test");
  455. EXPECT(tuple2[1] == 42);
  456. }
  457. TEST_CASE(copy_tuple)
  458. {
  459. NonnullRefPtr<SQL::TupleDescriptor> descriptor = adopt_ref(*new SQL::TupleDescriptor);
  460. descriptor->append({ "schema", "table", "col1", SQL::SQLType::Text, SQL::Order::Ascending });
  461. descriptor->append({ "schema", "table", "col2", SQL::SQLType::Integer, SQL::Order::Descending });
  462. SQL::Tuple tuple(descriptor);
  463. tuple["col1"] = "Test";
  464. tuple["col2"] = 42;
  465. SQL::Tuple copy;
  466. copy = tuple;
  467. EXPECT(tuple == copy);
  468. SQL::Tuple copy_2(copy);
  469. EXPECT(tuple == copy_2);
  470. }
  471. TEST_CASE(compare_tuples)
  472. {
  473. NonnullRefPtr<SQL::TupleDescriptor> descriptor = adopt_ref(*new SQL::TupleDescriptor);
  474. descriptor->append({ "schema", "table", "col1", SQL::SQLType::Text, SQL::Order::Ascending });
  475. descriptor->append({ "schema", "table", "col2", SQL::SQLType::Integer, SQL::Order::Descending });
  476. SQL::Tuple tuple1(descriptor);
  477. tuple1["col1"] = "Test";
  478. tuple1["col2"] = 42;
  479. SQL::Tuple tuple2(descriptor);
  480. tuple2["col1"] = "Test";
  481. tuple2["col2"] = 12;
  482. SQL::Tuple tuple3(descriptor);
  483. tuple3["col1"] = "Text";
  484. tuple3["col2"] = 12;
  485. EXPECT(tuple1 <= tuple2);
  486. EXPECT(tuple1 < tuple2);
  487. EXPECT(tuple2 >= tuple1);
  488. EXPECT(tuple2 > tuple1);
  489. EXPECT(tuple1 <= tuple3);
  490. EXPECT(tuple1 < tuple3);
  491. EXPECT(tuple3 >= tuple1);
  492. EXPECT(tuple3 > tuple1);
  493. }