TestSqlValueAndTuple.cpp 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305
  1. /*
  2. * Copyright (c) 2021, Jan de Visser <jan@de-visser.net>
  3. * Copyright (c) 2022, Tim Flynn <trflynn89@serenityos.org>
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #include <unistd.h>
  8. #include <LibSQL/Meta.h>
  9. #include <LibSQL/Row.h>
  10. #include <LibSQL/Tuple.h>
  11. #include <LibSQL/Value.h>
  12. #include <LibTest/TestCase.h>
  13. TEST_CASE(null_value)
  14. {
  15. SQL::Value v(SQL::SQLType::Null);
  16. EXPECT_EQ(v.type(), SQL::SQLType::Null);
  17. EXPECT_EQ(v.to_deprecated_string(), "(null)"sv);
  18. EXPECT(!v.to_bool().has_value());
  19. EXPECT(!v.to_int<i32>().has_value());
  20. EXPECT(!v.to_int<u32>().has_value());
  21. EXPECT(!v.to_double().has_value());
  22. }
  23. TEST_CASE(assign_null)
  24. {
  25. SQL::Value v("Test");
  26. EXPECT_EQ(v.type(), SQL::SQLType::Text);
  27. EXPECT(!v.is_null());
  28. v = SQL::Value();
  29. EXPECT_EQ(v.type(), SQL::SQLType::Null);
  30. EXPECT(v.is_null());
  31. }
  32. TEST_CASE(text_value)
  33. {
  34. {
  35. SQL::Value v(SQL::SQLType::Text);
  36. EXPECT_EQ(v.type(), SQL::SQLType::Text);
  37. EXPECT(v.is_null());
  38. v = "Test"sv;
  39. EXPECT_EQ(v.type(), SQL::SQLType::Text);
  40. EXPECT_EQ(v.to_deprecated_string(), "Test"sv);
  41. }
  42. {
  43. SQL::Value v(DeprecatedString("String Test"sv));
  44. EXPECT_EQ(v.type(), SQL::SQLType::Text);
  45. EXPECT_EQ(v.to_deprecated_string(), "String Test"sv);
  46. v = DeprecatedString("String Test 2"sv);
  47. EXPECT_EQ(v.type(), SQL::SQLType::Text);
  48. EXPECT_EQ(v.to_deprecated_string(), "String Test 2"sv);
  49. }
  50. {
  51. SQL::Value v("const char * Test");
  52. EXPECT_EQ(v.type(), SQL::SQLType::Text);
  53. EXPECT_EQ(v.to_deprecated_string(), "const char * Test"sv);
  54. v = "const char * Test 2";
  55. EXPECT_EQ(v.type(), SQL::SQLType::Text);
  56. EXPECT_EQ(v.to_deprecated_string(), "const char * Test 2"sv);
  57. }
  58. }
  59. TEST_CASE(text_value_to_other_types)
  60. {
  61. {
  62. SQL::Value v("42");
  63. EXPECT_EQ(v.type(), SQL::SQLType::Text);
  64. EXPECT(v.to_int<i32>().has_value());
  65. EXPECT_EQ(v.to_int<i32>().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_EQ(v.type(), SQL::SQLType::Text);
  72. EXPECT(v.to_bool().has_value());
  73. EXPECT(v.to_bool().value());
  74. }
  75. {
  76. SQL::Value v("false");
  77. EXPECT_EQ(v.type(), SQL::SQLType::Text);
  78. EXPECT(v.to_bool().has_value());
  79. EXPECT(!v.to_bool().value());
  80. }
  81. {
  82. SQL::Value v("foo");
  83. EXPECT_EQ(v.type(), SQL::SQLType::Text);
  84. EXPECT(!v.to_bool().has_value());
  85. EXPECT(!v.to_int<i32>().has_value());
  86. EXPECT(!v.to_int<u32>().has_value());
  87. EXPECT(!v.to_double().has_value());
  88. }
  89. {
  90. SQL::Value v("3.14");
  91. EXPECT_EQ(v.type(), SQL::SQLType::Text);
  92. EXPECT(v.to_double().has_value());
  93. EXPECT((v.to_double().value() - 3.14) < NumericLimits<double>().epsilon());
  94. }
  95. }
  96. TEST_CASE(assign_int_to_text_value)
  97. {
  98. SQL::Value v(SQL::SQLType::Text);
  99. EXPECT_EQ(v.type(), SQL::SQLType::Text);
  100. EXPECT(v.is_null());
  101. v = 42;
  102. EXPECT_EQ(v.type(), SQL::SQLType::Integer);
  103. EXPECT_EQ(v, 42);
  104. }
  105. TEST_CASE(serialize_text_value)
  106. {
  107. SQL::Value v("Test");
  108. EXPECT_EQ(v.type(), SQL::SQLType::Text);
  109. EXPECT_EQ(v, "Test"sv);
  110. SQL::Serializer serializer;
  111. serializer.serialize<SQL::Value>(v);
  112. serializer.rewind();
  113. auto v2 = serializer.deserialize<SQL::Value>();
  114. EXPECT_EQ(v2.type(), SQL::SQLType::Text);
  115. EXPECT_EQ(v2, "Test"sv);
  116. EXPECT_EQ(v2, v);
  117. }
  118. TEST_CASE(integer_value)
  119. {
  120. {
  121. SQL::Value v(SQL::SQLType::Integer);
  122. EXPECT_EQ(v.type(), SQL::SQLType::Integer);
  123. EXPECT(v.is_null());
  124. v = 42;
  125. EXPECT_EQ(v.type(), SQL::SQLType::Integer);
  126. EXPECT(v.to_int<i32>().has_value());
  127. EXPECT_EQ(v.to_int<i32>().value(), 42);
  128. EXPECT_EQ(v.to_deprecated_string(), "42"sv);
  129. EXPECT(v.to_double().has_value());
  130. EXPECT((v.to_double().value() - 42.0) < NumericLimits<double>().epsilon());
  131. EXPECT(v.to_bool().has_value());
  132. EXPECT(v.to_bool().value());
  133. }
  134. {
  135. SQL::Value v(0);
  136. EXPECT_EQ(v.type(), SQL::SQLType::Integer);
  137. EXPECT(v.to_int<i32>().has_value());
  138. EXPECT_EQ(v.to_int<i32>().value(), 0);
  139. EXPECT(v.to_bool().has_value());
  140. EXPECT(!v.to_bool().value());
  141. }
  142. {
  143. SQL::Value v(42);
  144. EXPECT_EQ(v.type(), SQL::SQLType::Integer);
  145. EXPECT(v.to_int<i32>().has_value());
  146. EXPECT_EQ(v.to_int<i32>().value(), 42);
  147. }
  148. {
  149. SQL::Value text("42");
  150. SQL::Value integer(SQL::SQLType::Integer);
  151. integer = text;
  152. EXPECT(integer.to_int<i32>().has_value());
  153. EXPECT_EQ(integer.to_int<i32>().value(), 42);
  154. }
  155. }
  156. TEST_CASE(serialize_int_value)
  157. {
  158. SQL::Value v(42);
  159. EXPECT_EQ(v.type(), SQL::SQLType::Integer);
  160. EXPECT_EQ(v, 42);
  161. SQL::Serializer serializer;
  162. serializer.serialize<SQL::Value>(v);
  163. serializer.rewind();
  164. auto v2 = serializer.deserialize<SQL::Value>();
  165. EXPECT_EQ(v2.type(), SQL::SQLType::Integer);
  166. EXPECT_EQ(v2, 42);
  167. EXPECT_EQ(v2, v);
  168. }
  169. TEST_CASE(serialize_downsized_int_value)
  170. {
  171. auto run_test_for_value = [](auto value) {
  172. using T = decltype(value);
  173. SQL::Value v(value);
  174. SQL::Serializer serializer;
  175. serializer.serialize(v);
  176. serializer.rewind();
  177. auto type_flags = serializer.deserialize<u8>();
  178. auto type_data = type_flags & 0xf0;
  179. auto type = static_cast<SQL::SQLType>(type_flags & 0x0f);
  180. EXPECT_NE(type_data, 0);
  181. EXPECT_EQ(type, SQL::SQLType::Integer);
  182. auto deserialized = serializer.deserialize<T>();
  183. EXPECT_EQ(deserialized, value);
  184. };
  185. run_test_for_value(NumericLimits<i8>::min());
  186. run_test_for_value(NumericLimits<i8>::max());
  187. run_test_for_value(NumericLimits<i16>::min());
  188. run_test_for_value(NumericLimits<i16>::max());
  189. run_test_for_value(NumericLimits<i32>::min());
  190. run_test_for_value(NumericLimits<i32>::max());
  191. run_test_for_value(NumericLimits<i64>::min());
  192. run_test_for_value(NumericLimits<i64>::max());
  193. run_test_for_value(NumericLimits<u8>::min());
  194. run_test_for_value(NumericLimits<u8>::max());
  195. run_test_for_value(NumericLimits<u16>::min());
  196. run_test_for_value(NumericLimits<u16>::max());
  197. run_test_for_value(NumericLimits<u32>::min());
  198. run_test_for_value(NumericLimits<u32>::max());
  199. run_test_for_value(NumericLimits<u64>::min());
  200. run_test_for_value(NumericLimits<u64>::max());
  201. }
  202. TEST_CASE(float_value)
  203. {
  204. {
  205. SQL::Value v(SQL::SQLType::Float);
  206. EXPECT_EQ(v.type(), SQL::SQLType::Float);
  207. EXPECT(v.is_null());
  208. v = 3.14;
  209. EXPECT_EQ(v.type(), SQL::SQLType::Float);
  210. EXPECT(v.to_double().has_value());
  211. EXPECT((v.to_double().value() - 3.14) < NumericLimits<double>().epsilon());
  212. EXPECT(v.to_int<i32>().has_value());
  213. EXPECT_EQ(v.to_int<i32>().value(), 3);
  214. EXPECT_EQ(v.to_deprecated_string(), "3.14");
  215. EXPECT(v.to_bool().has_value());
  216. EXPECT(v.to_bool().value());
  217. v = 0.0;
  218. EXPECT_EQ(v.type(), SQL::SQLType::Float);
  219. EXPECT(v.to_double().has_value());
  220. EXPECT(v.to_double().value() < NumericLimits<double>().epsilon());
  221. EXPECT(v.to_int<i32>().has_value());
  222. EXPECT_EQ(v.to_int<i32>().value(), 0);
  223. EXPECT_EQ(v.to_deprecated_string(), "0"sv);
  224. EXPECT(v.to_bool().has_value());
  225. EXPECT(!v.to_bool().value());
  226. }
  227. {
  228. SQL::Value v(3.14);
  229. EXPECT_EQ(v.type(), SQL::SQLType::Float);
  230. EXPECT((v.to_double().value() - 3.14) < NumericLimits<double>().epsilon());
  231. }
  232. {
  233. SQL::Value v(3.51);
  234. EXPECT_EQ(v.type(), SQL::SQLType::Float);
  235. EXPECT(v.to_int<i32>().has_value());
  236. EXPECT_EQ(v.to_int<i32>().value(), 4);
  237. }
  238. {
  239. SQL::Value v(-3.14);
  240. EXPECT_EQ(v.type(), SQL::SQLType::Float);
  241. EXPECT(v.to_int<i32>().has_value());
  242. EXPECT_EQ(v.to_int<i32>().value(), -3);
  243. }
  244. {
  245. SQL::Value v(-3.51);
  246. EXPECT_EQ(v.type(), SQL::SQLType::Float);
  247. EXPECT(v.to_int<i32>().has_value());
  248. EXPECT_EQ(v.to_int<i32>().value(), -4);
  249. }
  250. }
  251. TEST_CASE(serialize_float_value)
  252. {
  253. SQL::Value v(3.14);
  254. EXPECT_EQ(v.type(), SQL::SQLType::Float);
  255. EXPECT(v.to_double().value() - 3.14 < NumericLimits<double>().epsilon());
  256. SQL::Serializer serializer;
  257. serializer.serialize<SQL::Value>(v);
  258. serializer.rewind();
  259. auto v2 = serializer.deserialize<SQL::Value>();
  260. EXPECT_EQ(v2.type(), SQL::SQLType::Float);
  261. EXPECT((v.to_double().value() - 3.14) < NumericLimits<double>().epsilon());
  262. EXPECT_EQ(v2, v);
  263. }
  264. TEST_CASE(copy_value)
  265. {
  266. SQL::Value text("42");
  267. SQL::Value copy(text);
  268. EXPECT_EQ(copy, "42"sv);
  269. }
  270. TEST_CASE(to_int)
  271. {
  272. SQL::Value text("42");
  273. SQL::Value integer(42);
  274. EXPECT_EQ(text, integer);
  275. EXPECT_EQ(integer, text);
  276. SQL::Value int_64 { static_cast<i64>(123) };
  277. EXPECT_EQ(int_64.to_int<i8>(), 123);
  278. EXPECT_EQ(int_64.to_int<i16>(), 123);
  279. EXPECT_EQ(int_64.to_int<i32>(), 123);
  280. EXPECT_EQ(int_64.to_int<u8>(), 123u);
  281. EXPECT_EQ(int_64.to_int<u16>(), 123u);
  282. EXPECT_EQ(int_64.to_int<u32>(), 123u);
  283. EXPECT_EQ(int_64.to_int<u64>(), 123u);
  284. SQL::Value uint_64 { static_cast<i64>(123) };
  285. EXPECT_EQ(uint_64.to_int<i8>(), 123);
  286. EXPECT_EQ(uint_64.to_int<i16>(), 123);
  287. EXPECT_EQ(uint_64.to_int<i32>(), 123);
  288. EXPECT_EQ(uint_64.to_int<i64>(), 123);
  289. EXPECT_EQ(uint_64.to_int<u8>(), 123u);
  290. EXPECT_EQ(uint_64.to_int<u16>(), 123u);
  291. EXPECT_EQ(uint_64.to_int<u32>(), 123u);
  292. }
  293. TEST_CASE(to_int_failures)
  294. {
  295. SQL::Value large_int_64 { NumericLimits<i64>::max() };
  296. EXPECT(!large_int_64.to_int<i8>().has_value());
  297. EXPECT(!large_int_64.to_int<i16>().has_value());
  298. EXPECT(!large_int_64.to_int<i32>().has_value());
  299. EXPECT(!large_int_64.to_int<u8>().has_value());
  300. EXPECT(!large_int_64.to_int<u16>().has_value());
  301. EXPECT(!large_int_64.to_int<u32>().has_value());
  302. SQL::Value large_int_32 { NumericLimits<i32>::max() };
  303. EXPECT(!large_int_32.to_int<i8>().has_value());
  304. EXPECT(!large_int_32.to_int<i16>().has_value());
  305. EXPECT(!large_int_32.to_int<u8>().has_value());
  306. EXPECT(!large_int_32.to_int<u16>().has_value());
  307. SQL::Value small_int_64 { NumericLimits<i64>::min() };
  308. EXPECT(!small_int_64.to_int<i8>().has_value());
  309. EXPECT(!small_int_64.to_int<i16>().has_value());
  310. EXPECT(!small_int_64.to_int<i32>().has_value());
  311. EXPECT(!small_int_64.to_int<u8>().has_value());
  312. EXPECT(!small_int_64.to_int<u16>().has_value());
  313. EXPECT(!small_int_64.to_int<u32>().has_value());
  314. EXPECT(!small_int_64.to_int<u64>().has_value());
  315. SQL::Value small_int_32 { NumericLimits<i32>::min() };
  316. EXPECT(!small_int_32.to_int<i8>().has_value());
  317. EXPECT(!small_int_32.to_int<i16>().has_value());
  318. EXPECT(!small_int_32.to_int<u8>().has_value());
  319. EXPECT(!small_int_32.to_int<u16>().has_value());
  320. EXPECT(!small_int_32.to_int<u32>().has_value());
  321. EXPECT(!small_int_32.to_int<u64>().has_value());
  322. SQL::Value large_uint_64 { NumericLimits<u64>::max() };
  323. EXPECT(!large_uint_64.to_int<i8>().has_value());
  324. EXPECT(!large_uint_64.to_int<i16>().has_value());
  325. EXPECT(!large_uint_64.to_int<i32>().has_value());
  326. EXPECT(!large_uint_64.to_int<i64>().has_value());
  327. EXPECT(!large_uint_64.to_int<u8>().has_value());
  328. EXPECT(!large_uint_64.to_int<u16>().has_value());
  329. EXPECT(!large_uint_64.to_int<u32>().has_value());
  330. SQL::Value large_uint_32 { NumericLimits<u32>::max() };
  331. EXPECT(!large_uint_32.to_int<i8>().has_value());
  332. EXPECT(!large_uint_32.to_int<i16>().has_value());
  333. EXPECT(!large_uint_32.to_int<u8>().has_value());
  334. EXPECT(!large_uint_32.to_int<u16>().has_value());
  335. }
  336. TEST_CASE(bool_value)
  337. {
  338. {
  339. SQL::Value v(SQL::SQLType::Boolean);
  340. EXPECT_EQ(v.type(), SQL::SQLType::Boolean);
  341. EXPECT(v.is_null());
  342. v = true;
  343. EXPECT_EQ(v.type(), SQL::SQLType::Boolean);
  344. EXPECT(v.to_bool().has_value());
  345. EXPECT(v.to_bool().value());
  346. EXPECT(v.to_int<i32>().has_value());
  347. EXPECT_EQ(v.to_int<i32>().value(), 1);
  348. EXPECT_EQ(v.to_deprecated_string(), "true"sv);
  349. EXPECT(v.to_double().has_value());
  350. EXPECT((v.to_double().value() - 1.0) < NumericLimits<double>().epsilon());
  351. }
  352. {
  353. SQL::Value v(false);
  354. EXPECT_EQ(v.type(), SQL::SQLType::Boolean);
  355. EXPECT(v.to_bool().has_value());
  356. EXPECT(!v.to_bool().value());
  357. EXPECT(v.to_int<i32>().has_value());
  358. EXPECT_EQ(v.to_int<i32>().value(), 0);
  359. EXPECT_EQ(v.to_deprecated_string(), "false"sv);
  360. EXPECT(v.to_double().has_value());
  361. EXPECT(v.to_double().value() < NumericLimits<double>().epsilon());
  362. }
  363. {
  364. SQL::Value v(true);
  365. EXPECT_EQ(v.type(), SQL::SQLType::Boolean);
  366. EXPECT(v.to_bool().has_value());
  367. EXPECT(v.to_bool().value());
  368. EXPECT(v.to_int<i32>().has_value());
  369. EXPECT_EQ(v.to_int<i32>().value(), 1);
  370. EXPECT_EQ(v.to_deprecated_string(), "true"sv);
  371. EXPECT(v.to_double().has_value());
  372. EXPECT((v.to_double().value() - 1.0) < NumericLimits<double>().epsilon());
  373. }
  374. }
  375. TEST_CASE(serialize_boolean_value)
  376. {
  377. SQL::Value v(true);
  378. EXPECT_EQ(v.type(), SQL::SQLType::Boolean);
  379. EXPECT_EQ(v.to_bool(), true);
  380. SQL::Serializer serializer;
  381. serializer.serialize<SQL::Value>(v);
  382. serializer.rewind();
  383. auto v2 = serializer.deserialize<SQL::Value>();
  384. EXPECT_EQ(v2.type(), SQL::SQLType::Boolean);
  385. EXPECT_EQ(v2.to_bool(), true);
  386. EXPECT_EQ(v, v2);
  387. }
  388. TEST_CASE(tuple_value)
  389. {
  390. NonnullRefPtr<SQL::TupleDescriptor> descriptor = adopt_ref(*new SQL::TupleDescriptor);
  391. descriptor->append({ "schema", "table", "col1", SQL::SQLType::Text, SQL::Order::Ascending });
  392. descriptor->append({ "schema", "table", "col2", SQL::SQLType::Integer, SQL::Order::Descending });
  393. auto v = MUST(SQL::Value::create_tuple(move(descriptor)));
  394. Vector<SQL::Value> values;
  395. values.empend("Test");
  396. values.empend(42);
  397. MUST(v.assign_tuple(values));
  398. auto values2 = v.to_vector();
  399. EXPECT(values2.has_value());
  400. EXPECT_EQ(values, values2.value());
  401. }
  402. TEST_CASE(copy_tuple_value)
  403. {
  404. NonnullRefPtr<SQL::TupleDescriptor> descriptor = adopt_ref(*new SQL::TupleDescriptor);
  405. descriptor->append({ "schema", "table", "col1", SQL::SQLType::Text, SQL::Order::Ascending });
  406. descriptor->append({ "schema", "table", "col2", SQL::SQLType::Integer, SQL::Order::Descending });
  407. auto v = MUST(SQL::Value::create_tuple(move(descriptor)));
  408. Vector<SQL::Value> values;
  409. values.empend("Test");
  410. values.empend(42);
  411. MUST(v.assign_tuple(values));
  412. auto values2 = v;
  413. EXPECT_EQ(values2.type(), v.type());
  414. EXPECT_EQ(v.type(), SQL::SQLType::Tuple);
  415. EXPECT_EQ(values, values2.to_vector().value());
  416. }
  417. TEST_CASE(tuple_value_wrong_type)
  418. {
  419. NonnullRefPtr<SQL::TupleDescriptor> descriptor = adopt_ref(*new SQL::TupleDescriptor);
  420. descriptor->append({ "schema", "table", "col1", SQL::SQLType::Text, SQL::Order::Ascending });
  421. auto v = MUST(SQL::Value::create_tuple(move(descriptor)));
  422. Vector<SQL::Value> values;
  423. values.empend(42);
  424. auto result = v.assign_tuple(move(values));
  425. EXPECT(result.is_error());
  426. }
  427. TEST_CASE(tuple_value_too_many_values)
  428. {
  429. NonnullRefPtr<SQL::TupleDescriptor> descriptor = adopt_ref(*new SQL::TupleDescriptor);
  430. descriptor->append({ "schema", "table", "col1", SQL::SQLType::Text, SQL::Order::Ascending });
  431. auto v = MUST(SQL::Value::create_tuple(move(descriptor)));
  432. Vector<SQL::Value> values;
  433. values.empend("Test");
  434. values.empend(42);
  435. auto result = v.assign_tuple(move(values));
  436. EXPECT(result.is_error());
  437. }
  438. TEST_CASE(tuple_value_not_enough_values)
  439. {
  440. NonnullRefPtr<SQL::TupleDescriptor> descriptor = adopt_ref(*new SQL::TupleDescriptor);
  441. descriptor->append({ "schema", "table", "col1", SQL::SQLType::Text, SQL::Order::Ascending });
  442. descriptor->append({ "schema", "table", "col2", SQL::SQLType::Integer, SQL::Order::Ascending });
  443. auto v = MUST(SQL::Value::create_tuple(move(descriptor)));
  444. Vector<SQL::Value> values;
  445. values.empend("Test");
  446. MUST(v.assign_tuple(values));
  447. EXPECT_EQ(v.type(), SQL::SQLType::Tuple);
  448. auto values_opt = v.to_vector();
  449. EXPECT(values_opt.has_value());
  450. EXPECT_EQ(values_opt.value().size(), 2u);
  451. auto col2 = values_opt.value()[1];
  452. EXPECT_EQ(col2.type(), SQL::SQLType::Integer);
  453. }
  454. TEST_CASE(serialize_tuple_value)
  455. {
  456. NonnullRefPtr<SQL::TupleDescriptor> descriptor = adopt_ref(*new SQL::TupleDescriptor);
  457. descriptor->append({ "schema", "table", "col1", SQL::SQLType::Text, SQL::Order::Ascending });
  458. descriptor->append({ "schema", "table", "col2", SQL::SQLType::Integer, SQL::Order::Descending });
  459. auto v = MUST(SQL::Value::create_tuple(move(descriptor)));
  460. Vector<SQL::Value> values;
  461. values.empend("Test");
  462. values.empend(42);
  463. MUST(v.assign_tuple(values));
  464. SQL::Serializer serializer;
  465. serializer.serialize<SQL::Value>(v);
  466. serializer.rewind();
  467. auto v2 = serializer.deserialize<SQL::Value>();
  468. EXPECT_EQ(v2.type(), SQL::SQLType::Tuple);
  469. EXPECT_EQ(v, v2);
  470. }
  471. TEST_CASE(order_text_values)
  472. {
  473. SQL::Value v1(SQL::SQLType::Text);
  474. v1 = "Test_A";
  475. SQL::Value v2(SQL::SQLType::Text);
  476. v2 = "Test_B";
  477. EXPECT(v1 <= v2);
  478. EXPECT(v1 < v2);
  479. EXPECT(v2 >= v1);
  480. EXPECT(v2 > v1);
  481. }
  482. TEST_CASE(order_int_values)
  483. {
  484. SQL::Value v1(SQL::SQLType::Integer);
  485. v1 = 12;
  486. SQL::Value v2(SQL::SQLType::Integer);
  487. v2 = 42;
  488. EXPECT(v1 <= v2);
  489. EXPECT(v1 < v2);
  490. EXPECT(v2 >= v1);
  491. EXPECT(v2 > v1);
  492. }
  493. TEST_CASE(tuple)
  494. {
  495. NonnullRefPtr<SQL::TupleDescriptor> descriptor = adopt_ref(*new SQL::TupleDescriptor);
  496. descriptor->append({ "schema", "table", "col1", SQL::SQLType::Text, SQL::Order::Ascending });
  497. descriptor->append({ "schema", "table", "col2", SQL::SQLType::Integer, SQL::Order::Descending });
  498. SQL::Tuple tuple(descriptor);
  499. tuple["col1"] = "Test";
  500. tuple["col2"] = 42;
  501. EXPECT_EQ(tuple[0], "Test"sv);
  502. EXPECT_EQ(tuple[1], 42);
  503. }
  504. TEST_CASE(serialize_tuple)
  505. {
  506. NonnullRefPtr<SQL::TupleDescriptor> descriptor = adopt_ref(*new SQL::TupleDescriptor);
  507. descriptor->append({ "schema", "table", "col1", SQL::SQLType::Text, SQL::Order::Ascending });
  508. descriptor->append({ "schema", "table", "col2", SQL::SQLType::Integer, SQL::Order::Descending });
  509. SQL::Tuple tuple(descriptor);
  510. tuple["col1"] = "Test";
  511. tuple["col2"] = 42;
  512. EXPECT_EQ(tuple[0], "Test"sv);
  513. EXPECT_EQ(tuple[1], 42);
  514. SQL::Serializer serializer;
  515. serializer.serialize<SQL::Tuple>(tuple);
  516. serializer.rewind();
  517. auto tuple2 = serializer.deserialize<SQL::Tuple>();
  518. EXPECT_EQ(tuple2[0], "Test"sv);
  519. EXPECT_EQ(tuple2[1], 42);
  520. }
  521. TEST_CASE(copy_tuple)
  522. {
  523. NonnullRefPtr<SQL::TupleDescriptor> descriptor = adopt_ref(*new SQL::TupleDescriptor);
  524. descriptor->append({ "schema", "table", "col1", SQL::SQLType::Text, SQL::Order::Ascending });
  525. descriptor->append({ "schema", "table", "col2", SQL::SQLType::Integer, SQL::Order::Descending });
  526. SQL::Tuple tuple(descriptor);
  527. tuple["col1"] = "Test";
  528. tuple["col2"] = 42;
  529. SQL::Tuple copy;
  530. copy = tuple;
  531. EXPECT_EQ(tuple, copy);
  532. SQL::Tuple copy_2(copy);
  533. EXPECT_EQ(tuple, copy_2);
  534. }
  535. TEST_CASE(compare_tuples)
  536. {
  537. NonnullRefPtr<SQL::TupleDescriptor> descriptor = adopt_ref(*new SQL::TupleDescriptor);
  538. descriptor->append({ "schema", "table", "col1", SQL::SQLType::Text, SQL::Order::Ascending });
  539. descriptor->append({ "schema", "table", "col2", SQL::SQLType::Integer, SQL::Order::Descending });
  540. SQL::Tuple tuple1(descriptor);
  541. tuple1["col1"] = "Test";
  542. tuple1["col2"] = 42;
  543. SQL::Tuple tuple2(descriptor);
  544. tuple2["col1"] = "Test";
  545. tuple2["col2"] = 12;
  546. SQL::Tuple tuple3(descriptor);
  547. tuple3["col1"] = "Text";
  548. tuple3["col2"] = 12;
  549. EXPECT(tuple1 <= tuple2);
  550. EXPECT(tuple1 < tuple2);
  551. EXPECT(tuple2 >= tuple1);
  552. EXPECT(tuple2 > tuple1);
  553. EXPECT(tuple1 <= tuple3);
  554. EXPECT(tuple1 < tuple3);
  555. EXPECT(tuple3 >= tuple1);
  556. EXPECT(tuple3 > tuple1);
  557. }
  558. TEST_CASE(add)
  559. {
  560. {
  561. SQL::Value value1 { 21 };
  562. SQL::Value value2 { 42 };
  563. auto result = value1.add(value2);
  564. EXPECT(!result.is_error());
  565. EXPECT_EQ(result.value().type(), SQL::SQLType::Integer);
  566. EXPECT_EQ(result.value(), 63);
  567. }
  568. {
  569. SQL::Value value1 { 21 };
  570. SQL::Value value2 { static_cast<u8>(42) };
  571. auto result = value1.add(value2);
  572. EXPECT(!result.is_error());
  573. EXPECT_EQ(result.value().type(), SQL::SQLType::Integer);
  574. EXPECT_EQ(result.value(), 63);
  575. }
  576. {
  577. SQL::Value value1 { static_cast<u8>(21) };
  578. SQL::Value value2 { 42 };
  579. auto result = value1.add(value2);
  580. EXPECT(!result.is_error());
  581. EXPECT_EQ(result.value().type(), SQL::SQLType::Integer);
  582. EXPECT_EQ(result.value(), 63);
  583. }
  584. {
  585. SQL::Value value1 { static_cast<double>(21) };
  586. SQL::Value value2 { 42 };
  587. auto result = value1.add(value2);
  588. EXPECT(!result.is_error());
  589. EXPECT_EQ(result.value().type(), SQL::SQLType::Integer);
  590. EXPECT_EQ(result.value(), 63);
  591. }
  592. {
  593. SQL::Value value1 { static_cast<double>(21.5) };
  594. SQL::Value value2 { 42 };
  595. auto result = value1.add(value2);
  596. EXPECT(!result.is_error());
  597. EXPECT_EQ(result.value().type(), SQL::SQLType::Float);
  598. EXPECT((result.value().to_double().value() - 63.5) < NumericLimits<double>().epsilon());
  599. }
  600. }
  601. TEST_CASE(add_error)
  602. {
  603. {
  604. // Fails to coerce value2 to the signedness of value1.
  605. SQL::Value value1 { 1 };
  606. SQL::Value value2 { NumericLimits<u64>::max() };
  607. auto result = value1.add(value2);
  608. EXPECT(result.is_error());
  609. EXPECT_EQ(result.error().error(), SQL::SQLErrorCode::IntegerOverflow);
  610. }
  611. {
  612. // Fails to coerce value2 to the signedness of value1.
  613. SQL::Value value1 { static_cast<u64>(1) };
  614. SQL::Value value2 { -1 };
  615. auto result = value1.add(value2);
  616. EXPECT(result.is_error());
  617. EXPECT_EQ(result.error().error(), SQL::SQLErrorCode::IntegerOverflow);
  618. }
  619. {
  620. // The operation itself would overflow.
  621. SQL::Value value1 { static_cast<u64>(1) };
  622. SQL::Value value2 { NumericLimits<u64>::max() };
  623. auto result = value1.add(value2);
  624. EXPECT(result.is_error());
  625. EXPECT_EQ(result.error().error(), SQL::SQLErrorCode::IntegerOverflow);
  626. }
  627. {
  628. // Cannot convert value to a number.
  629. SQL::Value value1 { 1 };
  630. SQL::Value value2 { "foo"sv };
  631. auto result = value1.add(value2);
  632. EXPECT(result.is_error());
  633. EXPECT_EQ(result.error().error(), SQL::SQLErrorCode::NumericOperatorTypeMismatch);
  634. }
  635. }
  636. TEST_CASE(subtract)
  637. {
  638. {
  639. SQL::Value value1 { 21 };
  640. SQL::Value value2 { 42 };
  641. auto result = value1.subtract(value2);
  642. EXPECT(!result.is_error());
  643. EXPECT_EQ(result.value().type(), SQL::SQLType::Integer);
  644. EXPECT_EQ(result.value(), -21);
  645. }
  646. {
  647. SQL::Value value1 { 21 };
  648. SQL::Value value2 { static_cast<u8>(42) };
  649. auto result = value1.subtract(value2);
  650. EXPECT(!result.is_error());
  651. EXPECT_EQ(result.value().type(), SQL::SQLType::Integer);
  652. EXPECT_EQ(result.value(), -21);
  653. }
  654. {
  655. SQL::Value value1 { static_cast<u8>(42) };
  656. SQL::Value value2 { 21 };
  657. auto result = value1.subtract(value2);
  658. EXPECT(!result.is_error());
  659. EXPECT_EQ(result.value().type(), SQL::SQLType::Integer);
  660. EXPECT_EQ(result.value(), 21);
  661. }
  662. {
  663. SQL::Value value1 { static_cast<double>(21) };
  664. SQL::Value value2 { 42 };
  665. auto result = value1.subtract(value2);
  666. EXPECT(!result.is_error());
  667. EXPECT_EQ(result.value().type(), SQL::SQLType::Integer);
  668. EXPECT_EQ(result.value(), -21);
  669. }
  670. {
  671. SQL::Value value1 { static_cast<double>(21.5) };
  672. SQL::Value value2 { 42 };
  673. auto result = value1.subtract(value2);
  674. EXPECT(!result.is_error());
  675. EXPECT_EQ(result.value().type(), SQL::SQLType::Float);
  676. EXPECT((result.value().to_double().value() - 20.5) < NumericLimits<double>().epsilon());
  677. }
  678. }
  679. TEST_CASE(subtract_error)
  680. {
  681. {
  682. // Fails to coerce value2 to the signedness of value1.
  683. SQL::Value value1 { 1 };
  684. SQL::Value value2 { NumericLimits<u64>::max() };
  685. auto result = value1.subtract(value2);
  686. EXPECT(result.is_error());
  687. EXPECT_EQ(result.error().error(), SQL::SQLErrorCode::IntegerOverflow);
  688. }
  689. {
  690. // Fails to coerce value2 to the signedness of value1.
  691. SQL::Value value1 { static_cast<u64>(1) };
  692. SQL::Value value2 { -1 };
  693. auto result = value1.subtract(value2);
  694. EXPECT(result.is_error());
  695. EXPECT_EQ(result.error().error(), SQL::SQLErrorCode::IntegerOverflow);
  696. }
  697. {
  698. // The operation itself would overflow.
  699. SQL::Value value1 { static_cast<u64>(0) };
  700. SQL::Value value2 { static_cast<u64>(1) };
  701. auto result = value1.subtract(value2);
  702. EXPECT(result.is_error());
  703. EXPECT_EQ(result.error().error(), SQL::SQLErrorCode::IntegerOverflow);
  704. }
  705. {
  706. // Cannot convert value to a number.
  707. SQL::Value value1 { 1 };
  708. SQL::Value value2 { "foo"sv };
  709. auto result = value1.subtract(value2);
  710. EXPECT(result.is_error());
  711. EXPECT_EQ(result.error().error(), SQL::SQLErrorCode::NumericOperatorTypeMismatch);
  712. }
  713. }
  714. TEST_CASE(multiply)
  715. {
  716. {
  717. SQL::Value value1 { 2 };
  718. SQL::Value value2 { 21 };
  719. auto result = value1.multiply(value2);
  720. EXPECT(!result.is_error());
  721. EXPECT_EQ(result.value().type(), SQL::SQLType::Integer);
  722. EXPECT_EQ(result.value(), 42);
  723. }
  724. {
  725. SQL::Value value1 { 2 };
  726. SQL::Value value2 { static_cast<u8>(21) };
  727. auto result = value1.multiply(value2);
  728. EXPECT(!result.is_error());
  729. EXPECT_EQ(result.value().type(), SQL::SQLType::Integer);
  730. EXPECT_EQ(result.value(), 42);
  731. }
  732. {
  733. SQL::Value value1 { static_cast<u8>(2) };
  734. SQL::Value value2 { 21 };
  735. auto result = value1.multiply(value2);
  736. EXPECT(!result.is_error());
  737. EXPECT_EQ(result.value().type(), SQL::SQLType::Integer);
  738. EXPECT_EQ(result.value(), 42);
  739. }
  740. {
  741. SQL::Value value1 { static_cast<double>(2) };
  742. SQL::Value value2 { 21 };
  743. auto result = value1.multiply(value2);
  744. EXPECT(!result.is_error());
  745. EXPECT_EQ(result.value().type(), SQL::SQLType::Integer);
  746. EXPECT_EQ(result.value(), 42);
  747. }
  748. {
  749. SQL::Value value1 { static_cast<double>(2.5) };
  750. SQL::Value value2 { 21 };
  751. auto result = value1.multiply(value2);
  752. EXPECT(!result.is_error());
  753. EXPECT_EQ(result.value().type(), SQL::SQLType::Float);
  754. EXPECT((result.value().to_double().value() - 52.5) < NumericLimits<double>().epsilon());
  755. }
  756. }
  757. TEST_CASE(multiply_error)
  758. {
  759. {
  760. // Fails to coerce value2 to the signedness of value1.
  761. SQL::Value value1 { 1 };
  762. SQL::Value value2 { NumericLimits<u64>::max() };
  763. auto result = value1.multiply(value2);
  764. EXPECT(result.is_error());
  765. EXPECT_EQ(result.error().error(), SQL::SQLErrorCode::IntegerOverflow);
  766. }
  767. {
  768. // Fails to coerce value2 to the signedness of value1.
  769. SQL::Value value1 { static_cast<u64>(1) };
  770. SQL::Value value2 { -1 };
  771. auto result = value1.multiply(value2);
  772. EXPECT(result.is_error());
  773. EXPECT_EQ(result.error().error(), SQL::SQLErrorCode::IntegerOverflow);
  774. }
  775. {
  776. // The operation itself would overflow.
  777. SQL::Value value1 { NumericLimits<i64>::max() };
  778. SQL::Value value2 { 2 };
  779. auto result = value1.multiply(value2);
  780. EXPECT(result.is_error());
  781. EXPECT_EQ(result.error().error(), SQL::SQLErrorCode::IntegerOverflow);
  782. }
  783. {
  784. // Cannot convert value to a number.
  785. SQL::Value value1 { 1 };
  786. SQL::Value value2 { "foo"sv };
  787. auto result = value1.multiply(value2);
  788. EXPECT(result.is_error());
  789. EXPECT_EQ(result.error().error(), SQL::SQLErrorCode::NumericOperatorTypeMismatch);
  790. }
  791. }
  792. TEST_CASE(divide)
  793. {
  794. {
  795. SQL::Value value1 { 42 };
  796. SQL::Value value2 { -2 };
  797. auto result = value1.divide(value2);
  798. EXPECT(!result.is_error());
  799. EXPECT_EQ(result.value().type(), SQL::SQLType::Integer);
  800. EXPECT_EQ(result.value(), -21);
  801. }
  802. {
  803. SQL::Value value1 { 42 };
  804. SQL::Value value2 { static_cast<u8>(2) };
  805. auto result = value1.divide(value2);
  806. EXPECT(!result.is_error());
  807. EXPECT_EQ(result.value().type(), SQL::SQLType::Integer);
  808. EXPECT_EQ(result.value(), 21);
  809. }
  810. {
  811. SQL::Value value1 { static_cast<u8>(42) };
  812. SQL::Value value2 { 2 };
  813. auto result = value1.divide(value2);
  814. EXPECT(!result.is_error());
  815. EXPECT_EQ(result.value().type(), SQL::SQLType::Integer);
  816. EXPECT_EQ(result.value(), 21);
  817. }
  818. {
  819. SQL::Value value1 { static_cast<double>(42) };
  820. SQL::Value value2 { 2 };
  821. auto result = value1.divide(value2);
  822. EXPECT(!result.is_error());
  823. EXPECT_EQ(result.value().type(), SQL::SQLType::Integer);
  824. EXPECT_EQ(result.value(), 21);
  825. }
  826. {
  827. SQL::Value value1 { static_cast<double>(43) };
  828. SQL::Value value2 { 2 };
  829. auto result = value1.divide(value2);
  830. EXPECT(!result.is_error());
  831. EXPECT_EQ(result.value().type(), SQL::SQLType::Float);
  832. EXPECT((result.value().to_double().value() - 21.5) < NumericLimits<double>().epsilon());
  833. }
  834. }
  835. TEST_CASE(divide_error)
  836. {
  837. {
  838. // The operation itself would overflow.
  839. SQL::Value value1 { 1 };
  840. SQL::Value value2 { 0 };
  841. auto result = value1.divide(value2);
  842. EXPECT(result.is_error());
  843. EXPECT_EQ(result.error().error(), SQL::SQLErrorCode::IntegerOverflow);
  844. }
  845. {
  846. // Cannot convert value to a number.
  847. SQL::Value value1 { 1 };
  848. SQL::Value value2 { "foo"sv };
  849. auto result = value1.divide(value2);
  850. EXPECT(result.is_error());
  851. EXPECT_EQ(result.error().error(), SQL::SQLErrorCode::NumericOperatorTypeMismatch);
  852. }
  853. }
  854. TEST_CASE(modulo)
  855. {
  856. {
  857. SQL::Value value1 { 21 };
  858. SQL::Value value2 { 2 };
  859. auto result = value1.modulo(value2);
  860. EXPECT(!result.is_error());
  861. EXPECT_EQ(result.value().type(), SQL::SQLType::Integer);
  862. EXPECT_EQ(result.value(), 1);
  863. }
  864. {
  865. SQL::Value value1 { 21 };
  866. SQL::Value value2 { static_cast<u8>(2) };
  867. auto result = value1.modulo(value2);
  868. EXPECT(!result.is_error());
  869. EXPECT_EQ(result.value().type(), SQL::SQLType::Integer);
  870. EXPECT_EQ(result.value(), 1);
  871. }
  872. {
  873. SQL::Value value1 { static_cast<u8>(21) };
  874. SQL::Value value2 { 2 };
  875. auto result = value1.modulo(value2);
  876. EXPECT(!result.is_error());
  877. EXPECT_EQ(result.value().type(), SQL::SQLType::Integer);
  878. EXPECT_EQ(result.value(), 1);
  879. }
  880. {
  881. SQL::Value value1 { static_cast<double>(21) };
  882. SQL::Value value2 { 2 };
  883. auto result = value1.modulo(value2);
  884. EXPECT(!result.is_error());
  885. EXPECT_EQ(result.value().type(), SQL::SQLType::Integer);
  886. EXPECT_EQ(result.value(), 1);
  887. }
  888. }
  889. TEST_CASE(modulo_error)
  890. {
  891. {
  892. // Fails to coerce value2 to the signedness of value1.
  893. SQL::Value value1 { 1 };
  894. SQL::Value value2 { NumericLimits<u64>::max() };
  895. auto result = value1.modulo(value2);
  896. EXPECT(result.is_error());
  897. EXPECT_EQ(result.error().error(), SQL::SQLErrorCode::IntegerOverflow);
  898. }
  899. {
  900. // Fails to coerce value2 to the signedness of value1.
  901. SQL::Value value1 { static_cast<u64>(1) };
  902. SQL::Value value2 { -1 };
  903. auto result = value1.modulo(value2);
  904. EXPECT(result.is_error());
  905. EXPECT_EQ(result.error().error(), SQL::SQLErrorCode::IntegerOverflow);
  906. }
  907. {
  908. // The operation itself would overflow.
  909. SQL::Value value1 { 21 };
  910. SQL::Value value2 { 0 };
  911. auto result = value1.modulo(value2);
  912. EXPECT(result.is_error());
  913. EXPECT_EQ(result.error().error(), SQL::SQLErrorCode::IntegerOverflow);
  914. }
  915. {
  916. // Cannot convert value to an integer.
  917. SQL::Value value1 { 1 };
  918. SQL::Value value2 { "foo"sv };
  919. auto result = value1.modulo(value2);
  920. EXPECT(result.is_error());
  921. EXPECT_EQ(result.error().error(), SQL::SQLErrorCode::NumericOperatorTypeMismatch);
  922. }
  923. {
  924. // Cannot convert value to an integer.
  925. SQL::Value value1 { static_cast<double>(21.5) };
  926. SQL::Value value2 { 2 };
  927. auto result = value1.modulo(value2);
  928. EXPECT(result.is_error());
  929. EXPECT_EQ(result.error().error(), SQL::SQLErrorCode::NumericOperatorTypeMismatch);
  930. }
  931. }
  932. TEST_CASE(shift_left)
  933. {
  934. {
  935. SQL::Value value1 { 0b0011'0000 };
  936. SQL::Value value2 { 2 };
  937. auto result = value1.shift_left(value2);
  938. EXPECT(!result.is_error());
  939. EXPECT_EQ(result.value().type(), SQL::SQLType::Integer);
  940. EXPECT_EQ(result.value(), 0b1100'0000);
  941. }
  942. {
  943. SQL::Value value1 { 0b0011'0000 };
  944. SQL::Value value2 { static_cast<u8>(2) };
  945. auto result = value1.shift_left(value2);
  946. EXPECT(!result.is_error());
  947. EXPECT_EQ(result.value().type(), SQL::SQLType::Integer);
  948. EXPECT_EQ(result.value(), 0b1100'0000);
  949. }
  950. {
  951. SQL::Value value1 { static_cast<u8>(0b0011'0000) };
  952. SQL::Value value2 { 2 };
  953. auto result = value1.shift_left(value2);
  954. EXPECT(!result.is_error());
  955. EXPECT_EQ(result.value().type(), SQL::SQLType::Integer);
  956. EXPECT_EQ(result.value(), 0b1100'0000);
  957. }
  958. {
  959. SQL::Value value1 { static_cast<double>(0b0011'0000) };
  960. SQL::Value value2 { 2 };
  961. auto result = value1.shift_left(value2);
  962. EXPECT(!result.is_error());
  963. EXPECT_EQ(result.value().type(), SQL::SQLType::Integer);
  964. EXPECT_EQ(result.value(), 0b1100'0000);
  965. }
  966. }
  967. TEST_CASE(shift_left_error)
  968. {
  969. {
  970. // Fails to coerce value2 to the signedness of value1.
  971. SQL::Value value1 { 1 };
  972. SQL::Value value2 { NumericLimits<u64>::max() };
  973. auto result = value1.shift_left(value2);
  974. EXPECT(result.is_error());
  975. EXPECT_EQ(result.error().error(), SQL::SQLErrorCode::IntegerOverflow);
  976. }
  977. {
  978. // Fails to coerce value2 to the signedness of value1.
  979. SQL::Value value1 { static_cast<u64>(1) };
  980. SQL::Value value2 { -1 };
  981. auto result = value1.shift_left(value2);
  982. EXPECT(result.is_error());
  983. EXPECT_EQ(result.error().error(), SQL::SQLErrorCode::IntegerOverflow);
  984. }
  985. {
  986. // The operation itself would overflow.
  987. SQL::Value value1 { 21 };
  988. SQL::Value value2 { -1 };
  989. auto result = value1.shift_left(value2);
  990. EXPECT(result.is_error());
  991. EXPECT_EQ(result.error().error(), SQL::SQLErrorCode::IntegerOverflow);
  992. }
  993. {
  994. // The operation itself would overflow.
  995. SQL::Value value1 { 21 };
  996. SQL::Value value2 { 64 };
  997. auto result = value1.shift_left(value2);
  998. EXPECT(result.is_error());
  999. EXPECT_EQ(result.error().error(), SQL::SQLErrorCode::IntegerOverflow);
  1000. }
  1001. {
  1002. // Cannot convert value to an integer.
  1003. SQL::Value value1 { 1 };
  1004. SQL::Value value2 { "foo"sv };
  1005. auto result = value1.shift_left(value2);
  1006. EXPECT(result.is_error());
  1007. EXPECT_EQ(result.error().error(), SQL::SQLErrorCode::NumericOperatorTypeMismatch);
  1008. }
  1009. {
  1010. // Cannot convert value to an integer.
  1011. SQL::Value value1 { static_cast<double>(21.5) };
  1012. SQL::Value value2 { 2 };
  1013. auto result = value1.shift_left(value2);
  1014. EXPECT(result.is_error());
  1015. EXPECT_EQ(result.error().error(), SQL::SQLErrorCode::NumericOperatorTypeMismatch);
  1016. }
  1017. }
  1018. TEST_CASE(shift_right)
  1019. {
  1020. {
  1021. SQL::Value value1 { 0b0011'0000 };
  1022. SQL::Value value2 { 2 };
  1023. auto result = value1.shift_right(value2);
  1024. EXPECT(!result.is_error());
  1025. EXPECT_EQ(result.value().type(), SQL::SQLType::Integer);
  1026. EXPECT_EQ(result.value(), 0b0000'1100);
  1027. }
  1028. {
  1029. SQL::Value value1 { 0b0011'0000 };
  1030. SQL::Value value2 { static_cast<u8>(2) };
  1031. auto result = value1.shift_right(value2);
  1032. EXPECT(!result.is_error());
  1033. EXPECT_EQ(result.value().type(), SQL::SQLType::Integer);
  1034. EXPECT_EQ(result.value(), 0b0000'1100);
  1035. }
  1036. {
  1037. SQL::Value value1 { static_cast<u8>(0b0011'0000) };
  1038. SQL::Value value2 { 2 };
  1039. auto result = value1.shift_right(value2);
  1040. EXPECT(!result.is_error());
  1041. EXPECT_EQ(result.value().type(), SQL::SQLType::Integer);
  1042. EXPECT_EQ(result.value(), 0b0000'1100);
  1043. }
  1044. {
  1045. SQL::Value value1 { static_cast<double>(0b0011'0000) };
  1046. SQL::Value value2 { 2 };
  1047. auto result = value1.shift_right(value2);
  1048. EXPECT(!result.is_error());
  1049. EXPECT_EQ(result.value().type(), SQL::SQLType::Integer);
  1050. EXPECT_EQ(result.value(), 0b0000'1100);
  1051. }
  1052. }
  1053. TEST_CASE(shift_right_error)
  1054. {
  1055. {
  1056. // Fails to coerce value2 to the signedness of value1.
  1057. SQL::Value value1 { 1 };
  1058. SQL::Value value2 { NumericLimits<u64>::max() };
  1059. auto result = value1.shift_right(value2);
  1060. EXPECT(result.is_error());
  1061. EXPECT_EQ(result.error().error(), SQL::SQLErrorCode::IntegerOverflow);
  1062. }
  1063. {
  1064. // Fails to coerce value2 to the signedness of value1.
  1065. SQL::Value value1 { static_cast<u64>(1) };
  1066. SQL::Value value2 { -1 };
  1067. auto result = value1.shift_right(value2);
  1068. EXPECT(result.is_error());
  1069. EXPECT_EQ(result.error().error(), SQL::SQLErrorCode::IntegerOverflow);
  1070. }
  1071. {
  1072. // The operation itself would overflow.
  1073. SQL::Value value1 { 21 };
  1074. SQL::Value value2 { -1 };
  1075. auto result = value1.shift_right(value2);
  1076. EXPECT(result.is_error());
  1077. EXPECT_EQ(result.error().error(), SQL::SQLErrorCode::IntegerOverflow);
  1078. }
  1079. {
  1080. // The operation itself would overflow.
  1081. SQL::Value value1 { 21 };
  1082. SQL::Value value2 { 64 };
  1083. auto result = value1.shift_right(value2);
  1084. EXPECT(result.is_error());
  1085. EXPECT_EQ(result.error().error(), SQL::SQLErrorCode::IntegerOverflow);
  1086. }
  1087. {
  1088. // Cannot convert value to an integer.
  1089. SQL::Value value1 { 1 };
  1090. SQL::Value value2 { "foo"sv };
  1091. auto result = value1.shift_right(value2);
  1092. EXPECT(result.is_error());
  1093. EXPECT_EQ(result.error().error(), SQL::SQLErrorCode::NumericOperatorTypeMismatch);
  1094. }
  1095. {
  1096. // Cannot convert value to an integer.
  1097. SQL::Value value1 { static_cast<double>(21.5) };
  1098. SQL::Value value2 { 2 };
  1099. auto result = value1.shift_right(value2);
  1100. EXPECT(result.is_error());
  1101. EXPECT_EQ(result.error().error(), SQL::SQLErrorCode::NumericOperatorTypeMismatch);
  1102. }
  1103. }