1 /* 2 * Copyright (C) 2009 - 2011 Vivien Malerba <malerba@gnome-db.org> 3 * Copyright (C) 2011 Murray Cumming <murrayc@murrayc.com> 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU General Public License 7 * as published by the Free Software Foundation; either version 2 8 * of the License, or (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 18 */ 19 20 #include <string.h> 21 #include <libgda/libgda.h> 22 23 typedef struct { 24 gchar *provider; 25 gchar *sql_identifier; 26 gchar *result1; /* for_meta_store=>FALSE force_quotes=>FALSE */ 27 gchar *result2; /* for_meta_store=>TRUE force_quotes=>FALSE */ 28 gchar *result3; /* for_meta_store=>FALSE force_quotes=>TRUE */ 29 gchar *result4; /* for_meta_store=>TRUE force_quotes=>TRUE */ 30 } ATest; 31 32 ATest tests[] = { 33 /* generic SQL rules */ 34 {NULL, "\"double word\"", "\"double word\"", "\"double word\"", "\"double word\"", "\"double word\""}, 35 {NULL, "\"CapitalTest\"", "\"CapitalTest\"", "\"CapitalTest\"", "\"CapitalTest\"", "\"CapitalTest\""}, 36 {NULL, "CapitalTest", "CapitalTest", "capitaltest", "\"CapitalTest\"", "\"CapitalTest\""}, 37 {NULL, "\"mytable\"", "\"mytable\"", "mytable", "\"mytable\"", "mytable"}, 38 {NULL, "mytable", "mytable", "mytable", "\"mytable\"", "mytable"}, 39 {NULL, "MYTABLE", "MYTABLE", "mytable", "\"MYTABLE\"", "\"MYTABLE\""}, 40 {NULL, "\"MYTABLE\"", "\"MYTABLE\"", "\"MYTABLE\"", "\"MYTABLE\"", "\"MYTABLE\""}, 41 {NULL, "desc", "\"desc\"", "\"desc\"", "\"desc\"", "\"desc\""}, 42 {NULL, "\"desc\"", "\"desc\"", "\"desc\"", "\"desc\"", "\"desc\""}, 43 {NULL, "5ive", "\"5ive\"", "\"5ive\"", "\"5ive\"", "\"5ive\""}, 44 {NULL, "\"5ive\"", "\"5ive\"", "\"5ive\"", "\"5ive\"", "\"5ive\""}, 45 46 {"PostgreSQL", "\"double word\"", "\"double word\"", "\"double word\"", "\"double word\"", "\"double word\""}, 47 {"PostgreSQL", "\"CapitalTest\"", "\"CapitalTest\"", "\"CapitalTest\"", "\"CapitalTest\"", "\"CapitalTest\""}, 48 {"PostgreSQL", "CapitalTest", "CapitalTest", "capitaltest", "\"CapitalTest\"", "\"CapitalTest\""}, 49 {"PostgreSQL", "\"mytable\"", "\"mytable\"", "mytable", "\"mytable\"", "mytable"}, 50 {"PostgreSQL", "mytable", "mytable", "mytable", "\"mytable\"", "mytable"}, 51 {"PostgreSQL", "MYTABLE", "MYTABLE", "mytable", "\"MYTABLE\"", "\"MYTABLE\""}, 52 {"PostgreSQL", "\"MYTABLE\"", "\"MYTABLE\"", "\"MYTABLE\"", "\"MYTABLE\"", "\"MYTABLE\""}, 53 {"PostgreSQL", "desc", "\"desc\"", "\"desc\"", "\"desc\"", "\"desc\""}, 54 {"PostgreSQL", "5ive", "\"5ive\"", "\"5ive\"", "\"5ive\"", "\"5ive\""}, 55 {"PostgreSQL", "\"5ive\"", "\"5ive\"", "\"5ive\"", "\"5ive\"", "\"5ive\""}, 56 57 /* case insensitive MySQL */ 58 {"iMySQL", "\"double word\"", "`double word`", "\"double word\"", "`double word`", "\"double word\""}, 59 {"iMySQL", "\"CapitalTest\"", "`CapitalTest`", "capitaltest", "`CapitalTest`", "capitaltest"}, 60 {"iMySQL", "`CapitalTest`", "`CapitalTest`", "capitaltest", "`CapitalTest`", "capitaltest"}, 61 {"iMySQL", "CapitalTest", "CapitalTest", "capitaltest", "`CapitalTest`", "capitaltest"}, 62 {"iMySQL", "\"mytable\"", "`mytable`", "mytable", "`mytable`", "mytable"}, 63 {"iMySQL", "`mytable`", "`mytable`", "mytable", "`mytable`", "mytable"}, 64 {"iMySQL", "mytable", "mytable", "mytable", "`mytable`", "mytable"}, 65 {"iMySQL", "MYTABLE", "MYTABLE", "mytable", "`MYTABLE`", "mytable"}, 66 {"iMySQL", "\"MYTABLE\"", "`MYTABLE`", "mytable", "`MYTABLE`", "mytable"}, 67 {"iMySQL", "`MYTABLE`", "`MYTABLE`", "mytable", "`MYTABLE`", "mytable"}, 68 {"iMySQL", "desc", "`desc`", "\"desc\"", "`desc`", "\"desc\""}, 69 {"iMySQL", "`desc`", "`desc`", "\"desc\"", "`desc`", "\"desc\""}, 70 {"iMySQL", "5ive", "`5ive`", "\"5ive\"", "`5ive`", "\"5ive\""}, 71 {"iMySQL", "\"5ive\"", "`5ive`", "\"5ive\"", "`5ive`", "\"5ive\""}, 72 {"iMySQL", "`5ive`", "`5ive`", "\"5ive\"", "`5ive`", "\"5ive\""}, 73 74 /* case sensitive MySQL */ 75 {"sMySQL", "\"double word\"", "`double word`", "\"double word\"", "`double word`", "\"double word\""}, 76 {"sMySQL", "\"CapitalTest\"", "`CapitalTest`", "\"CapitalTest\"", "`CapitalTest`", "\"CapitalTest\""}, 77 {"sMySQL", "`CapitalTest`", "`CapitalTest`", "\"CapitalTest\"", "`CapitalTest`", "\"CapitalTest\""}, 78 {"sMySQL", "CapitalTest", "`CapitalTest`", "\"CapitalTest\"", "`CapitalTest`", "\"CapitalTest\""}, 79 {"sMySQL", "\"mytable\"", "`mytable`", "mytable", "`mytable`", "mytable"}, 80 {"sMySQL", "`mytable`", "`mytable`", "mytable", "`mytable`", "mytable"}, 81 {"sMySQL", "mytable", "`mytable`", "mytable", "`mytable`", "mytable"}, 82 {"sMySQL", "MYTABLE", "`MYTABLE`", "\"MYTABLE\"", "`MYTABLE`", "\"MYTABLE\""}, 83 {"sMySQL", "\"MYTABLE\"", "`MYTABLE`", "\"MYTABLE\"", "`MYTABLE`", "\"MYTABLE\""}, 84 {"sMySQL", "`MYTABLE`", "`MYTABLE`", "\"MYTABLE\"", "`MYTABLE`", "\"MYTABLE\""}, 85 {"sMySQL", "desc", "`desc`", "\"desc\"", "`desc`", "\"desc\""}, 86 {"sMySQL", "`desc`", "`desc`", "\"desc\"", "`desc`", "\"desc\""}, 87 {"sMySQL", "5ive", "`5ive`", "\"5ive\"", "`5ive`", "\"5ive\""}, 88 {"sMySQL", "\"5ive\"", "`5ive`", "\"5ive\"", "`5ive`", "\"5ive\""}, 89 {"sMySQL", "`5ive`", "`5ive`", "\"5ive\"", "`5ive`", "\"5ive\""}, 90 91 {"SQLite", "\"double word\"", "\"double word\"", "\"double word\"", "\"double word\"", "\"double word\""}, 92 {"SQLite", "[double word]", "\"double word\"", "\"double word\"", "\"double word\"", "\"double word\""}, 93 {"SQLite", "\"CapitalTest\"", "\"CapitalTest\"", "capitaltest", "\"CapitalTest\"", "capitaltest"}, 94 {"SQLite", "`CapitalTest`", "\"CapitalTest\"", "capitaltest", "\"CapitalTest\"", "capitaltest"}, 95 {"SQLite", "[CapitalTest]", "\"CapitalTest\"", "capitaltest", "\"CapitalTest\"", "capitaltest"}, 96 {"SQLite", "CapitalTest", "CapitalTest", "capitaltest", "\"CapitalTest\"", "capitaltest"}, 97 {"SQLite", "\"mytable\"", "\"mytable\"", "mytable", "\"mytable\"", "mytable"}, 98 {"SQLite", "[mytable]", "\"mytable\"", "mytable", "\"mytable\"", "mytable"}, 99 {"SQLite", "`mytable`", "\"mytable\"", "mytable", "\"mytable\"", "mytable"}, 100 {"SQLite", "mytable", "mytable", "mytable", "\"mytable\"", "mytable"}, 101 {"SQLite", "MYTABLE", "MYTABLE", "mytable", "\"MYTABLE\"", "mytable"}, 102 {"SQLite", "\"MYTABLE\"", "\"MYTABLE\"", "mytable", "\"MYTABLE\"", "mytable"}, 103 {"SQLite", "[MYTABLE]", "\"MYTABLE\"", "mytable", "\"MYTABLE\"", "mytable"}, 104 {"SQLite", "`MYTABLE`", "\"MYTABLE\"", "mytable", "\"MYTABLE\"", "mytable"}, 105 {"SQLite", "desc", "\"desc\"", "\"desc\"", "\"desc\"", "\"desc\""}, 106 {"SQLite", "[desc]", "\"desc\"", "\"desc\"", "\"desc\"", "\"desc\""}, 107 {"SQLite", "`desc`", "\"desc\"", "\"desc\"", "\"desc\"", "\"desc\""}, 108 {"SQLite", "5ive", "\"5ive\"", "\"5ive\"", "\"5ive\"", "\"5ive\""}, 109 {"SQLite", "\"5ive\"", "\"5ive\"", "\"5ive\"", "\"5ive\"", "\"5ive\""}, 110 {"SQLite", "[5ive]", "\"5ive\"", "\"5ive\"", "\"5ive\"", "\"5ive\""}, 111 {"SQLite", "`5ive`", "\"5ive\"", "\"5ive\"", "\"5ive\"", "\"5ive\""}, 112 113 {"Oracle", "\"double word\"", "\"double word\"", "\"double word\"", "\"double word\"", "\"double word\""}, 114 {"Oracle", "\"CapitalTest\"", "\"CapitalTest\"", "\"CapitalTest\"", "\"CapitalTest\"", "\"CapitalTest\""}, 115 {"Oracle", "CapitalTest", "CapitalTest", "capitaltest", "\"CapitalTest\"", "\"CapitalTest\""}, 116 {"Oracle", "\"mytable\"", "\"mytable\"", "\"mytable\"", "\"mytable\"", "\"mytable\""}, 117 {"Oracle", "mytable", "mytable", "mytable", "\"mytable\"", "\"mytable\""}, 118 {"Oracle", "MYTABLE", "MYTABLE", "mytable", "\"MYTABLE\"", "mytable"}, 119 {"Oracle", "\"MYTABLE\"", "\"MYTABLE\"", "mytable", "\"MYTABLE\"", "mytable"}, 120 {"Oracle", "desc", "\"desc\"", "\"desc\"", "\"desc\"", "\"desc\""}, 121 {"Oracle", "5ive", "\"5ive\"", "\"5ive\"", "\"5ive\"", "\"5ive\""}, 122 {"Oracle", "\"5ive\"", "\"5ive\"", "\"5ive\"", "\"5ive\"", "\"5ive\""}, 123 124 }; 125 126 static gboolean 127 check_result (ATest *test, const gchar *result, const gchar *expected, gboolean for_meta_store, gboolean force_quotes) 128 { 129 gchar *str = NULL; 130 if (!result) { 131 if (expected) 132 str = g_strdup_printf ("Failed for %s: result is NULL when %s was expected\n", 133 test->sql_identifier, 134 expected); 135 } 136 else { 137 if (!expected) 138 str = g_strdup_printf ("Failed for %s: result is %s when NULL was expected\n", 139 test->sql_identifier, 140 result); 141 else if (strcmp (result, expected)) 142 str = g_strdup_printf ("Failed for %s: result is %s when %s was expected\n", 143 test->sql_identifier, 144 result, expected); 145 } 146 147 if (str) { 148 g_print ("\tTEST failed, (provider %s%s%s): %s\n", test->provider, 149 for_meta_store ? " for Meta store" : "", 150 force_quotes ? " force quotes" : "", str); 151 g_free (str); 152 return FALSE; 153 } 154 return TRUE; 155 } 156 157 158 int 159 main (int argc, char** argv) 160 { 161 gda_init (); 162 guint i, nfailed = 0; 163 for (i = 0; i < G_N_ELEMENTS (tests); i++) { 164 ATest *test = &(tests [i]); 165 gchar *result; 166 GdaServerProvider *prov = NULL; 167 168 if (test->provider) { 169 const gchar *real_pname; 170 if ((*test->provider == 'i') || (*test->provider == 's')) 171 real_pname = test->provider + 1; 172 else 173 real_pname = test->provider; 174 prov = gda_config_get_provider (real_pname, NULL); 175 if (!prov) { 176 g_print ("Can't find provider for %s, ignoring test\n", real_pname); 177 continue; 178 } 179 if (*test->provider == 'i') 180 g_object_set (G_OBJECT (prov), "identifiers-case-sensitive", FALSE, NULL); 181 else if (*test->provider == 's') 182 g_object_set (G_OBJECT (prov), "identifiers-case-sensitive", TRUE, NULL); 183 } 184 result = gda_sql_identifier_quote (test->sql_identifier, NULL, prov, FALSE, FALSE); 185 if (!check_result (test, result, test->result1, FALSE, FALSE)) 186 nfailed++; 187 g_free (result); 188 189 result = gda_sql_identifier_quote (test->sql_identifier, NULL, prov, TRUE, FALSE); 190 if (!check_result (test, result, test->result2, TRUE, FALSE)) 191 nfailed++; 192 g_free (result); 193 194 result = gda_sql_identifier_quote (test->sql_identifier, NULL, prov, FALSE, TRUE); 195 if (!check_result (test, result, test->result3, FALSE, TRUE)) 196 nfailed++; 197 g_free (result); 198 199 result = gda_sql_identifier_quote (test->sql_identifier, NULL, prov, TRUE, TRUE); 200 if (!check_result (test, result, test->result4, TRUE, TRUE)) 201 nfailed++; 202 g_free (result); 203 } 204 205 g_print ("%d tests executed, ", i * 4); 206 if (nfailed > 0) 207 g_print ("%d failed\n", nfailed); 208 else 209 g_print ("Ok\n"); 210 return EXIT_SUCCESS; 211 } 212