I've created Bug report #579513 for this problem.

2009/4/18 Daniel Espinosa <[email protected]>

> I have the following SQL statement:
>
> SELECT sum (amount) FROM transactions \
>                                     WHERE debit in \
>                                      (SELECT id FROM accounts \
>                                       WHERE parent in \
>                                       (SELECT id FROM accounts WHERE id =
> ##account::int or parent = ##account::int) \
>                                       UNION SELECT id FROM accounts WHERE
> id = ##account::int)
>
> I'm using a PostgreSQL DB, when translate this command to use directly to
> psql and it runs correctly.
>
> SELECT sum (amount) FROM transactions WHERE debit in (SELECT id FROM
> accounts WHERE parent in (SELECT id FROM accounts WHERE id = 5 or parent =
> 5) UNION SELECT id FROM accounts WHERE id = 5)
>
> result:
>
> sum
> ______
>
> 544000
> (1 row)
>
> DB definition is attached made by pg_dump
>
> When try to render it and run that statement using the following code:
>
> I get the following messages at runtime using TRUNK Revision 3374 or using
> GDA version 4.0.2 compiled from sources:
>
> Calculating Balance...
> Parsed CREDIT
> Getted Parameters...
> Setted account ID...
>
> ** (libcash_test:6063): CRITICAL **: default_render_select: assertion
> `GDA_SQL_ANY_PART (stmt)->type == GDA_SQL_ANY_STMT_SELECT' failed
> SQL for SUM CREDIT: (null)
> ** (libcash_test:6063): CRITICAL **: default_render_select: assertion
> `GDA_SQL_ANY_PART (stmt)->type == GDA_SQL_ANY_STMT_SELECT' failed
>
> ** (libcash_test:6063): CRITICAL **: default_render_select: assertion
> `GDA_SQL_ANY_PART (stmt)->type == GDA_SQL_ANY_STMT_SELECT' failed
>
>
>
> As you can see when try to print the SQL statement using
> gda_connection_statement_to_sql returns NULL.
>
>
> >>>>>>>>>>CODE>>>>>>>>>>>>>><
> gpointer
> get_balance (GValue *id, GdaConnection *cnc, GError **error)
> {
>
>         GdaSqlParser *parser;
>         GdaStatement *debit = NULL;
>         GdaStatement *credit = NULL;
>         GdaSet *debit_params, *credit_params;
>         GdaDataModel *sum_credit, *sum_debit;
>         const GValue *val_sum_debit, *val_sum_credit;
>         gdouble amount;
>
>         static gchar *sql_debit = "SELECT sum (amount) FROM transactions \
>                                     WHERE debit in \
>                                      (SELECT id FROM accounts \
>                                       WHERE parent in \
>                                       (SELECT id FROM accounts WHERE id =
> ##account::int or parent = ##account::int) \
>                                       UNION SELECT id FROM accounts WHERE
> id = ##account::int)";
>
>         static gchar *sql_credit = "SELECT sum (amount) FROM transactions \
>                                     WHERE credit in \
>                                      (SELECT id FROM accounts \
>                                       WHERE parent in \
>                                       (SELECT id FROM accounts WHERE id =
> ##account::int or parent = ##account::int) \
>                                       UNION SELECT id FROM accounts WHERE
> id = ##account::int)";
>
>         g_print ("Calculating Balance...\n");
>
>         if (!G_IS_VALUE (id))
>             return NULL;
>
>         parser = gda_sql_parser_new ();
>
>         /* Get CREDIT SUM */
>         credit = gda_sql_parser_parse_string (parser, sql_credit, NULL,
> error);
>
>         if (!GDA_IS_STATEMENT (credit))
>             return NULL;
>         g_print ("Parsed CREDIT\n");
>         if (!gda_statement_get_parameters (credit, &credit_params, error))
> {
>             g_object_unref (credit);
>             return NULL;
>         }
>         g_print ("Getted Parameters...\n");
>         if (!gda_set_set_holder_value (credit_params, error, "account",
> id)) {
>             g_object_unref (credit);
>             g_object_unref (credit_params);
>             return NULL;
>         }
>         g_print ("Setted account ID...\n");
>         g_print ("SQL for SUM CREDIT: %s",
>                  gda_connection_statement_to_sql (cnc, credit,
>                                                   credit_params,
>                                                   GDA_STATEMENT_SQL_PRETTY,
>                                                   NULL, NULL));
>         sum_credit = gda_connection_statement_execute_select (cnc,
>                                                        credit,
>                                                        credit_params,
>                                                        error);
>         g_object_unref (credit);
>         g_object_unref (credit_params);
>
>         if (!GDA_IS_DATA_MODEL(sum_credit))
>             return NULL;
>
>         g_print ("Getted sum of Credits...\n");
>
>         // Get DEBIT SUM
>         debit = gda_sql_parser_parse_string (parser, sql_debit, NULL,
> error);
>         if (!GDA_IS_STATEMENT (debit)) {
>             g_object_unref (sum_credit);
>             return NULL;
>         }
>
>         if (!gda_statement_get_parameters (debit, &debit_params, error)) {
>             g_object_unref (debit);
>             g_object_unref (sum_credit);
>             return NULL;
>         }
>
>         if (!gda_set_set_holder_value (debit_params, error, "account", id))
> {
>             g_object_unref (debit);
>             g_object_unref (debit_params);
>             g_object_unref (sum_credit);
>             return NULL;
>         }
>
>         sum_debit = gda_connection_statement_execute_select (cnc,
>                                                              debit,
>                                                              debit_params,
>                                                              error);
>         g_object_unref (debit);
>         g_object_unref (debit_params);
>
>         if (!GDA_IS_DATA_MODEL(sum_debit)) {
>             g_object_unref (sum_credit);
>             return NULL;
>         }
>         g_print ("Getted sum of Credits...\n");
>
>         /* Calculating balance amount */
>         val_sum_debit = gda_data_model_get_value_at (sum_debit, 0, 0,
> error);
>
>         if (!G_IS_VALUE (val_sum_debit)) {
>             g_object_unref (sum_credit);
>             g_object_unref (sum_debit);
>             return NULL;
>         }
>
>         val_sum_credit = gda_data_model_get_value_at (sum_credit, 0, 0,
> error);
>
>         if (! G_IS_VALUE (val_sum_credit)) {
>             g_object_unref (sum_credit);
>             g_object_unref (sum_debit);
>             return NULL;
>         }
>
>         amount = g_value_get_double (val_sum_debit) - g_value_get_double
> (val_sum_credit);
>
>         g_print ("BALANCE: %f", amount);
>
>     return NULL;
> }
>
> --
> Trabajar, la mejor arma para tu superación
> "de grano en grano, se hace la arena" (R) (en trámite, pero para los
> cuates: LIBRE)
>



-- 
Trabajar, la mejor arma para tu superación
"de grano en grano, se hace la arena" (R) (en trámite, pero para los cuates:
LIBRE)
_______________________________________________
gnome-db-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/gnome-db-list

Reply via email to