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