[libgda] Improved GdaSqlBuilder's API



commit 9ecb4bc9f8d4cfc2dad31a5109b610f6988c2fd9
Author: Vivien Malerba <malerba gnome-db org>
Date:   Wed Nov 25 20:43:51 2009 +0100

    Improved GdaSqlBuilder's API
    
    * renamed gda_sql_builder_add_field() to gda_sql_builder_add_field_id()
    * added gda_sql_builder_add_field()
    * added gda_sql_builder_add_field_value()
    * added gda_sql_builder_select_add_field()

 doc/C/howto.xml                                    |  243 ++++++++++++++++++++
 doc/C/libgda-sections.txt                          |    3 +
 doc/C/tmpl/gda-sql-builder.sgml                    |   35 +++
 libgda/gda-sql-builder.c                           |  173 ++++++++++++--
 libgda/gda-sql-builder.h                           |   10 +-
 libgda/libgda.symbols                              |    3 +
 providers/reuseable/mysql/gda-mysql-reuseable.c    |    2 +-
 .../reuseable/postgres/gda-postgres-reuseable.c    |    2 +-
 providers/web/gda-web-recordset.c                  |    4 +-
 samples/SqlBuilder/example.c                       |   78 ++++---
 samples/SqlBuilder/example_cnc.c                   |   46 +++-
 tests/test-sql-builder.c                           |   36 ++--
 tools/browser/browser-favorites.c                  |   62 +++---
 13 files changed, 582 insertions(+), 115 deletions(-)
