17#include <gtest/gtest.h>
41 EXPECT_EQ(dialect_->placeholder(1),
"$1");
42 EXPECT_EQ(dialect_->placeholder(2),
"$2");
43 EXPECT_EQ(dialect_->placeholder(10),
"$10");
44 EXPECT_EQ(dialect_->placeholder(100),
"$100");
49 EXPECT_EQ(dialect_->quote_identifier(
"users"),
"\"users\"");
50 EXPECT_EQ(dialect_->quote_identifier(
"user_name"),
"\"user_name\"");
51 EXPECT_EQ(dialect_->quote_identifier(
"SELECT"),
"\"SELECT\"");
57 EXPECT_EQ(dialect_->quote_identifier(
"user\"name"),
"\"user\"\"name\"");
62 EXPECT_EQ(dialect_->escape_string(
"hello"),
"hello");
63 EXPECT_EQ(dialect_->escape_string(
"it's"),
"it''s");
64 EXPECT_EQ(dialect_->escape_string(
"back\\slash"),
"back\\\\slash");
65 EXPECT_EQ(dialect_->escape_string(
"O'Brien's"),
"O''Brien''s");
70 EXPECT_EQ(dialect_->returning_clause(
"id"),
" RETURNING \"id\"");
71 EXPECT_EQ(dialect_->returning_clause(
""),
" RETURNING *");
76 std::vector<std::string> conflict_cols = {
"id"};
77 std::vector<std::string> update_cols = {
"name",
"email"};
79 std::string result = dialect_->upsert_clause(conflict_cols, update_cols);
81 EXPECT_TRUE(result.find(
"ON CONFLICT") != std::string::npos);
82 EXPECT_TRUE(result.find(
"\"id\"") != std::string::npos);
83 EXPECT_TRUE(result.find(
"DO UPDATE SET") != std::string::npos);
84 EXPECT_TRUE(result.find(
"EXCLUDED") != std::string::npos);
89 std::vector<std::string> conflict_cols = {
"id"};
90 std::vector<std::string> update_cols;
92 std::string result = dialect_->upsert_clause(conflict_cols, update_cols);
94 EXPECT_TRUE(result.find(
"DO NOTHING") != std::string::npos);
99 std::vector<std::string> conflict_cols = {
"tenant_id",
"user_id"};
100 std::vector<std::string> update_cols = {
"updated_at"};
102 std::string result = dialect_->upsert_clause(conflict_cols, update_cols);
104 EXPECT_TRUE(result.find(
"\"tenant_id\"") != std::string::npos);
105 EXPECT_TRUE(result.find(
"\"user_id\"") != std::string::npos);
110 EXPECT_TRUE(dialect_->supports_feature(
"returning"));
111 EXPECT_TRUE(dialect_->supports_feature(
"upsert"));
112 EXPECT_TRUE(dialect_->supports_feature(
"full_outer_join"));
133 EXPECT_EQ(dialect_->placeholder(1),
"?1");
134 EXPECT_EQ(dialect_->placeholder(2),
"?2");
135 EXPECT_EQ(dialect_->placeholder(10),
"?10");
140 EXPECT_EQ(dialect_->quote_identifier(
"users"),
"\"users\"");
141 EXPECT_EQ(dialect_->quote_identifier(
"user_name"),
"\"user_name\"");
142 EXPECT_EQ(dialect_->quote_identifier(
"SELECT"),
"\"SELECT\"");
148 EXPECT_EQ(dialect_->quote_identifier(
"user\"name"),
"\"user\"\"name\"");
153 EXPECT_EQ(dialect_->escape_string(
"hello"),
"hello");
154 EXPECT_EQ(dialect_->escape_string(
"it's"),
"it''s");
155 EXPECT_EQ(dialect_->escape_string(
"O'Brien's"),
"O''Brien''s");
161 EXPECT_EQ(dialect_->returning_clause(
"id"),
" RETURNING \"id\"");
162 EXPECT_EQ(dialect_->returning_clause(
""),
" RETURNING *");
167 std::vector<std::string> conflict_cols = {
"id"};
168 std::vector<std::string> update_cols = {
"name",
"email"};
170 std::string result = dialect_->upsert_clause(conflict_cols, update_cols);
172 EXPECT_TRUE(result.find(
"ON CONFLICT") != std::string::npos);
173 EXPECT_TRUE(result.find(
"\"id\"") != std::string::npos);
174 EXPECT_TRUE(result.find(
"DO UPDATE SET") != std::string::npos);
175 EXPECT_TRUE(result.find(
"excluded") != std::string::npos);
180 std::vector<std::string> conflict_cols = {
"id"};
181 std::vector<std::string> update_cols;
183 std::string result = dialect_->upsert_clause(conflict_cols, update_cols);
185 EXPECT_TRUE(result.find(
"DO NOTHING") != std::string::npos);
190 EXPECT_TRUE(dialect_->supports_feature(
"returning"));
191 EXPECT_TRUE(dialect_->supports_feature(
"upsert"));
192 EXPECT_FALSE(dialect_->supports_feature(
"full_outer_join"));
197 EXPECT_EQ(dialect_->limit_clause(10, 0),
"LIMIT 10");
198 EXPECT_EQ(dialect_->limit_clause(10, 20),
"LIMIT 10 OFFSET 20");
205TEST(SqlDialectFactoryTest, CreatePostgreSQLDialect)
208 ASSERT_NE(dialect,
nullptr);
209 EXPECT_EQ(dialect->placeholder(1),
"$1");
212TEST(SqlDialectFactoryTest, CreateSQLiteDialect)
215 ASSERT_NE(dialect,
nullptr);
216 EXPECT_EQ(dialect->placeholder(1),
"?1");
219TEST(SqlDialectFactoryTest, CreateUnsupportedDialectThrows)
223 std::invalid_argument
227 std::invalid_argument
251 EXPECT_NE(postgres_->placeholder(1), sqlite_->placeholder(1));
256 std::string col =
"user_id";
259 EXPECT_EQ(postgres_->quote_identifier(col),
"\"user_id\"");
260 EXPECT_EQ(sqlite_->quote_identifier(col),
"\"user_id\"");
266 EXPECT_EQ(postgres_->concat_operator(),
"||");
267 EXPECT_EQ(sqlite_->concat_operator(),
"||");
272 EXPECT_EQ(postgres_->auto_increment(),
"SERIAL");
273 EXPECT_EQ(sqlite_->auto_increment(),
"AUTOINCREMENT");
278 EXPECT_EQ(postgres_->current_timestamp(),
"CURRENT_TIMESTAMP");
279 EXPECT_EQ(sqlite_->current_timestamp(),
"CURRENT_TIMESTAMP");
static std::unique_ptr< sql_dialect > create(database_types type)
Factory method to create appropriate dialect.
std::unique_ptr< sql_dialect > postgres_
std::unique_ptr< sql_dialect > sqlite_
std::unique_ptr< sql_dialect > dialect_
std::unique_ptr< sql_dialect > dialect_
TEST_F(PostgreSQLDialectTest, PlaceholderStyle)
@ mongodb
Indicates a MongoDB database (future implementation).
@ sqlite
Indicates a SQLite database.
@ redis
Indicates a Redis database (future implementation).
@ postgres
Indicates a PostgreSQL database.