---
diff --git a/doc/C/howto.xml b/doc/C/howto.xml
index 3ab5499..b84c201 100644
--- a/doc/C/howto.xml
+++ b/doc/C/howto.xml
@@ -61,6 +61,249 @@ if (!gda_config_define_dsn (&amp;dsn_info, &amp;error)) {
     </para>
   </sect1>
 
+  <sect1 id="howto-sqlbuilder">
+    <title>Build statements without using a parser</title>
+    <para>
+      Statements can be created using a <link linkend="GdaSqlParser">GdaSqlParser</link> object to parse
+      SQL strings, but an easier way is to use a <link linkend="GdaSqlBuilder">GdaSqlBuilder</link> object
+      and the associated APIs to construct the statement. This section gives examples to create
+      various statements. Please note that only the DML statements (SELECT, INSERT, UPDATE or DELETE statements
+      can be built using a <link linkend="GdaSqlBuilder">GdaSqlBuilder</link> object, other types of
+      statements can only be built using a parser).
+    </para>
+    <para>
+      Each of the examples in this section show the statement construction part, the usage part is not shown for
+      clarity reasons (replaced with <![CDATA[[...]]]>). Typically one would use the
+      <link linkend="gda-sql-builder-get-statement">gda_sql_builder_get_statement()</link> method to
+      actually obtain a <link linkend="GdaStatement">GdaStatement</link> object and execute it.
+    </para>
+    <sect2>
+      <title>INSERT INTO customers (e, f, g) VALUES (##p1::string, 15, 'joe')</title>
+      <para>
+	<programlisting>
+GdaSqlBuilder *b;
+b = gda_sql_builder_new (GDA_SQL_STATEMENT_INSERT);
+gda_sql_builder_set_table (b, "customers");
+gda_sql_builder_add_field_id (b,
+                              gda_sql_builder_add_id (b, 0, "e"),
+gda_sql_builder_add_param (b, 0, "p1", G_TYPE_STRING, FALSE));
+gda_sql_builder_add_field (b, "f", G_TYPE_INT, 15);
+gda_sql_builder_add_field (b, "g", G_TYPE_STRING, "joe")
+[...]	
+g_object_unref (b);	  
+	</programlisting>
+    </para>
+    </sect2>
+    <sect2>
+      <title>SELECT people.firstname AS person, people.lastname, "date" AS birthdate, age FROM people</title>
+      <para>
+	<programlisting>
+GdaSqlBuilder *b;
+b = gda_sql_builder_new (GDA_SQL_STATEMENT_INSERT);
+gda_sql_builder_select_add_field (b, "firstname", "people", "person");
+gda_sql_builder_select_add_field (b, "lastname", "people", NULL);
+gda_sql_builder_select_add_field (b, "date", NULL, "birthdate");
+gda_sql_builder_select_add_field (b, "age", NULL, NULL);
+gda_sql_builder_select_add_target (b, 0,
+				   gda_sql_builder_add_id (b, 0, "people"),
+				   NULL);
+[...]	
+g_object_unref (b);	  
+	</programlisting>
+    </para>
+    </sect2>
+    <sect2>
+      <title>SELECT c."date", name AS person FROM "select" AS c INNER JOIN orders USING (id)</title>
+      <para>
+	<programlisting>
+GdaSqlBuilder *b;
+b = gda_sql_builder_new (GDA_SQL_STATEMENT_SELECT);
+gda_sql_builder_add_id (b, 1, "select"); /* SELECT is an SQL reserved keyword */
+gda_sql_builder_select_add_target (b, 1, 1, "c");
+gda_sql_builder_select_add_target (b, 2,
+				   gda_sql_builder_add_id (b, 0, "orders"),
+				   NULL);
+gda_sql_builder_select_join_targets (b, 5, 1, 2, GDA_SQL_SELECT_JOIN_INNER, 0);
+
+gda_sql_builder_add_field_id (b,
+                              gda_sql_builder_add_id (b, 0, "c.date"), 0); /* DATE is an SQL reserved keyword */
+gda_sql_builder_add_field_id (b,
+			      gda_sql_builder_add_id (b, 0, "name"),
+		  	      gda_sql_builder_add_id (b, 0, "person"));
+
+gda_sql_builder_join_add_field (b, 5, "id");
+[...]	
+g_object_unref (b);	  
+	</programlisting>
+    </para>
+    </sect2>
+    <sect2>
+      <title>UPDATE products set ref='A0E''FESP' WHERE id = 14</title>
+      <para>
+	<programlisting>
+GdaSqlBuilder *b;
+b = gda_sql_builder_new (GDA_SQL_STATEMENT_INSERT);
+gda_sql_builder_set_table (b, "products");
+gda_sql_builder_add_field (b, "ref", G_TYPE_STRING, "A0E'FESP");
+gda_sql_builder_add_id (b, 1, "id");
+gda_sql_builder_add_expr (b, 2, NULL, G_TYPE_INT, 14);
+gda_sql_builder_add_cond (b, 3, GDA_SQL_OPERATOR_TYPE_EQ, 1, 2, 0);
+gda_sql_builder_set_where (b, 3);
+[...]	
+g_object_unref (b);	  
+	</programlisting>
+    </para>
+    </sect2>
+    <sect2>
+      <title>DELETE FROM items WHERE id = ##theid::int</title>
+      <para>
+	<programlisting>
+GdaSqlBuilder *b;
+b = gda_sql_builder_new (GDA_SQL_STATEMENT_DELETE);
+gda_sql_builder_set_table (b, "items");
+gda_sql_builder_add_id (b, 1, "id");
+gda_sql_builder_add_param (b, 2, "theid", G_TYPE_INT, FALSE);
+gda_sql_builder_add_cond (b, 3, GDA_SQL_OPERATOR_TYPE_EQ, 1, 2, 0);
+gda_sql_builder_set_where (b, 3);
+[...]	
+g_object_unref (b);	  
+	</programlisting>
+    </para>
+    </sect2>
+    <sect2>
+      <title>SELECT myfunc (a, 5, 'Joe') FROM mytable</title>
+      <para>
+	<programlisting>
+GdaSqlBuilder *b;
+b = gda_sql_builder_new (GDA_SQL_STATEMENT_SELECT);
+gda_sql_builder_select_add_target (b, 0,
+				   gda_sql_builder_add_id (b, 0, "mytable"),
+				   NULL);
+gda_sql_builder_add_function (b, 1, "myfunc",
+			      gda_sql_builder_add_id (b, 0, "a"),
+			      gda_sql_builder_add_expr (b, 0, NULL, G_TYPE_INT, 5),
+			      gda_sql_builder_add_expr (b, 0, NULL, G_TYPE_STRING, "Joe"),
+			      0);
+gda_sql_builder_add_field_id (b, 1, 0);
+[...]	
+g_object_unref (b);	  
+	</programlisting>
+    </para>
+    </sect2>
+    <sect2>
+      <title>SELECT name FROM master WHERE id IN (SELECT id FROM subdata)</title>
+      <para>
+	<programlisting>
+GdaSqlBuilder *b;
+GdaSqlStatement *sub;
+b = gda_sql_builder_new (GDA_SQL_STATEMENT_SELECT);
+gda_sql_builder_add_field_id (b, gda_sql_builder_add_id (b, 0, "id"), 0);
+gda_sql_builder_select_add_target (b, 0,
+				   gda_sql_builder_add_id (b, 0, "subdata"),
+				   NULL);
+sub = gda_sql_builder_get_sql_statement (b, FALSE);
+g_object_unref (b);
+
+b = gda_sql_builder_new (GDA_SQL_STATEMENT_SELECT);
+gda_sql_builder_add_field_id (b, gda_sql_builder_add_id (b, 0, "name"), 0);
+gda_sql_builder_select_add_target (b, 0,
+				   gda_sql_builder_add_id (b, 0, "master"),
+				   NULL);
+gda_sql_builder_add_id (b, 1, "id");
+gda_sql_builder_add_sub_select (b, 2, sub, TRUE);
+gda_sql_builder_add_cond (b, 3, GDA_SQL_OPERATOR_TYPE_IN, 1, 2, 0);
+gda_sql_builder_set_where (b, 3);
+[...]	
+g_object_unref (b);	  
+	</programlisting>
+    </para>
+    </sect2>
+    <sect2>
+      <title>INSERT INTO customers (e, f, g) SELECT id, name, location FROM subdate</title>
+      <para>
+	<programlisting>
+GdaSqlBuilder *b;
+GdaSqlStatement *sub;
+b = gda_sql_builder_new (GDA_SQL_STATEMENT_SELECT);
+gda_sql_builder_add_field_id (b, gda_sql_builder_add_id (b, 0, "id"), 0);
+gda_sql_builder_add_field_id (b, gda_sql_builder_add_id (b, 0, "name"), 0);
+gda_sql_builder_add_field_id (b, gda_sql_builder_add_id (b, 0, "location"), 0);
+gda_sql_builder_select_add_target (b, 0,
+				   gda_sql_builder_add_id (b, 0, "subdate"),
+				   NULL);
+sub = gda_sql_builder_get_sql_statement (b, FALSE);
+g_object_unref (b);
+
+b = gda_sql_builder_new (GDA_SQL_STATEMENT_INSERT);
+gda_sql_builder_set_table (b, "customers");
+gda_sql_builder_add_field_id (b, gda_sql_builder_add_id (b, 0, "e"), 0);
+gda_sql_builder_add_field_id (b, gda_sql_builder_add_id (b, 0, "f"), 0);
+gda_sql_builder_add_field_id (b, gda_sql_builder_add_id (b, 0, "g"), 0);
+gda_sql_builder_add_field_id (b, gda_sql_builder_add_sub_select (b, 0, sub, TRUE), 0);
+[...]	
+g_object_unref (b);	  
+	</programlisting>
+    </para>
+    </sect2>
+    <sect2>
+      <title>SELECT id, name FROM subdata1 UNION SELECT ident, lastname FROM subdata2</title>
+      <para>
+	<programlisting>
+GdaSqlBuilder *b;
+GdaSqlStatement *sub1, *sub2;
+b = gda_sql_builder_new (GDA_SQL_STATEMENT_SELECT);
+gda_sql_builder_add_field_id (b, gda_sql_builder_add_id (b, 0, "id"), 0);
+gda_sql_builder_add_field_id (b, gda_sql_builder_add_id (b, 0, "name"), 0);
+gda_sql_builder_select_add_target (b, 0,
+				   gda_sql_builder_add_id (b, 0, "subdata1"),
+				   NULL);
+sub1 = gda_sql_builder_get_sql_statement (b, FALSE);
+g_object_unref (b);
+
+b = gda_sql_builder_new (GDA_SQL_STATEMENT_SELECT);
+gda_sql_builder_add_field_id (b, gda_sql_builder_add_id (b, 0, "ident"), 0);
+gda_sql_builder_add_field_id (b, gda_sql_builder_add_id (b, 0, "lastname"), 0);
+gda_sql_builder_select_add_target (b, 0,
+				   gda_sql_builder_add_id (b, 0, "subdata2"),
+				   NULL);
+sub2 = gda_sql_builder_get_sql_statement (b, FALSE);
+g_object_unref (b);
+
+b = gda_sql_builder_new (GDA_SQL_STATEMENT_COMPOUND);
+gda_sql_builder_compound_add_sub_select (b, sub1, TRUE);
+gda_sql_builder_compound_add_sub_select (b, sub2, TRUE);
+[...]	
+g_object_unref (b);	  
+	</programlisting>
+    </para>
+    </sect2>
+    <sect2>
+      <title>SELECT CASE tag WHEN 'Alpha' THEN 1 WHEN 'Bravo' THEN 2 WHEN 'Charlie' THEN 3 ELSE 0 END FROM data</title>
+      <para>
+	<programlisting>
+GdaSqlBuilder *b;
+b = gda_sql_builder_new (GDA_SQL_STATEMENT_SELECT);
+gda_sql_builder_add_case (b, 10, 
+			  gda_sql_builder_add_id (b, 0, "tag"),
+			  0,
+			  gda_sql_builder_add_expr (b, 0, NULL, G_TYPE_STRING, "Alpha"),
+			  gda_sql_builder_add_expr (b, 0, NULL, G_TYPE_INT, 1),
+			  gda_sql_builder_add_expr (b, 0, NULL, G_TYPE_STRING, "Bravo"),
+			  gda_sql_builder_add_expr (b, 0, NULL, G_TYPE_INT, 2),
+			  gda_sql_builder_add_expr (b, 0, NULL, G_TYPE_STRING, "Charlie"),
+			  gda_sql_builder_add_expr (b, 0, NULL, G_TYPE_INT, 3),
+			  0);
+gda_sql_builder_add_field_id (b, 10, 0);
+gda_sql_builder_select_add_target (b, 0,
+				   gda_sql_builder_add_id (b, 0, "data"),
+				   NULL);
+[...]	
+g_object_unref (b);	  
+	</programlisting>
+    </para>
+    </sect2>
+  </sect1>
+
   <sect1 id="howto-exec-select">
     <title>Execute a SELECT command</title>
     <para>
diff --git a/doc/C/libgda-sections.txt b/doc/C/libgda-sections.txt
index 33d1799..8bf3446 100644
--- a/doc/C/libgda-sections.txt
+++ b/doc/C/libgda-sections.txt
@@ -1669,6 +1669,8 @@ gda_sql_builder_get_sql_statement
 <SUBSECTION>
 gda_sql_builder_set_table
 gda_sql_builder_add_field
+gda_sql_builder_add_field_value
+gda_sql_builder_add_field_id
 gda_sql_builder_add_function
 gda_sql_builder_add_function_v
 <SUBSECTION>
@@ -1685,6 +1687,7 @@ gda_sql_builder_add_cond_v
 gda_sql_builder_set_where
 <SUBSECTION>
 gda_sql_builder_select_add_target
+gda_sql_builder_select_add_field
 gda_sql_builder_select_join_targets
 gda_sql_builder_join_add_field
 gda_sql_builder_select_order_by
diff --git a/doc/C/tmpl/gda-sql-builder.sgml b/doc/C/tmpl/gda-sql-builder.sgml
index 1f90278..b50dc6b 100644
--- a/doc/C/tmpl/gda-sql-builder.sgml
+++ b/doc/C/tmpl/gda-sql-builder.sgml
@@ -36,6 +36,9 @@ gda_sql_builder_add_cond2 (b, 4, GDA_SQL_OPERATOR_TYPE_GT, // requested ID=4
 gda_sql_builder_add_cond2 (b, 5, GDA_SQL_OPERATOR_TYPE_AND, 3, 4); // whole expression, requested ID=5
 ]]></programlisting>
 </para>
+<para>
+  For more examples, see the <link linkend="howto-sqlbuilder">Build statements without using a parser</link> section.
+</para>
 
 <!-- ##### SECTION See_Also ##### -->
 <para>
@@ -100,6 +103,27 @@ gda_sql_builder_add_cond2 (b, 5, GDA_SQL_OPERATOR_TYPE_AND, 3, 4); // whole expr
 </para>
 
 @builder: 
+ field_name: 
+ type: 
+ Varargs: 
+
+
+<!-- ##### FUNCTION gda_sql_builder_add_field_value ##### -->
+<para>
+
+</para>
+
+ builder: 
+ field_name: 
+ value: 
+
+
+<!-- ##### FUNCTION gda_sql_builder_add_field_id ##### -->
+<para>
+
+</para>
+
+ builder: 
 @field_id: 
 @value_id: 
 
@@ -266,6 +290,17 @@ gda_sql_builder_add_cond2 (b, 5, GDA_SQL_OPERATOR_TYPE_AND, 3, 4); // whole expr
 @Returns: 
 
 
+<!-- ##### FUNCTION gda_sql_builder_select_add_field ##### -->
+<para>
+
+</para>
+
+ builder: 
+ field_name: 
+ table_name: 
+ alias: 
+
+
 <!-- ##### FUNCTION gda_sql_builder_select_join_targets ##### -->
 <para>
 
diff --git a/libgda/gda-sql-builder.c b/libgda/gda-sql-builder.c
index f434a59..f7923fc 100644
--- a/libgda/gda-sql-builder.c
+++ b/libgda/gda-sql-builder.c
@@ -487,27 +487,161 @@ gda_sql_builder_set_where (GdaSqlBuilder *builder, guint cond_id)
 	}
 }
 
+/**
+ * gda_sql_builder_select_add_field
+ * @builder: a #GdaSqlBuilder object
+ * @field_name: a field name
+ * @table_name: a table name, or %NULL
+ * @alias: an alias (eg. for the "AS" clause), or %NULL
+ *
+ * Valid only for: SELECT statements.
+ *
+ * Add a selected selected item to the SELECT statement.
+ *
+ * Since: 4.2
+ */
+void
+gda_sql_builder_select_add_field (GdaSqlBuilder *builder, const gchar *field_name, const gchar *table_name, const gchar *alias)
+{
+	gchar *tmp;
+	g_return_if_fail (GDA_IS_SQL_BUILDER (builder));
+	g_return_if_fail (builder->priv->main_stmt);
+	if (builder->priv->main_stmt->stmt_type != GDA_SQL_STATEMENT_SELECT) {
+		g_warning (_("Wrong statement type"));
+		return;
+	}
+	g_return_if_fail (field_name && *field_name);
+
+	if (table_name && *table_name)
+		tmp = g_strdup_printf ("%s.%s", table_name, field_name);
+	else
+		tmp = (gchar*) field_name;
+
+	if (alias && *alias)
+		gda_sql_builder_add_field_id (builder,
+					      gda_sql_builder_add_id (builder, 0, tmp),
+					      gda_sql_builder_add_id (builder, 0, alias));
+	else
+		gda_sql_builder_add_field_id (builder,
+					      gda_sql_builder_add_id (builder, 0, tmp),
+					      0);
+	if (table_name)
+		g_free (tmp);
+}
+
+static GValue *
+create_typed_value (GType type, va_list *ap)
+{
+	GValue *v = NULL;
+	if (type == G_TYPE_STRING)
+		g_value_set_string ((v = gda_value_new (G_TYPE_STRING)), va_arg (*ap, gchar*));
+	else if (type == G_TYPE_INT)
+		g_value_set_int ((v = gda_value_new (G_TYPE_INT)), va_arg (*ap, gint));
+	else if (type == G_TYPE_FLOAT)
+		g_value_set_float ((v = gda_value_new (G_TYPE_FLOAT)), va_arg (*ap, double));
+	else
+		g_warning (_("Could not convert value to type '%s'"), g_type_name (type));
+	return v;
+}
 
 /**
  * gda_sql_builder_add_field
  * @builder: a #GdaSqlBuilder object
+ * @field_name: a field name
+ * @type: the GType of the following argument
+ * @...: value to set the field to, of the type specified by @type
+ *
+ * Valid only for: INSERT, UPDATE statements.
+ *
+ * Specifies that the field represented by @field_name will be set to the value identified 
+ * by @... of type @type.
+ *
+ * Since: 4.2
+ */
+void
+gda_sql_builder_add_field (GdaSqlBuilder *builder, const gchar *field_name, GType type, ...)
+{
+	g_return_if_fail (GDA_IS_SQL_BUILDER (builder));
+	g_return_if_fail (builder->priv->main_stmt);
+	g_return_if_fail (field_name && *field_name);
+
+	if ((builder->priv->main_stmt->stmt_type != GDA_SQL_STATEMENT_UPDATE) &&
+	    (builder->priv->main_stmt->stmt_type != GDA_SQL_STATEMENT_INSERT)) {
+		g_warning (_("Wrong statement type"));
+		return;
+	}
+
+	guint id1, id2;
+	GValue *value;
+	va_list ap;
+
+	va_start (ap, type);
+	value = create_typed_value (type, &ap);
+	va_end (ap);
+
+	if (!value)
+		return;
+	id1 = gda_sql_builder_add_id (builder, 0, field_name);
+	id2 = gda_sql_builder_add_expr_value (builder, 0, NULL, value);
+	gda_value_free (value);
+	gda_sql_builder_add_field_id (builder, id1, id2);
+}
+
+/**
+ * gda_sql_builder_add_field_value
+ * @builder: a #GdaSqlBuilder object
+ * @field_name: a field name
+ * @value: value to set the field to
+ *
+ * Valid only for: INSERT, UPDATE statements.
+ *
+ * Specifies that the field represented by @field_name will be set to the value identified 
+ * by @value
+ *
+ * Since: 4.2
+ */
+void
+gda_sql_builder_add_field_value (GdaSqlBuilder *builder, const gchar *field_name, const GValue *value)
+{
+	g_return_if_fail (GDA_IS_SQL_BUILDER (builder));
+	g_return_if_fail (builder->priv->main_stmt);
+	g_return_if_fail (field_name && *field_name);
+	g_return_if_fail (value);
+
+	if ((builder->priv->main_stmt->stmt_type != GDA_SQL_STATEMENT_UPDATE) &&
+	    (builder->priv->main_stmt->stmt_type != GDA_SQL_STATEMENT_INSERT)) {
+		g_warning (_("Wrong statement type"));
+		return;
+	}
+
+	guint id1, id2;
+	id1 = gda_sql_builder_add_id (builder, 0, field_name);
+	id2 = gda_sql_builder_add_expr_value (builder, 0, NULL, value);
+	gda_sql_builder_add_field_id (builder, id1, id2);
+}
+
+/**
+ * gda_sql_builder_add_field_id
+ * @builder: a #GdaSqlBuilder object
  * @field_id: the ID of the field's name or definition
  * @value_id: the ID of the value to set the field to, or %0
  *
  * Valid only for: INSERT, UPDATE, SELECT statements
- *
- * For UPDATE: specifies that the field represented by @field_id will be set to the value identified by @value_id.
- * For SELECT: add a selected item to the statement, and if @value_id is not %0, then use it as an alias
- * For INSERT: if @field_id represents an SQL identifier (obtained using gda_sql_builder_add_id()): then if
- *             @value_id is not %0 then specifies that the field represented by @field_id will be set to the
- *             value identified by @value_id, otherwise just specifies a named field to be given a value.
- *             If @field_id represents a sub SELECT (obtained using gda_sql_builder_add_sub_select()), then
- *             this method call defines the sub SELECT from which values to insert are taken.
- *
+ * <itemizedlist>
+ * <listitem><para>For UPDATE: specifies that the field represented by @field_id will be set to the value identified 
+ *    by @value_id.</para></listitem>
+ * <listitem><para>For SELECT: add a selected item to the statement, and if @value_id is not %0, then use it as an
+ *    alias</para></listitem>
+ * <listitem><para>For INSERT: if @field_id represents an SQL identifier (obtained using gda_sql_builder_add_id()): then if
+ *    @value_id is not %0 then specifies that the field represented by @field_id will be set to the
+ *    value identified by @value_id, otherwise just specifies a named field to be given a value.
+ *    If @field_id represents a sub SELECT (obtained using gda_sql_builder_add_sub_select()), then
+ *    this method call defines the sub SELECT from which values to insert are taken.</para></listitem>
+ * </itemizedlist>
  * Since: 4.2
  */
 void
-gda_sql_builder_add_field (GdaSqlBuilder *builder, guint field_id, guint value_id)
+gda_sql_builder_add_field_id (GdaSqlBuilder *builder, guint field_id, guint value_id)
 {
 	g_return_if_fail (GDA_IS_SQL_BUILDER (builder));
 	g_return_if_fail (builder->priv->main_stmt);
@@ -617,7 +751,7 @@ gda_sql_builder_add_field (GdaSqlBuilder *builder, guint field_id, guint value_i
  * Since: 4.2
  */
 guint
-gda_sql_builder_add_expr_value (GdaSqlBuilder *builder, guint id, GdaDataHandler *dh, GValue *value)
+gda_sql_builder_add_expr_value (GdaSqlBuilder *builder, guint id, GdaDataHandler *dh, const GValue *value)
 {
 	g_return_val_if_fail (GDA_IS_SQL_BUILDER (builder), 0);
 	g_return_val_if_fail (builder->priv->main_stmt, 0);
@@ -690,25 +824,18 @@ gda_sql_builder_add_expr (GdaSqlBuilder *builder, guint id, GdaDataHandler *dh,
 	g_return_val_if_fail (builder->priv->main_stmt, 0);
 	
 	va_list ap;
-	GValue *v = NULL;
+	GValue *value;
 	guint retval;
 
 	va_start (ap, type);
-	if (type == G_TYPE_STRING)
-		g_value_set_string ((v = gda_value_new (G_TYPE_STRING)), va_arg (ap, gchar*));
-	else if (type == G_TYPE_INT)
-		g_value_set_int ((v = gda_value_new (G_TYPE_INT)), va_arg (ap, gint));
-	else if (type == G_TYPE_FLOAT)
-		g_value_set_float ((v = gda_value_new (G_TYPE_FLOAT)), va_arg (ap, double));
-	else
-		g_warning (_("Could not convert value to type '%s'"), g_type_name (type));
+	value = create_typed_value (type, &ap);
 	va_end (ap);
 
-	if (!v)
+	if (!value)
 		return 0;
-	retval = gda_sql_builder_add_expr_value (builder, id, dh, v);
+	retval = gda_sql_builder_add_expr_value (builder, id, dh, value);
 
-	gda_value_free (v);
+	gda_value_free (value);
 
 	return retval;
 }
diff --git a/libgda/gda-sql-builder.h b/libgda/gda-sql-builder.h
index e5139b9..2f76f5e 100644
--- a/libgda/gda-sql-builder.h
+++ b/libgda/gda-sql-builder.h
@@ -73,7 +73,7 @@ GdaSqlStatement  *gda_sql_builder_get_sql_statement (GdaSqlBuilder *builder, gbo
 /* Expression API */
 guint             gda_sql_builder_add_id (GdaSqlBuilder *builder, guint id, const gchar *string);
 guint             gda_sql_builder_add_expr (GdaSqlBuilder *builder, guint id, GdaDataHandler *dh, GType type, ...);
-guint             gda_sql_builder_add_expr_value (GdaSqlBuilder *builder, guint id, GdaDataHandler *dh, GValue* value);
+guint             gda_sql_builder_add_expr_value (GdaSqlBuilder *builder, guint id, GdaDataHandler *dh, const GValue *value);
 guint             gda_sql_builder_add_param (GdaSqlBuilder *builder, guint id, const gchar *param_name, GType type, gboolean nullok);
 
 guint             gda_sql_builder_add_cond (GdaSqlBuilder *builder, guint id, GdaSqlOperatorType op,
@@ -93,12 +93,18 @@ guint             gda_sql_builder_add_case_v (GdaSqlBuilder *builder, guint id,
 					    
 
 /* General Statement API */
+void              gda_sql_builder_add_field (GdaSqlBuilder *builder, const gchar *field_name, GType type, ...);
+void              gda_sql_builder_add_field_value (GdaSqlBuilder *builder, const gchar *field_name,
+						   const GValue *value);
+
 void              gda_sql_builder_set_table (GdaSqlBuilder *builder, const gchar *table_name);
 void              gda_sql_builder_set_where (GdaSqlBuilder *builder, guint cond_id);
 
-void              gda_sql_builder_add_field (GdaSqlBuilder *builder, guint field_id, guint value_id);
+void              gda_sql_builder_add_field_id (GdaSqlBuilder *builder, guint field_id, guint value_id);
 
 /* SELECT Statement API */
+void              gda_sql_builder_select_add_field (GdaSqlBuilder *builder, const gchar *field_name,
+						    const gchar *table_name, const gchar *alias);
 guint             gda_sql_builder_select_add_target (GdaSqlBuilder *builder, guint id,
 						     guint table_id, const gchar *alias);
 guint             gda_sql_builder_select_join_targets (GdaSqlBuilder *builder, guint id,
diff --git a/libgda/libgda.symbols b/libgda/libgda.symbols
index 0aaab9c..63ce09b 100644
--- a/libgda/libgda.symbols
+++ b/libgda/libgda.symbols
@@ -573,6 +573,8 @@
 	gda_sql_builder_add_expr
 	gda_sql_builder_add_expr_value
 	gda_sql_builder_add_field
+	gda_sql_builder_add_field_id
+	gda_sql_builder_add_field_value
 	gda_sql_builder_add_function
 	gda_sql_builder_add_function_v
 	gda_sql_builder_add_id
@@ -585,6 +587,7 @@
 	gda_sql_builder_get_type
 	gda_sql_builder_join_add_field
 	gda_sql_builder_new
+	gda_sql_builder_select_add_field
 	gda_sql_builder_select_add_target
 	gda_sql_builder_select_join_targets
 	gda_sql_builder_select_order_by
diff --git a/providers/reuseable/mysql/gda-mysql-reuseable.c b/providers/reuseable/mysql/gda-mysql-reuseable.c
index 41cc7eb..7ba7c0a 100644
--- a/providers/reuseable/mysql/gda-mysql-reuseable.c
+++ b/providers/reuseable/mysql/gda-mysql-reuseable.c
@@ -153,7 +153,7 @@ _gda_mysql_compute_version (GdaConnection *cnc, GdaMysqlReuseable *rdata, GError
 
 	b = gda_sql_builder_new (GDA_SQL_STATEMENT_SELECT);
         gda_sql_builder_add_function (b, 1, "version", 0);
-        gda_sql_builder_add_field (b, 1, 0);
+        gda_sql_builder_add_field_id (b, 1, 0);
 	stmt = gda_sql_builder_get_statement (b, NULL);
 	g_object_unref (b);
 	g_assert (stmt);
diff --git a/providers/reuseable/postgres/gda-postgres-reuseable.c b/providers/reuseable/postgres/gda-postgres-reuseable.c
index caba4e1..b7bfc9f 100644
--- a/providers/reuseable/postgres/gda-postgres-reuseable.c
+++ b/providers/reuseable/postgres/gda-postgres-reuseable.c
@@ -180,7 +180,7 @@ _gda_postgres_compute_version (GdaConnection *cnc, GdaPostgresReuseable *rdata,
 
 	b = gda_sql_builder_new (GDA_SQL_STATEMENT_SELECT);
         gda_sql_builder_add_function (b, 1, "version", 0);
-        gda_sql_builder_add_field (b, 1, 0);
+        gda_sql_builder_add_field_id (b, 1, 0);
 	stmt = gda_sql_builder_get_statement (b, NULL);
 	g_object_unref (b);
 	g_assert (stmt);
diff --git a/providers/web/gda-web-recordset.c b/providers/web/gda-web-recordset.c
index 6ed3450..00f3c24 100644
--- a/providers/web/gda-web-recordset.c
+++ b/providers/web/gda-web-recordset.c
@@ -343,10 +343,10 @@ create_table (GdaWebRecordset *rs, GError **error)
 		g_string_append_printf (string, "%s %s", colname,
 					gda_g_type_to_string (gda_column_get_g_type (column)));
 
-		gda_sql_builder_add_field (ib, gda_sql_builder_add_id (ib, 0, colname),
+		gda_sql_builder_add_field_id (ib, gda_sql_builder_add_id (ib, 0, colname),
 					   gda_sql_builder_add_param (ib, 0, colname,
 								      gda_column_get_g_type (column), TRUE));
-		gda_sql_builder_add_field (sb, gda_sql_builder_add_id (sb, 0, colname), 0);
+		gda_sql_builder_add_field_id (sb, gda_sql_builder_add_id (sb, 0, colname), 0);
 
 		g_free (colname);
 	}
diff --git a/samples/SqlBuilder/example.c b/samples/SqlBuilder/example.c
index be2dac2..78171b5 100644
--- a/samples/SqlBuilder/example.c
+++ b/samples/SqlBuilder/example.c
@@ -15,13 +15,13 @@ main (int argc, char *argv[])
 
 	gda_sql_builder_set_table (b, "customers");
 
-	gda_sql_builder_add_field (b,
+	gda_sql_builder_add_field_id (b,
 				   gda_sql_builder_add_id (b, 0, "e"),
 				   gda_sql_builder_add_param (b, 0, "p1", G_TYPE_STRING, FALSE));
-	gda_sql_builder_add_field (b,
+	gda_sql_builder_add_field_id (b,
 				   gda_sql_builder_add_id (b, 0, "f"),
 				   gda_sql_builder_add_expr (b, 0, NULL, G_TYPE_INT, 15));
-	gda_sql_builder_add_field (b, gda_sql_builder_add_id (b, 0, "g"),
+	gda_sql_builder_add_field_id (b, gda_sql_builder_add_id (b, 0, "g"),
 				   gda_sql_builder_add_expr (b, 0, NULL, G_TYPE_STRING, "joe"));
 	
 	render_as_sql (b);
@@ -32,9 +32,7 @@ main (int argc, char *argv[])
 	b = gda_sql_builder_new (GDA_SQL_STATEMENT_UPDATE);
 
 	gda_sql_builder_set_table (b, "products");
-	gda_sql_builder_add_field (b,
-				   gda_sql_builder_add_id (b, 0, "ref"),
-				   gda_sql_builder_add_expr (b, 10, NULL, G_TYPE_STRING, "A0E'FESP"));
+	gda_sql_builder_add_field (b, "ref", G_TYPE_STRING, "A0E'FESP");
 	gda_sql_builder_add_id (b, 1, "id");
 	gda_sql_builder_add_expr (b, 2, NULL, G_TYPE_INT, 14);
 	gda_sql_builder_add_cond (b, 3, GDA_SQL_OPERATOR_TYPE_EQ, 1, 2, 0);
@@ -77,9 +75,9 @@ main (int argc, char *argv[])
 					   NULL);
 	gda_sql_builder_select_join_targets (b, 5, 1, 2, GDA_SQL_SELECT_JOIN_INNER, 0);
 
-	gda_sql_builder_add_field (b,
+	gda_sql_builder_add_field_id (b,
 				   gda_sql_builder_add_id (b, 0, "c.date"), 0); /* DATE is an SQL reserved keyword */
-	gda_sql_builder_add_field (b,
+	gda_sql_builder_add_field_id (b,
 				   gda_sql_builder_add_id (b, 0, "name"),
 				   gda_sql_builder_add_id (b, 0, "person"));
 
@@ -101,7 +99,7 @@ main (int argc, char *argv[])
 				      gda_sql_builder_add_expr (b, 0, NULL, G_TYPE_INT, 5),
 				      gda_sql_builder_add_expr (b, 0, NULL, G_TYPE_STRING, "Joe"),
 				      0);
-	gda_sql_builder_add_field (b, 1, 0);
+	gda_sql_builder_add_field_id (b, 1, 0);
 	render_as_sql (b);
 
 	/* reuse the same GdaSqlBuilder object to have:
@@ -111,7 +109,7 @@ main (int argc, char *argv[])
 	gda_sql_builder_add_expr (b, 4, NULL, G_TYPE_INT, 10);
 
 	gda_sql_builder_add_function_v (b, 5, "MAX", args, 3);
-	gda_sql_builder_add_field (b, 5, 0);
+	gda_sql_builder_add_field_id (b, 5, 0);
 
 	render_as_sql (b);
 	g_object_unref (b);
@@ -120,7 +118,7 @@ main (int argc, char *argv[])
 	b = gda_sql_builder_new (GDA_SQL_STATEMENT_UPDATE);
 
 	gda_sql_builder_set_table (b, "select");
-	gda_sql_builder_add_field (b,
+	gda_sql_builder_add_field_id (b,
 				   gda_sql_builder_add_id (b, 0, "date"),
 				   gda_sql_builder_add_expr (b, 10, NULL, G_TYPE_STRING, "2009-05-27"));
 	gda_sql_builder_add_id (b, 1, "id");
@@ -144,14 +142,14 @@ main (int argc, char *argv[])
 				      gda_sql_builder_add_expr (b, 0, NULL, G_TYPE_INT, 5),
 				      gda_sql_builder_add_expr (b, 0, NULL, G_TYPE_STRING, "Joe"),
 				      0);
-	gda_sql_builder_add_field (b, 1, 0);
+	gda_sql_builder_add_field_id (b, 1, 0);
 	render_as_sql (b);
 	g_object_unref (b);
 
 	/* Subselect: SELECT name FROM master WHERE id IN (SELECT id FROM subdata) */
 	GdaSqlStatement *sub;
 	b = gda_sql_builder_new (GDA_SQL_STATEMENT_SELECT);
-	gda_sql_builder_add_field (b, gda_sql_builder_add_id (b, 0, "id"), 0);
+	gda_sql_builder_add_field_id (b, gda_sql_builder_add_id (b, 0, "id"), 0);
 	gda_sql_builder_select_add_target (b, 0,
 					   gda_sql_builder_add_id (b, 0, "subdata"),
 					   NULL);
@@ -159,7 +157,7 @@ main (int argc, char *argv[])
 	g_object_unref (b);
 
 	b = gda_sql_builder_new (GDA_SQL_STATEMENT_SELECT);
-	gda_sql_builder_add_field (b, gda_sql_builder_add_id (b, 0, "name"), 0);
+	gda_sql_builder_add_field_id (b, gda_sql_builder_add_id (b, 0, "name"), 0);
 	gda_sql_builder_select_add_target (b, 0,
 					   gda_sql_builder_add_id (b, 0, "master"),
 					   NULL);
@@ -172,9 +170,9 @@ main (int argc, char *argv[])
 	
 	/* Subselect in INSERT: INSERT INTO customers (e, f, g) SELECT id, name, location FROM subdate */
 	b = gda_sql_builder_new (GDA_SQL_STATEMENT_SELECT);
-	gda_sql_builder_add_field (b, gda_sql_builder_add_id (b, 0, "id"), 0);
-	gda_sql_builder_add_field (b, gda_sql_builder_add_id (b, 0, "name"), 0);
-	gda_sql_builder_add_field (b, gda_sql_builder_add_id (b, 0, "location"), 0);
+	gda_sql_builder_add_field_id (b, gda_sql_builder_add_id (b, 0, "id"), 0);
+	gda_sql_builder_add_field_id (b, gda_sql_builder_add_id (b, 0, "name"), 0);
+	gda_sql_builder_add_field_id (b, gda_sql_builder_add_id (b, 0, "location"), 0);
 	gda_sql_builder_select_add_target (b, 0,
 					   gda_sql_builder_add_id (b, 0, "subdate"),
 					   NULL);
@@ -184,10 +182,10 @@ main (int argc, char *argv[])
 	b = gda_sql_builder_new (GDA_SQL_STATEMENT_INSERT);
 
 	gda_sql_builder_set_table (b, "customers");
-	gda_sql_builder_add_field (b, gda_sql_builder_add_id (b, 0, "e"), 0);
-	gda_sql_builder_add_field (b, gda_sql_builder_add_id (b, 0, "f"), 0);
-	gda_sql_builder_add_field (b, gda_sql_builder_add_id (b, 0, "g"), 0);
-	gda_sql_builder_add_field (b, gda_sql_builder_add_sub_select (b, 0, sub, TRUE), 0);
+	gda_sql_builder_add_field_id (b, gda_sql_builder_add_id (b, 0, "e"), 0);
+	gda_sql_builder_add_field_id (b, gda_sql_builder_add_id (b, 0, "f"), 0);
+	gda_sql_builder_add_field_id (b, gda_sql_builder_add_id (b, 0, "g"), 0);
+	gda_sql_builder_add_field_id (b, gda_sql_builder_add_sub_select (b, 0, sub, TRUE), 0);
 	
 	render_as_sql (b);
 	g_object_unref (b);
@@ -196,8 +194,8 @@ main (int argc, char *argv[])
 	/* compound: SELECT id, name FROM subdata1 UNION SELECT ident, lastname FROM subdata2 */
 	GdaSqlStatement *sub1, *sub2;
 	b = gda_sql_builder_new (GDA_SQL_STATEMENT_SELECT);
-	gda_sql_builder_add_field (b, gda_sql_builder_add_id (b, 0, "id"), 0);
-	gda_sql_builder_add_field (b, gda_sql_builder_add_id (b, 0, "name"), 0);
+	gda_sql_builder_add_field_id (b, gda_sql_builder_add_id (b, 0, "id"), 0);
+	gda_sql_builder_add_field_id (b, gda_sql_builder_add_id (b, 0, "name"), 0);
 	gda_sql_builder_select_add_target (b, 0,
 					   gda_sql_builder_add_id (b, 0, "subdata1"),
 					   NULL);
@@ -205,8 +203,8 @@ main (int argc, char *argv[])
 	g_object_unref (b);
 
 	b = gda_sql_builder_new (GDA_SQL_STATEMENT_SELECT);
-	gda_sql_builder_add_field (b, gda_sql_builder_add_id (b, 0, "ident"), 0);
-	gda_sql_builder_add_field (b, gda_sql_builder_add_id (b, 0, "lastname"), 0);
+	gda_sql_builder_add_field_id (b, gda_sql_builder_add_id (b, 0, "ident"), 0);
+	gda_sql_builder_add_field_id (b, gda_sql_builder_add_id (b, 0, "lastname"), 0);
 	gda_sql_builder_select_add_target (b, 0,
 					   gda_sql_builder_add_id (b, 0, "subdata2"),
 					   NULL);
@@ -230,7 +228,7 @@ main (int argc, char *argv[])
 				  gda_sql_builder_add_expr (b, 0, NULL, G_TYPE_INT, 1),
 				  1, gda_sql_builder_add_expr (b, 0, NULL, G_TYPE_INT, 2),
 				  0);
-	gda_sql_builder_add_field (b, 10, 0);
+	gda_sql_builder_add_field_id (b, 10, 0);
 	gda_sql_builder_select_add_target (b, 0,
 					   gda_sql_builder_add_id (b, 0, "data"),
 					   NULL);
@@ -249,13 +247,39 @@ main (int argc, char *argv[])
 				  gda_sql_builder_add_expr (b, 0, NULL, G_TYPE_STRING, "Charlie"),
 				  gda_sql_builder_add_expr (b, 0, NULL, G_TYPE_INT, 3),
 				  0);
-	gda_sql_builder_add_field (b, 10, 0);
+	gda_sql_builder_add_field_id (b, 10, 0);
 	gda_sql_builder_select_add_target (b, 0,
 					   gda_sql_builder_add_id (b, 0, "data"),
 					   NULL);
 	render_as_sql (b);
 	g_object_unref (b);
 
+	/*
+	 * SELECT people.firstname AS person, people.lastname, "date" AS birthdate, age FROM people
+	 */
+	b = gda_sql_builder_new (GDA_SQL_STATEMENT_SELECT);
+	
+	gda_sql_builder_select_add_field (b, "firstname", "people", "person");
+	gda_sql_builder_select_add_field (b, "lastname", "people", NULL);
+	gda_sql_builder_select_add_field (b, "date", NULL, "birthdate");
+	gda_sql_builder_select_add_field (b, "age", NULL, NULL);
+	gda_sql_builder_select_add_target (b, 0,
+					   gda_sql_builder_add_id (b, 0, "people"),
+					   NULL);
+
+	render_as_sql (b);
+	g_object_unref (b);
+
+	/* INSERT INTO customers (f, g) VALUES (15, 'joe') */
+	b = gda_sql_builder_new (GDA_SQL_STATEMENT_INSERT);
+
+	gda_sql_builder_set_table (b, "customers");
+	gda_sql_builder_add_field (b, "f", G_TYPE_INT, 15);
+	gda_sql_builder_add_field (b, "g", G_TYPE_STRING, "joe");
+	
+	render_as_sql (b);
+	g_object_unref (b);
+
 	return 0;
 }
 
diff --git a/samples/SqlBuilder/example_cnc.c b/samples/SqlBuilder/example_cnc.c
index 696f141..1f28b52 100644
--- a/samples/SqlBuilder/example_cnc.c
+++ b/samples/SqlBuilder/example_cnc.c
@@ -14,13 +14,13 @@ main (int argc, char *argv[])
 
 	gda_sql_builder_set_table (b, "customers");
 
-	gda_sql_builder_add_field (b,
+	gda_sql_builder_add_field_id (b,
 				   gda_sql_builder_add_id (b, 0, "e"),
 				   gda_sql_builder_add_param (b, 0, "p1", G_TYPE_STRING, FALSE));
-	gda_sql_builder_add_field (b,
+	gda_sql_builder_add_field_id (b,
 				   gda_sql_builder_add_id (b, 0, "f"),
 				   gda_sql_builder_add_expr (b, 0, NULL, G_TYPE_INT, 15));
-	gda_sql_builder_add_field (b, gda_sql_builder_add_id (b, 0, "g"),
+	gda_sql_builder_add_field_id (b, gda_sql_builder_add_id (b, 0, "g"),
 				   gda_sql_builder_add_expr (b, 0, NULL, G_TYPE_STRING, "joe"));
 	
 	render_as_sql (b);
@@ -31,7 +31,7 @@ main (int argc, char *argv[])
 	b = gda_sql_builder_new (GDA_SQL_STATEMENT_UPDATE);
 
 	gda_sql_builder_set_table (b, "products");
-	gda_sql_builder_add_field (b,
+	gda_sql_builder_add_field_id (b,
 				   gda_sql_builder_add_id (b, 0, "ref"),
 				   gda_sql_builder_add_expr (b, 10, NULL, G_TYPE_STRING, "A0E'FESP"));
 	gda_sql_builder_add_id (b, 1, "id");
@@ -76,9 +76,9 @@ main (int argc, char *argv[])
 					   NULL);
 	gda_sql_builder_select_join_targets (b, 5, 1, 2, GDA_SQL_SELECT_JOIN_INNER, 0);
 
-	gda_sql_builder_add_field (b,
+	gda_sql_builder_add_field_id (b,
 				   gda_sql_builder_add_id (b, 0, "c.date"), 0); /* DATE is an SQL reserved keyword */
-	gda_sql_builder_add_field (b,
+	gda_sql_builder_add_field_id (b,
 				   gda_sql_builder_add_id (b, 0, "name"),
 				   gda_sql_builder_add_id (b, 0, "person"));
 
@@ -100,7 +100,7 @@ main (int argc, char *argv[])
 				      gda_sql_builder_add_expr (b, 0, NULL, G_TYPE_INT, 5),
 				      gda_sql_builder_add_expr (b, 0, NULL, G_TYPE_STRING, "Joe"),
 				      0);
-	gda_sql_builder_add_field (b, 1, 0);
+	gda_sql_builder_add_field_id (b, 1, 0);
 	render_as_sql (b);
 
 	/* reuse the same GdaSqlBuilder object to have:
@@ -110,7 +110,7 @@ main (int argc, char *argv[])
 	gda_sql_builder_add_expr (b, 4, NULL, G_TYPE_INT, 10);
 
 	gda_sql_builder_add_function_v (b, 5, "MAX", args, 3);
-	gda_sql_builder_add_field (b, 5, 0);
+	gda_sql_builder_add_field_id (b, 5, 0);
 
 	render_as_sql (b);
 	g_object_unref (b);
@@ -119,7 +119,7 @@ main (int argc, char *argv[])
 	b = gda_sql_builder_new (GDA_SQL_STATEMENT_UPDATE);
 
 	gda_sql_builder_set_table (b, "select");
-	gda_sql_builder_add_field (b,
+	gda_sql_builder_add_field_id (b,
 				   gda_sql_builder_add_id (b, 0, "date"),
 				   gda_sql_builder_add_expr (b, 10, NULL, G_TYPE_STRING, "2009-05-27"));
 	gda_sql_builder_add_id (b, 1, "id");
@@ -144,8 +144,34 @@ main (int argc, char *argv[])
 				      gda_sql_builder_add_expr (b, 0, NULL, G_TYPE_INT, 5),
 				      gda_sql_builder_add_expr (b, 0, NULL, G_TYPE_STRING, "Joe"),
 				      0);
-	gda_sql_builder_add_field (b, 1, 0);
+	gda_sql_builder_add_field_id (b, 1, 0);
 	render_as_sql (b);
+
+	/*
+	 * SELECT people.firstname AS person, people.lastname, "date" AS birthdate, age FROM people
+	 */
+	b = gda_sql_builder_new (GDA_SQL_STATEMENT_SELECT);
+	
+	gda_sql_builder_select_add_field (b, "firstname", "people", "person");
+	gda_sql_builder_select_add_field (b, "lastname", "people", NULL);
+	gda_sql_builder_select_add_field (b, "date", NULL, "birthdate");
+	gda_sql_builder_select_add_field (b, "age", NULL, NULL);
+	gda_sql_builder_select_add_target (b, 0,
+					   gda_sql_builder_add_id (b, 0, "people"),
+					   NULL);
+
+	render_as_sql (b);
+	g_object_unref (b);
+
+	/* INSERT INTO customers (f, g) VALUES (15, 'joe') */
+	b = gda_sql_builder_new (GDA_SQL_STATEMENT_INSERT);
+
+	gda_sql_builder_set_table (b, "customers");
+	gda_sql_builder_add_field (b, "f", G_TYPE_INT, 15);
+	gda_sql_builder_add_field (b, "g", G_TYPE_STRING, "joe");
+	
+	render_as_sql (b);
+	g_object_unref (b);
 	
 	return 0;
 }
diff --git a/tests/test-sql-builder.c b/tests/test-sql-builder.c
index 17cb955..688a1be 100644
--- a/tests/test-sql-builder.c
+++ b/tests/test-sql-builder.c
@@ -126,7 +126,7 @@ build0 (void)
 	GdaSqlStatement *stmt;
 
 	builder = gda_sql_builder_new (GDA_SQL_STATEMENT_SELECT);
-	gda_sql_builder_add_field (builder,
+	gda_sql_builder_add_field_id (builder,
 				   gda_sql_builder_add_id (builder, 0, "*"), 0);
 	gda_sql_builder_select_add_target (builder, 0,
 					   gda_sql_builder_add_id (builder, 0, "mytable"), NULL);
@@ -151,13 +151,13 @@ build1 (void)
 	builder = gda_sql_builder_new (GDA_SQL_STATEMENT_SELECT);
 	gda_sql_builder_select_add_target (builder, 0,
 					   gda_sql_builder_add_id (builder, 0, "mytable"), NULL);
-	gda_sql_builder_add_field (builder,
+	gda_sql_builder_add_field_id (builder,
 				   gda_sql_builder_add_id (builder, 0, "contents"), 0);
-	gda_sql_builder_add_field (builder,
+	gda_sql_builder_add_field_id (builder,
 				   gda_sql_builder_add_id (builder, 0, "descr"), 0);
-	gda_sql_builder_add_field (builder,
+	gda_sql_builder_add_field_id (builder,
 				   gda_sql_builder_add_id (builder, 0, "rank"), 0);
-	gda_sql_builder_add_field (builder,
+	gda_sql_builder_add_field_id (builder,
 				   gda_sql_builder_add_id (builder, 0, "name"), 0);
 	gda_sql_builder_add_cond (builder, 1, GDA_SQL_OPERATOR_TYPE_EQ,
 			      gda_sql_builder_add_id (builder, 0, "session"),
@@ -195,19 +195,19 @@ build2 (void)
 	builder = gda_sql_builder_new (GDA_SQL_STATEMENT_INSERT);
 	gda_sql_builder_set_table (builder, "mytable");
 
-	gda_sql_builder_add_field (builder,
+	gda_sql_builder_add_field_id (builder,
 				   gda_sql_builder_add_id (builder, 0, "session"),
 				   gda_sql_builder_add_param (builder, 0, "session", G_TYPE_INT, FALSE));
-	gda_sql_builder_add_field (builder,
+	gda_sql_builder_add_field_id (builder,
 				   gda_sql_builder_add_id (builder, 0, "type"),
 				   gda_sql_builder_add_param (builder, 0, "type", G_TYPE_INT, FALSE));
-	gda_sql_builder_add_field (builder,
+	gda_sql_builder_add_field_id (builder,
 				   gda_sql_builder_add_id (builder, 0, "name"),
 				   gda_sql_builder_add_param (builder, 0, "name", G_TYPE_STRING, TRUE));
-	gda_sql_builder_add_field (builder,
+	gda_sql_builder_add_field_id (builder,
 				   gda_sql_builder_add_id (builder, 0, "contents"),
 				   gda_sql_builder_add_param (builder, 0, "contents", G_TYPE_STRING, FALSE));
-	gda_sql_builder_add_field (builder,
+	gda_sql_builder_add_field_id (builder,
 				   gda_sql_builder_add_id (builder, 0, "descr"),
 				   gda_sql_builder_add_param (builder, 0, "descr", G_TYPE_STRING, TRUE));
 
@@ -229,13 +229,13 @@ build3 (void)
 	builder = gda_sql_builder_new (GDA_SQL_STATEMENT_UPDATE);
 	gda_sql_builder_set_table (builder, "mytable");
 
-	gda_sql_builder_add_field (builder,
+	gda_sql_builder_add_field_id (builder,
 				   gda_sql_builder_add_id (builder, 0, "name"),
 				   gda_sql_builder_add_param (builder, 0, "name", G_TYPE_STRING, TRUE));
-	gda_sql_builder_add_field (builder,
+	gda_sql_builder_add_field_id (builder,
 				   gda_sql_builder_add_id (builder, 0, "contents"),
 				   gda_sql_builder_add_param (builder, 0, "contents", G_TYPE_STRING, FALSE));
-	gda_sql_builder_add_field (builder,
+	gda_sql_builder_add_field_id (builder,
 				   gda_sql_builder_add_id (builder, 0, "descr"),
 				   gda_sql_builder_add_param (builder, 0, "descr", G_TYPE_STRING, TRUE));
 
@@ -263,7 +263,7 @@ build4 (void)
 	guint t1, t2;
 
 	b = gda_sql_builder_new (GDA_SQL_STATEMENT_SELECT);
-	gda_sql_builder_add_field (b,
+	gda_sql_builder_add_field_id (b,
 				   gda_sql_builder_add_id (b, 0, "fav.*"), 0);
 	t1 = gda_sql_builder_select_add_target (b, 0,
 						gda_sql_builder_add_id (b, 0, "mytable"),
@@ -304,7 +304,7 @@ build5 (void)
 	GdaSqlStatement *stmt;
 
 	b = gda_sql_builder_new (GDA_SQL_STATEMENT_SELECT);
-	gda_sql_builder_add_field (b,
+	gda_sql_builder_add_field_id (b,
 				   gda_sql_builder_add_id (b, 0, "id"), 0);
 	gda_sql_builder_select_add_target (b, 0,
 					   gda_sql_builder_add_id (b, 0, "mytable"),
@@ -335,8 +335,8 @@ build6 (void)
 	GdaSqlStatement *stmt;
 
 	b = gda_sql_builder_new (GDA_SQL_STATEMENT_SELECT);
-	gda_sql_builder_add_field (b, gda_sql_builder_add_id (b, 0, "fav_id"), 0);
-	gda_sql_builder_add_field (b, gda_sql_builder_add_id (b, 0, "rank"), 0);
+	gda_sql_builder_add_field_id (b, gda_sql_builder_add_id (b, 0, "fav_id"), 0);
+	gda_sql_builder_add_field_id (b, gda_sql_builder_add_id (b, 0, "rank"), 0);
 
 	gda_sql_builder_select_add_target (b, 0,
 					   gda_sql_builder_add_id (b, 0, "mytable"),
@@ -366,7 +366,7 @@ build7 (void)
 
 	b = gda_sql_builder_new (GDA_SQL_STATEMENT_UPDATE);
 	gda_sql_builder_set_table (b, "mytable");
-	gda_sql_builder_add_field (b,
+	gda_sql_builder_add_field_id (b,
 				   gda_sql_builder_add_id (b, 0, "rank"),
 				   gda_sql_builder_add_param (b, 0, "newrank", G_TYPE_INT, FALSE));
 	gda_sql_builder_add_cond (b, 1, GDA_SQL_OPERATOR_TYPE_EQ,
diff --git a/tools/browser/browser-favorites.c b/tools/browser/browser-favorites.c
index f45ad94..4d21999 100644
--- a/tools/browser/browser-favorites.c
+++ b/tools/browser/browser-favorites.c
@@ -242,7 +242,7 @@ find_favorite_position (BrowserFavorites *bfav, gint fav_id, gint order_key)
 	g_return_val_if_fail (fav_id >= 0, -1);
 
 	b = gda_sql_builder_new (GDA_SQL_STATEMENT_SELECT);
-	gda_sql_builder_add_field (b,
+	gda_sql_builder_add_field_id (b,
 				   gda_sql_builder_add_id (b, 0, "rank"), 0);
 	gda_sql_builder_select_add_target (b, 0,
 					   gda_sql_builder_add_id (b, 0, FAVORDER_TABLE_NAME),
@@ -307,15 +307,15 @@ find_favorite (BrowserFavorites *bfav, guint session_id, gint id, const gchar *c
 	g_return_val_if_fail ((id >= 0) || contents, -1);
 
 	b = gda_sql_builder_new (GDA_SQL_STATEMENT_SELECT);
-	gda_sql_builder_add_field (b,
+	gda_sql_builder_add_field_id (b,
 				   gda_sql_builder_add_id (b, 0, "id"), 0);
-	gda_sql_builder_add_field (b,
+	gda_sql_builder_add_field_id (b,
 				   gda_sql_builder_add_id (b, 0, "type"), 0);
-	gda_sql_builder_add_field (b,
+	gda_sql_builder_add_field_id (b,
 				   gda_sql_builder_add_id (b, 0, "name"), 0);
-	gda_sql_builder_add_field (b,
+	gda_sql_builder_add_field_id (b,
 				   gda_sql_builder_add_id (b, 0, "descr"), 0);
-	gda_sql_builder_add_field (b,
+	gda_sql_builder_add_field_id (b,
 				   gda_sql_builder_add_id (b, 0, "contents"), 0);
 	gda_sql_builder_select_add_target (b, 0,
 					   gda_sql_builder_add_id (b, 0, FAVORITES_TABLE_NAME),
@@ -397,7 +397,7 @@ favorites_reorder (BrowserFavorites *bfav, gint order_key, gint id, gint new_pos
 	g_assert (order_key >= 0);
 
 	b = gda_sql_builder_new (GDA_SQL_STATEMENT_SELECT);
-	gda_sql_builder_add_field (b, gda_sql_builder_add_id (b, 0, "fav_id"), 0);
+	gda_sql_builder_add_field_id (b, gda_sql_builder_add_id (b, 0, "fav_id"), 0);
 
 	gda_sql_builder_select_add_target (b, 0,
 					   gda_sql_builder_add_id (b, 0, FAVORDER_TABLE_NAME),
@@ -433,7 +433,7 @@ favorites_reorder (BrowserFavorites *bfav, gint order_key, gint id, gint new_pos
 
 	b = gda_sql_builder_new (GDA_SQL_STATEMENT_UPDATE);
 	gda_sql_builder_set_table (b, FAVORDER_TABLE_NAME);
-	gda_sql_builder_add_field (b,
+	gda_sql_builder_add_field_id (b,
 				   gda_sql_builder_add_id (b, 0, "rank"),
 				   gda_sql_builder_add_param (b, 0, "rank", G_TYPE_INT, FALSE));
 	gda_sql_builder_add_cond (b, 1, GDA_SQL_OPERATOR_TYPE_EQ,
@@ -559,19 +559,19 @@ browser_favorites_add (BrowserFavorites *bfav, guint session_id,
 		builder = gda_sql_builder_new (GDA_SQL_STATEMENT_INSERT);
 		gda_sql_builder_set_table (builder, FAVORITES_TABLE_NAME);
 
-		gda_sql_builder_add_field (builder,
+		gda_sql_builder_add_field_id (builder,
 					   gda_sql_builder_add_id (builder, 0, "session"),
 					   gda_sql_builder_add_param (builder, 0, "session", G_TYPE_INT, FALSE));
-		gda_sql_builder_add_field (builder,
+		gda_sql_builder_add_field_id (builder,
 					   gda_sql_builder_add_id (builder, 0, "type"),
 					   gda_sql_builder_add_param (builder, 0, "type", G_TYPE_INT, FALSE));
-		gda_sql_builder_add_field (builder,
+		gda_sql_builder_add_field_id (builder,
 					   gda_sql_builder_add_id (builder, 0, "name"),
 					   gda_sql_builder_add_param (builder, 0, "name", G_TYPE_STRING, TRUE));
-		gda_sql_builder_add_field (builder,
+		gda_sql_builder_add_field_id (builder,
 					   gda_sql_builder_add_id (builder, 0, "contents"),
 					   gda_sql_builder_add_param (builder, 0, "contents", G_TYPE_STRING, FALSE));
-		gda_sql_builder_add_field (builder,
+		gda_sql_builder_add_field_id (builder,
 					   gda_sql_builder_add_id (builder, 0, "descr"),
 					   gda_sql_builder_add_param (builder, 0, "descr", G_TYPE_STRING, TRUE));
 		stmt = gda_sql_builder_get_statement (builder, error);
@@ -596,13 +596,13 @@ browser_favorites_add (BrowserFavorites *bfav, guint session_id,
 		builder = gda_sql_builder_new (GDA_SQL_STATEMENT_UPDATE);
 		gda_sql_builder_set_table (builder, FAVORITES_TABLE_NAME);
 
-		gda_sql_builder_add_field (builder,
+		gda_sql_builder_add_field_id (builder,
 					   gda_sql_builder_add_id (builder, 0, "name"),
 					   gda_sql_builder_add_param (builder, 0, "name", G_TYPE_STRING, TRUE));
-		gda_sql_builder_add_field (builder,
+		gda_sql_builder_add_field_id (builder,
 					   gda_sql_builder_add_id (builder, 0, "contents"),
 					   gda_sql_builder_add_param (builder, 0, "contents", G_TYPE_STRING, FALSE));
-		gda_sql_builder_add_field (builder,
+		gda_sql_builder_add_field_id (builder,
 					   gda_sql_builder_add_id (builder, 0, "descr"),
 					   gda_sql_builder_add_param (builder, 0, "descr", G_TYPE_STRING, TRUE));
 
@@ -613,11 +613,11 @@ browser_favorites_add (BrowserFavorites *bfav, guint session_id,
 								 0));
 		if (fav->id == favid) {
 			/* alter name and description only if fav->id was OK */
-			gda_sql_builder_add_field (builder,
+			gda_sql_builder_add_field_id (builder,
 						   gda_sql_builder_add_id (builder, 0, "name"),
 						   gda_sql_builder_add_param (builder, 0, "name", G_TYPE_STRING,
 									  TRUE));
-			gda_sql_builder_add_field (builder,
+			gda_sql_builder_add_field_id (builder,
 						   gda_sql_builder_add_id (builder, 0, "descr"),
 						   gda_sql_builder_add_param (builder, 0, "descr", G_TYPE_STRING,
 									  TRUE));
@@ -673,13 +673,13 @@ browser_favorites_add (BrowserFavorites *bfav, guint session_id,
 
 		builder = gda_sql_builder_new (GDA_SQL_STATEMENT_INSERT);
 		gda_sql_builder_set_table (builder, FAVORDER_TABLE_NAME);
-		gda_sql_builder_add_field (builder,
+		gda_sql_builder_add_field_id (builder,
 					   gda_sql_builder_add_id (builder, 0, "fav_id"),
 					   gda_sql_builder_add_param (builder, 0, "id", G_TYPE_INT, FALSE));
-		gda_sql_builder_add_field (builder,
+		gda_sql_builder_add_field_id (builder,
 					   gda_sql_builder_add_id (builder, 0, "rank"),
 					   gda_sql_builder_add_param (builder, 0, "rank", G_TYPE_INT, FALSE));
-		gda_sql_builder_add_field (builder,
+		gda_sql_builder_add_field_id (builder,
 					   gda_sql_builder_add_id (builder, 0, "order_key"),
 					   gda_sql_builder_add_param (builder, 0, "orderkey", G_TYPE_STRING, TRUE));
 		stmt = gda_sql_builder_get_statement (builder, error);
@@ -791,15 +791,15 @@ browser_favorites_list (BrowserFavorites *bfav, guint session_id, BrowserFavorit
 		return NULL;
 
 	b = gda_sql_builder_new (GDA_SQL_STATEMENT_SELECT);
-	gda_sql_builder_add_field (b,
+	gda_sql_builder_add_field_id (b,
 				   gda_sql_builder_add_id (b, 0, "fav.contents"), 0);
-	gda_sql_builder_add_field (b,
+	gda_sql_builder_add_field_id (b,
 				   gda_sql_builder_add_id (b, 0, "fav.descr"), 0);
-	gda_sql_builder_add_field (b,
+	gda_sql_builder_add_field_id (b,
 				   gda_sql_builder_add_id (b, 0, "fav.name"), 0);
-	gda_sql_builder_add_field (b,
+	gda_sql_builder_add_field_id (b,
 				   gda_sql_builder_add_id (b, 0, "fav.type"), 0);
-	gda_sql_builder_add_field (b,
+	gda_sql_builder_add_field_id (b,
 				   gda_sql_builder_add_id (b, 0, "fav.id"), 0);
 
 	t1 = gda_sql_builder_select_add_target (b, 0,
@@ -1088,15 +1088,15 @@ browser_favorites_get (BrowserFavorites *bfav, gint fav_id,
 	memset (out_fav, 0, sizeof (BrowserFavoritesAttributes));
 
 	b = gda_sql_builder_new (GDA_SQL_STATEMENT_SELECT);
-	gda_sql_builder_add_field (b,
+	gda_sql_builder_add_field_id (b,
 				   gda_sql_builder_add_id (b, 0, "id"), 0);
-	gda_sql_builder_add_field (b,
+	gda_sql_builder_add_field_id (b,
 				   gda_sql_builder_add_id (b, 0, "type"), 0);
-	gda_sql_builder_add_field (b,
+	gda_sql_builder_add_field_id (b,
 				   gda_sql_builder_add_id (b, 0, "name"), 0);
-	gda_sql_builder_add_field (b,
+	gda_sql_builder_add_field_id (b,
 				   gda_sql_builder_add_id (b, 0, "descr"), 0);
-	gda_sql_builder_add_field (b,
+	gda_sql_builder_add_field_id (b,
 				   gda_sql_builder_add_id (b, 0, "contents"), 0);
 	gda_sql_builder_select_add_target (b, 0,
 					   gda_sql_builder_add_id (b, 0, FAVORITES_TABLE_NAME),



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]