static rasqal_row* rasqal_distinct_rowsource_read_row(rasqal_rowsource* rowsource, void *user_data) { rasqal_distinct_rowsource_context *con; rasqal_row *row = NULL; con = (rasqal_distinct_rowsource_context*)user_data; while(1) { int result; row = rasqal_rowsource_read_row(con->rowsource); if(!row) break; result = rasqal_engine_rowsort_map_add_row(con->map, row); RASQAL_DEBUG2("row is %s\n", result ? "not distinct" : "distinct"); if(!result) /* row was distinct (not a duplicate) so return it */ break; } if(row) { row = rasqal_new_row_from_row(row); row->rowsource = rowsource; row->offset = con->offset++; } return row; }
static void rasqal_rowsource_sparql_xml_process(rasqal_rowsource_sparql_xml_context* con) { if(raptor_sequence_size(con->results_sequence) && con->variables_count > 0) return; /* do some parsing - need some results */ while(!raptor_iostream_read_eof(con->iostr)) { size_t read_len; read_len = raptor_iostream_read_bytes((char*)con->buffer, 1, FILE_READ_BUF_SIZE, con->iostr); if(read_len > 0) { RASQAL_DEBUG2("processing %d bytes\n", (int)read_len); raptor_sax2_parse_chunk(con->sax2, con->buffer, read_len, 0); con->locator.byte += read_len; } if(read_len < FILE_READ_BUF_SIZE) { /* finished */ raptor_sax2_parse_chunk(con->sax2, NULL, 0, 1); break; } /* end with variables sequence done AND at least one row */ if(con->variables_count > 0 && raptor_sequence_size(con->results_sequence) > 0) break; } }
/* * rasqal_expression_evaluate_in_set: * @e: The expression to evaluate. * @eval_context: Evaluation context * * INTERNAL - Evaluate RASQAL_EXPR_IN and RASQAL_EXPR_NOT_IN (expr, * expr list) expression. * * Return value: A #rasqal_literal boolean value or NULL on failure. */ static rasqal_literal* rasqal_expression_evaluate_in_set(rasqal_expression *e, rasqal_evaluation_context *eval_context, int *error_p) { rasqal_world* world = eval_context->world; int size = raptor_sequence_size(e->args); int i; rasqal_literal* l1; int found = 0; l1 = rasqal_expression_evaluate2(e->arg1, eval_context, error_p); if(*error_p || !l1) goto failed; for(i = 0; i < size; i++) { rasqal_expression* arg_e; rasqal_literal* arg_literal; arg_e = (rasqal_expression*)raptor_sequence_get_at(e->args, i); arg_literal = rasqal_expression_evaluate2(arg_e, eval_context, error_p); if(!arg_literal) goto failed; found = (rasqal_literal_equals_flags(l1, arg_literal, eval_context->flags, error_p) != 0); #if RASQAL_DEBUG > 1 if(*error_p) RASQAL_DEBUG1("rasqal_literal_equals_flags() returned: FAILURE\n"); else RASQAL_DEBUG2("rasqal_literal_equals_flags() returned: %d\n", found); #endif rasqal_free_literal(arg_literal); if(*error_p) goto failed; if(found) /* found - terminate search */ break; } rasqal_free_literal(l1); if(e->op == RASQAL_EXPR_NOT_IN) found = !found; return rasqal_new_boolean_literal(world, found); failed: if(error_p) *error_p = 1; if(l1) rasqal_free_literal(l1); return NULL; }
/** * rasqal_new_rowsource_from_handler: * @query: query object * @user_data: pointer to context information to pass in to calls * @handler: pointer to handler methods * @vars_table: variables table to use for rows (or NULL) * @flags: 0 (none defined so far) * * Create a new rowsource over a user-defined handler. * * Return value: new #rasqal_rowsource object or NULL on failure **/ rasqal_rowsource* rasqal_new_rowsource_from_handler(rasqal_world* world, rasqal_query* query, void *user_data, const rasqal_rowsource_handler *handler, rasqal_variables_table* vars_table, int flags) { rasqal_rowsource* rowsource; if(!world || !handler) return NULL; if(handler->version < 1 || handler->version > 1) return NULL; rowsource = RASQAL_CALLOC(rasqal_rowsource*, 1, sizeof(*rowsource)); if(!rowsource) { if(handler->finish) handler->finish(NULL, user_data); return NULL; } rowsource->usage = 1; rowsource->world = world; rowsource->query = query; rowsource->user_data = (void*)user_data; rowsource->handler = handler; rowsource->flags = flags; rowsource->size = 0; rowsource->generate_group = 0; if(vars_table) rowsource->vars_table = rasqal_new_variables_table_from_variables_table(vars_table); else rowsource->vars_table = NULL; rowsource->variables_sequence = raptor_new_sequence((raptor_data_free_handler)rasqal_free_variable, (raptor_data_print_handler)rasqal_variable_print); if(!rowsource->variables_sequence) { rasqal_free_rowsource(rowsource); return NULL; } if(rowsource->handler->init && rowsource->handler->init(rowsource, rowsource->user_data)) { RASQAL_DEBUG2("rowsource %s init failed\n", rowsource->handler->name); rasqal_free_rowsource(rowsource); return NULL; } return rowsource; }
/** * rasqal_variable_set_value: * @v: the #rasqal_variable object * @l: the #rasqal_literal value to set (or NULL) * * Set the value of a Rasqal variable. * * The variable value is an input parameter and is copied in, not shared. * If the variable value is NULL, any existing value is deleted. * **/ void rasqal_variable_set_value(rasqal_variable* v, rasqal_literal* l) { if(v->value) rasqal_free_literal(v->value); v->value = l; #ifdef RASQAL_DEBUG if(!v->name) RASQAL_FATAL1("variable has no name"); RASQAL_DEBUG2("setting variable %s to value ", v->name); rasqal_literal_print(v->value, stderr); fputc('\n', stderr); #endif }
static int rasqal_ntriples_term_valid(unsigned char c, int position, rasqal_ntriples_term_class term_class) { int result = 0; switch(term_class) { case RASQAL_TERM_CLASS_URI: /* ends on > */ result = (c != '>'); break; case RASQAL_TERM_CLASS_BNODEID: /* ends on first non [A-Za-z0-9_:][-.A-Za-z0-9]* */ result = IS_ASCII_ALPHA(c) || IS_ASCII_DIGIT(c) || c == '_' || c == ':'; if(position) /* FIXME * This isn't correct; '.' is allowed in positions 1..N-1 but * this calling convention of character-by-character cannot * check this. */ result = (result || c == '-' || c == '.'); break; case RASQAL_TERM_CLASS_STRING: /* ends on " */ result = (c != '"'); break; case RASQAL_TERM_CLASS_LANGUAGE: /* ends on first non [a-zA-Z]+ ('-' [a-zA-Z0-9]+ )? */ result = IS_ASCII_ALPHA(c); if(position) result = (result || IS_ASCII_DIGIT(c) || c == '-'); break; default: RASQAL_DEBUG2("Unknown N-Triples term class %d", term_class); } return result; }
static int rasqal_graph_next_dg(rasqal_graph_rowsource_context *con) { rasqal_query *query = con->rowsource->query; rasqal_data_graph *dg; con->finished = 0; while(1) { rasqal_literal *o; con->dg_offset++; dg = rasqal_query_get_data_graph(query, con->dg_offset); if(!dg) { con->finished = 1; break; } if(!dg->name_uri) continue; o = rasqal_new_uri_literal(query->world, raptor_uri_copy(dg->name_uri)); if(!o) { RASQAL_DEBUG1("Failed to create new URI literal\n"); con->finished = 1; break; } RASQAL_DEBUG2("Using data graph URI literal <%s>\n", rasqal_literal_as_string(o)); rasqal_rowsource_set_origin(con->rowsource, o); /* this passes ownership of o to con->var */ rasqal_variable_set_value(con->var, o); break; } return con->finished; }
/** * rasqal_engine_rowsort_row_compare: * @user_data: comparison user data pointer * @a: pointer to address of first #row * @b: pointer to address of second #row * * INTERNAL - compare two pointers to #row objects * * Suitable for use as a compare function in qsort_r() or similar. * * Return value: <0, 0 or >1 comparison */ static int rasqal_engine_rowsort_row_compare(void* user_data, const void *a, const void *b) { rasqal_row* row_a; rasqal_row* row_b; rowsort_compare_data* rcd; int result = 0; rcd = (rowsort_compare_data*)user_data; row_a = *(rasqal_row**)a; row_b = *(rasqal_row**)b; if(rcd->is_distinct) { result = !rasqal_literal_array_equals(row_a->values, row_b->values, row_a->size); if(!result) /* duplicate, so return that */ return 0; } /* now order it */ if(rcd->order_conditions_sequence) result = rasqal_literal_array_compare(row_a->order_values, row_b->order_values, rcd->order_conditions_sequence, row_a->order_size, rcd->compare_flags); /* still equal? make sort stable by using the original order */ if(!result) { result = row_a->offset - row_b->offset; RASQAL_DEBUG2("Got equality result so using offsets, returning %d\n", result); } return result; }
/* * rasqal_expression_evaluate_sameterm: * @e: The expression to evaluate. * @eval_context: Evaluation context * * INTERNAL - Evaluate RASQAL_EXPR_SAMETERM (expr1, expr2) expressions. * * Return value: A #rasqal_literal boolean value or NULL on failure. */ static rasqal_literal* rasqal_expression_evaluate_sameterm(rasqal_expression *e, rasqal_evaluation_context *eval_context, int *error_p) { rasqal_world* world = eval_context->world; rasqal_literal* l1; rasqal_literal* l2; int b; l1 = rasqal_expression_evaluate2(e->arg1, eval_context, error_p); if(*error_p || !l1) goto failed; l2 = rasqal_expression_evaluate2(e->arg2, eval_context, error_p); if(*error_p || !l2) goto failed; b = rasqal_literal_same_term(l1, l2); #if RASQAL_DEBUG > 1 RASQAL_DEBUG2("rasqal_literal_same_term() returned: %d\n", b); #endif rasqal_free_literal(l1); rasqal_free_literal(l2); return rasqal_new_boolean_literal(world, b); failed: if(error_p) *error_p = 1; if(l1) rasqal_free_literal(l1); return NULL; }
static int rasqal_join_rowsource_init(rasqal_rowsource* rowsource, void *user_data) { rasqal_join_rowsource_context* con; rasqal_variables_table* vars_table; con = (rasqal_join_rowsource_context*)user_data; con->failed = 0; con->state = JS_START; con->constant_join_condition = -1; /* If join condition is a constant - optimize it away */ if(con->expr && rasqal_expression_is_constant(con->expr)) { rasqal_query *query = rowsource->query; rasqal_literal* result; int bresult; int error = 0; result = rasqal_expression_evaluate2(con->expr, query->eval_context, &error); #ifdef RASQAL_DEBUG RASQAL_DEBUG1("join expression condition is constant: "); if(error) fputs("type error", DEBUG_FH); else rasqal_literal_print(result, DEBUG_FH); fputc('\n', DEBUG_FH); #endif if(error) { bresult = 0; } else { error = 0; bresult = rasqal_literal_as_boolean(result, &error); #ifdef RASQAL_DEBUG if(error) RASQAL_DEBUG1("join boolean expression returned error\n"); else RASQAL_DEBUG2("join boolean expression result: %d\n", bresult); #endif rasqal_free_literal(result); } /* free expression always */ rasqal_free_expression(con->expr); con->expr = NULL; if(con->join_type == RASQAL_JOIN_TYPE_NATURAL) { if(!bresult) { /* Constraint is always false so row source is finished */ con->state = JS_FINISHED; } /* otherwise always true so no need to evaluate on each row * and deleting con->expr will handle that */ } con->constant_join_condition = bresult; } rasqal_rowsource_set_requirements(con->left, RASQAL_ROWSOURCE_REQUIRE_RESET); rasqal_rowsource_set_requirements(con->right, RASQAL_ROWSOURCE_REQUIRE_RESET); vars_table = con->left->vars_table; con->rc_map = rasqal_new_row_compatible(vars_table, con->left, con->right); if(!con->rc_map) return -1; #ifdef RASQAL_DEBUG RASQAL_DEBUG2("rowsource %p ", rowsource); rasqal_print_row_compatible(stderr, con->rc_map); #endif return 0; }
static rasqal_row* rasqal_join_rowsource_read_row(rasqal_rowsource* rowsource, void *user_data) { rasqal_join_rowsource_context* con; rasqal_row* row = NULL; rasqal_query *query = rowsource->query; con = (rasqal_join_rowsource_context*)user_data; if(con->failed || con->state == JS_FINISHED) return NULL; while(1) { rasqal_row *right_row; int bresult = 1; int compatible = 1; if(con->state == JS_START) { /* start / re-start left */ if(con->left_row) rasqal_free_row(con->left_row); con->left_row = rasqal_rowsource_read_row(con->left); #ifdef RASQAL_DEBUG RASQAL_DEBUG2("rowsource %p read left row : ", rowsource); if(con->left_row) rasqal_row_print(con->left_row, stderr); else fputs("NONE", stderr); fputs("\n", stderr); #endif con->state = JS_INIT_RIGHT; } if(con->state == JS_INIT_RIGHT) { /* start right */ if(!con->left_row) { con->state = JS_FINISHED; return NULL; } con->right_rows_joined_count = 0; rasqal_rowsource_reset(con->right); } right_row = rasqal_rowsource_read_row(con->right); #ifdef RASQAL_DEBUG RASQAL_DEBUG2("rowsource %p read right row : ", rowsource); if(right_row) rasqal_row_print(right_row, stderr); else fputs("NONE", stderr); fputs("\n", stderr); #endif if(!right_row && con->state == JS_READ_RIGHT) { /* right has finished */ /* restart left */ con->state = JS_START; /* if all right table returned no bindings, return left row */ if(!con->right_rows_joined_count) { /* otherwise return LEFT or RIGHT row only */ if(con->join_type == RASQAL_JOIN_TYPE_LEFT) { /* LEFT JOIN - add left row if expr fails or not compatible */ if(con->left_row) { con->right_rows_joined_count++; row = rasqal_join_rowsource_build_merged_row(rowsource, con, NULL); break; } } } /* restart left by continuing the loop */ continue; } /* state is always JS_READ_RIGHT at this point */ con->state = JS_READ_RIGHT; /* now may have both left and right rows so compute compatibility */ if(right_row) { compatible = rasqal_row_compatible_check(con->rc_map, con->left_row, right_row); RASQAL_DEBUG2("join rows compatible: %s\n", compatible ? "YES" : "NO"); } if(con->constant_join_condition >= 0) { /* Get constant join expression value */ bresult = con->constant_join_condition; } else if(con->expr) { /* Check join expression if present */ rasqal_literal *result; int error = 0; result = rasqal_expression_evaluate2(con->expr, query->eval_context, &error); #ifdef RASQAL_DEBUG RASQAL_DEBUG1("join expression result: "); if(error) fputs("type error", DEBUG_FH); else rasqal_literal_print(result, DEBUG_FH); fputc('\n', DEBUG_FH); #endif if(error) { bresult = 0; } else { error = 0; bresult = rasqal_literal_as_boolean(result, &error); #ifdef RASQAL_DEBUG if(error) RASQAL_DEBUG1("filter boolean expression returned error\n"); else RASQAL_DEBUG2("filter boolean expression result: %d\n", bresult); #endif rasqal_free_literal(result); } } if(con->join_type == RASQAL_JOIN_TYPE_NATURAL) { /* found a row if compatible and constraint matches */ if(compatible && bresult && right_row) { con->right_rows_joined_count++; /* consumes right_row */ row = rasqal_join_rowsource_build_merged_row(rowsource, con, right_row); break; } } else if(con->join_type == RASQAL_JOIN_TYPE_LEFT) { /* * { merge(mu1, mu2) | mu1 in Omega1 and mu2 in Omega2, and mu1 * and mu2 are compatible and expr(merge(mu1, mu2)) is true } */ if(compatible && bresult) { con->right_rows_joined_count++; /* No constraint OR constraint & compatible so return merged row */ /* Compute row only now it is known to be needed (consumes right_row) */ row = rasqal_join_rowsource_build_merged_row(rowsource, con, right_row); break; } #if 0 /* * { mu1 | mu1 in Omega1 and mu2 in Omega2, and mu1 and mu2 are * not compatible } */ if(!compatible) { /* otherwise return LEFT or RIGHT row only */ if(con->join_type == RASQAL_JOIN_TYPE_LEFT) { /* LEFT JOIN - add left row if expr fails or not compatible */ if(con->left_row) { con->right_rows_joined_count++; row = rasqal_join_rowsource_build_merged_row(rowsource, con, NULL); if(right_row) rasqal_free_row(right_row); break; } } } #endif /* * { mu1 | mu1 in Omega1 and mu2 in Omega2, and mu1 and mu2 are * compatible and for all mu2, expr(merge(mu1, mu2)) is false } */ /* The above is handled using check for * !con->right_rows_joined_count earlier, to generate a row * once. */ } /* end if LEFT JOIN */ if(right_row) rasqal_free_row(right_row); } /* end while */ if(row) { rasqal_row_set_rowsource(row, rowsource); row->offset = con->offset++; rasqal_row_bind_variables(row, rowsource->query->vars_table); } return row; }
/** * rasqal_expression_evaluate2: * @e: The expression to evaluate. * @eval_context: expression context * @error_p: pointer to error return flag * * Evaluate a #rasqal_expression tree in the context of a * #rasqal_evaluation_context to give a #rasqal_literal result or error. * * Return value: a #rasqal_literal value or NULL (a valid value). @error_p is set to non-0 on failure. **/ rasqal_literal* rasqal_expression_evaluate2(rasqal_expression* e, rasqal_evaluation_context* eval_context, int *error_p) { rasqal_world *world; int flags; rasqal_literal* result = NULL; rasqal_literal *l1; rasqal_literal *l2; /* pack vars from different switch cases in unions to save some stack space */ union { struct { int e1; int e2; } errs; struct { int dummy_do_not_mask_e; int free_literal; } flags; int e; } errs; union { struct { int b1; int b2; } bools; int b; int i; raptor_uri *dt_uri; const unsigned char *s; unsigned char *new_s; rasqal_variable *v; rasqal_expression *e; struct { void *dummy_do_not_mask; int found; } flags; rasqal_xsd_datetime* dt; struct timeval *tv; raptor_stringbuffer* sb; } vars; RASQAL_ASSERT_OBJECT_POINTER_RETURN_VALUE(e, rasqal_expression, NULL); RASQAL_ASSERT_OBJECT_POINTER_RETURN_VALUE(eval_context, rasqal_evaluation_context, NULL); RASQAL_ASSERT_OBJECT_POINTER_RETURN_VALUE(error_p, intp, NULL); world = eval_context->world; flags = eval_context->flags; errs.e = 0; #ifdef RASQAL_DEBUG RASQAL_DEBUG2("evaluating expression %p: ", e); rasqal_expression_print(e, stderr); fprintf(stderr, "\n"); #endif switch(e->op) { case RASQAL_EXPR_AND: errs.errs.e1 = 0; l1 = rasqal_expression_evaluate2(e->arg1, eval_context, &errs.errs.e1); if(errs.errs.e1) { vars.bools.b1 = 0; } else { vars.bools.b1 = rasqal_literal_as_boolean(l1, &errs.errs.e1); rasqal_free_literal(l1); } errs.errs.e2 = 0; l1 = rasqal_expression_evaluate2(e->arg2, eval_context, &errs.errs.e2); if(errs.errs.e2) { vars.bools.b2 = 0; } else { vars.bools.b2 = rasqal_literal_as_boolean(l1, &errs.errs.e2); rasqal_free_literal(l1); } /* See http://www.w3.org/TR/2005/WD-rdf-sparql-query-20051123/#truthTable */ if(!errs.errs.e1 && !errs.errs.e2) { /* No type error, answer is A && B */ vars.b = vars.bools.b1 && vars.bools.b2; /* don't need b1,b2 anymore */ } else { if((!vars.bools.b1 && errs.errs.e2) || (errs.errs.e1 && vars.bools.b2)) /* F && E => F. E && F => F. */ vars.b = 0; else /* Otherwise E */ goto failed; } result = rasqal_new_boolean_literal(world, vars.b); break; case RASQAL_EXPR_OR: errs.errs.e1 = 0; l1 = rasqal_expression_evaluate2(e->arg1, eval_context, &errs.errs.e1); if(errs.errs.e1) { vars.bools.b1 = 0; } else { vars.bools.b1 = rasqal_literal_as_boolean(l1, &errs.errs.e1); rasqal_free_literal(l1); } errs.errs.e2 = 0; l1 = rasqal_expression_evaluate2(e->arg2, eval_context, &errs.errs.e2); if(errs.errs.e2) { vars.bools.b2 = 0; } else { vars.bools.b2 = rasqal_literal_as_boolean(l1, &errs.errs.e2); rasqal_free_literal(l1); } /* See http://www.w3.org/TR/2005/WD-rdf-sparql-query-20051123/#truthTable */ if(!errs.errs.e1 && !errs.errs.e2) { /* No type error, answer is A || B */ vars.b = vars.bools.b1 || vars.bools.b2; /* don't need b1,b2 anymore */ } else { if((vars.bools.b1 && errs.errs.e2) || (errs.errs.e1 && vars.bools.b2)) /* T || E => T. E || T => T */ vars.b = 1; else /* Otherwise E */ goto failed; } result = rasqal_new_boolean_literal(world, vars.b); break; case RASQAL_EXPR_EQ: l1 = rasqal_expression_evaluate2(e->arg1, eval_context, error_p); if(*error_p || !l1) goto failed; l2 = rasqal_expression_evaluate2(e->arg2, eval_context, error_p); if(*error_p || !l2) { rasqal_free_literal(l1); goto failed; } /* FIXME - this should probably be checked at literal creation * time */ if(!rasqal_xsd_datatype_check(l1->type, l1->string, flags) || !rasqal_xsd_datatype_check(l2->type, l2->string, flags)) { RASQAL_DEBUG1("One of the literals was invalid\n"); goto failed; } vars.b = (rasqal_literal_equals_flags(l1, l2, flags, &errs.e) != 0); #if RASQAL_DEBUG > 1 if(errs.e) RASQAL_DEBUG1("rasqal_literal_equals_flags returned: FAILURE\n"); else RASQAL_DEBUG2("rasqal_literal_equals_flags returned: %d\n", vars.b); #endif rasqal_free_literal(l1); rasqal_free_literal(l2); if(errs.e) goto failed; result = rasqal_new_boolean_literal(world, vars.b); break; case RASQAL_EXPR_NEQ: l1 = rasqal_expression_evaluate2(e->arg1, eval_context, error_p); if(*error_p || !l1) goto failed; l2 = rasqal_expression_evaluate2(e->arg2, eval_context, error_p); if(*error_p || !l2) { rasqal_free_literal(l1); goto failed; } vars.b = (rasqal_literal_not_equals_flags(l1, l2, flags, &errs.e) != 0); #if RASQAL_DEBUG > 1 if(errs.e) RASQAL_DEBUG1("rasqal_literal_not_equals_flags returned: FAILURE\n"); else RASQAL_DEBUG2("rasqal_literal_not_equals_flags returned: %d\n", vars.b); #endif rasqal_free_literal(l1); rasqal_free_literal(l2); if(errs.e) goto failed; result = rasqal_new_boolean_literal(world, vars.b); break; case RASQAL_EXPR_LT: l1 = rasqal_expression_evaluate2(e->arg1, eval_context, error_p); if(*error_p || !l1) goto failed; l2 = rasqal_expression_evaluate2(e->arg2, eval_context, error_p); if(*error_p || !l2) { rasqal_free_literal(l1); goto failed; } vars.b = (rasqal_literal_compare(l1, l2, flags, &errs.e) < 0); rasqal_free_literal(l1); rasqal_free_literal(l2); if(errs.e) goto failed; result = rasqal_new_boolean_literal(world, vars.b); break; case RASQAL_EXPR_GT: l1 = rasqal_expression_evaluate2(e->arg1, eval_context, error_p); if(*error_p || !l1) goto failed; l2 = rasqal_expression_evaluate2(e->arg2, eval_context, error_p); if(*error_p || !l2) { rasqal_free_literal(l1); goto failed; } vars.b = (rasqal_literal_compare(l1, l2, flags, &errs.e) > 0); rasqal_free_literal(l1); rasqal_free_literal(l2); if(errs.e) goto failed; result = rasqal_new_boolean_literal(world, vars.b); break; case RASQAL_EXPR_LE: l1 = rasqal_expression_evaluate2(e->arg1, eval_context, error_p); if(*error_p || !l1) goto failed; l2 = rasqal_expression_evaluate2(e->arg2, eval_context, error_p); if(*error_p || !l2) { rasqal_free_literal(l1); goto failed; } vars.b = (rasqal_literal_compare(l1, l2, flags, &errs.e) <= 0); rasqal_free_literal(l1); rasqal_free_literal(l2); if(errs.e) goto failed; result = rasqal_new_boolean_literal(world, vars.b); break; case RASQAL_EXPR_GE: l1 = rasqal_expression_evaluate2(e->arg1, eval_context, error_p); if(*error_p || !l1) goto failed; l2 = rasqal_expression_evaluate2(e->arg2, eval_context, error_p); if(*error_p || !l2) { rasqal_free_literal(l1); goto failed; } vars.b = (rasqal_literal_compare(l1, l2, flags, &errs.e) >= 0); rasqal_free_literal(l1); rasqal_free_literal(l2); if(errs.e) goto failed; result = rasqal_new_boolean_literal(world, vars.b); break; case RASQAL_EXPR_UMINUS: l1 = rasqal_expression_evaluate2(e->arg1, eval_context, error_p); if(*error_p || !l1) goto failed; result = rasqal_literal_negate(l1, &errs.e); rasqal_free_literal(l1); if(errs.e) goto failed; break; case RASQAL_EXPR_BOUND: result = rasqal_expression_evaluate_bound(e, eval_context, error_p); break; case RASQAL_EXPR_STR: result = rasqal_expression_evaluate_str(e, eval_context, error_p); break; case RASQAL_EXPR_LANG: result = rasqal_expression_evaluate_lang(e, eval_context, error_p); break; case RASQAL_EXPR_LANGMATCHES: result = rasqal_expression_evaluate_langmatches(e, eval_context, error_p); break; case RASQAL_EXPR_DATATYPE: result = rasqal_expression_evaluate_datatype(e, eval_context, error_p); break; case RASQAL_EXPR_ISURI: case RASQAL_EXPR_ISBLANK: case RASQAL_EXPR_ISLITERAL: case RASQAL_EXPR_ISNUMERIC: result = rasqal_expression_evaluate_istype(e, eval_context, error_p); break; case RASQAL_EXPR_PLUS: l1 = rasqal_expression_evaluate2(e->arg1, eval_context, error_p); if(*error_p || !l1) goto failed; l2 = rasqal_expression_evaluate2(e->arg2, eval_context, error_p); if(*error_p || !l2) { rasqal_free_literal(l1); goto failed; } result = rasqal_literal_add(l1, l2, &errs.e); rasqal_free_literal(l1); rasqal_free_literal(l2); if(errs.e) goto failed; break; case RASQAL_EXPR_MINUS: l1 = rasqal_expression_evaluate2(e->arg1, eval_context, error_p); if(*error_p || !l1) goto failed; l2 = rasqal_expression_evaluate2(e->arg2, eval_context, error_p); if(*error_p || !l2) { rasqal_free_literal(l1); goto failed; } result = rasqal_literal_subtract(l1, l2, &errs.e); rasqal_free_literal(l1); rasqal_free_literal(l2); if(errs.e) goto failed; break; case RASQAL_EXPR_STAR: l1 = rasqal_expression_evaluate2(e->arg1, eval_context, error_p); if(*error_p || !l1) goto failed; l2 = rasqal_expression_evaluate2(e->arg2, eval_context, error_p); if(*error_p || !l2) { rasqal_free_literal(l1); goto failed; } result = rasqal_literal_multiply(l1, l2, &errs.e); rasqal_free_literal(l1); rasqal_free_literal(l2); if(errs.e) goto failed; break; case RASQAL_EXPR_SLASH: l1 = rasqal_expression_evaluate2(e->arg1, eval_context, error_p); if(*error_p || !l1) goto failed; l2 = rasqal_expression_evaluate2(e->arg2, eval_context, error_p); if(*error_p || !l2) { rasqal_free_literal(l1); goto failed; } result = rasqal_literal_divide(l1, l2, &errs.e); rasqal_free_literal(l1); rasqal_free_literal(l2); if(errs.e) goto failed; break; case RASQAL_EXPR_REM: l1 = rasqal_expression_evaluate2(e->arg1, eval_context, error_p); if(*error_p || !l1) goto failed; l2 = rasqal_expression_evaluate2(e->arg2, eval_context, error_p); if(*error_p || !l2) { rasqal_free_literal(l1); goto failed; } vars.i = rasqal_literal_as_integer(l2, &errs.errs.e2); /* error if divisor is zero */ if(!vars.i) errs.errs.e2 = 1; else vars.i = rasqal_literal_as_integer(l1, &errs.errs.e1) % vars.i; rasqal_free_literal(l1); rasqal_free_literal(l2); if(errs.errs.e1 || errs.errs.e2) goto failed; result = rasqal_new_integer_literal(world, RASQAL_LITERAL_INTEGER, vars.i); break; case RASQAL_EXPR_STR_EQ: l1 = rasqal_expression_evaluate2(e->arg1, eval_context, error_p); if(*error_p || !l1) goto failed; l2 = rasqal_expression_evaluate2(e->arg2, eval_context, error_p); if(*error_p || !l2) { rasqal_free_literal(l1); goto failed; } vars.b = (rasqal_literal_compare(l1, l2, flags | RASQAL_COMPARE_NOCASE, &errs.e) == 0); rasqal_free_literal(l1); rasqal_free_literal(l2); if(errs.e) goto failed; result = rasqal_new_boolean_literal(world, vars.b); break; case RASQAL_EXPR_STR_NEQ: l1 = rasqal_expression_evaluate2(e->arg1, eval_context, error_p); if(*error_p || !l1) goto failed; l2 = rasqal_expression_evaluate2(e->arg2, eval_context, error_p); if(*error_p || !l2) { rasqal_free_literal(l1); goto failed; } vars.b = (rasqal_literal_compare(l1, l2, flags | RASQAL_COMPARE_NOCASE, &errs.e) != 0); rasqal_free_literal(l1); rasqal_free_literal(l2); if(errs.e) goto failed; result = rasqal_new_boolean_literal(world, vars.b); break; case RASQAL_EXPR_TILDE: l1 = rasqal_expression_evaluate2(e->arg1, eval_context, error_p); if(*error_p || !l1) goto failed; vars.i= ~ rasqal_literal_as_integer(l1, &errs.e); rasqal_free_literal(l1); if(errs.e) goto failed; result = rasqal_new_integer_literal(world, RASQAL_LITERAL_INTEGER, vars.i); break; case RASQAL_EXPR_BANG: l1 = rasqal_expression_evaluate2(e->arg1, eval_context, error_p); if(*error_p || !l1) goto failed; vars.b = ! rasqal_literal_as_boolean(l1, &errs.e); rasqal_free_literal(l1); if(errs.e) goto failed; result = rasqal_new_boolean_literal(world, vars.b); break; case RASQAL_EXPR_STR_MATCH: case RASQAL_EXPR_STR_NMATCH: case RASQAL_EXPR_REGEX: result = rasqal_expression_evaluate_strmatch(e, eval_context, error_p); break; case RASQAL_EXPR_LITERAL: /* flatten any literal to a value as soon as possible - this * removes variables from expressions the first time they are seen. * (FLATTEN_LITERAL) */ result = rasqal_new_literal_from_literal(rasqal_literal_value(e->literal)); break; case RASQAL_EXPR_FUNCTION: rasqal_log_warning_simple(world, RASQAL_WARNING_LEVEL_NOT_IMPLEMENTED, eval_context->locator, "No function expressions support at present. Returning false."); result = rasqal_new_boolean_literal(world, 0); break; case RASQAL_EXPR_CAST: l1 = rasqal_expression_evaluate2(e->arg1, eval_context, error_p); if(*error_p || !l1) goto failed; result = rasqal_literal_cast(l1, e->name, flags, &errs.e); rasqal_free_literal(l1); if(errs.e) goto failed; break; case RASQAL_EXPR_ORDER_COND_ASC: case RASQAL_EXPR_ORDER_COND_DESC: case RASQAL_EXPR_GROUP_COND_ASC: case RASQAL_EXPR_GROUP_COND_DESC: result = rasqal_expression_evaluate2(e->arg1, eval_context, error_p); break; case RASQAL_EXPR_COUNT: case RASQAL_EXPR_SUM: case RASQAL_EXPR_AVG: case RASQAL_EXPR_MIN: case RASQAL_EXPR_MAX: case RASQAL_EXPR_SAMPLE: case RASQAL_EXPR_GROUP_CONCAT: rasqal_log_error_simple(world, RAPTOR_LOG_LEVEL_ERROR, eval_context->locator, "Aggregate expressions cannot be evaluated in a general scalar expression."); errs.e = 1; goto failed; break; case RASQAL_EXPR_VARSTAR: /* constants */ break; case RASQAL_EXPR_SAMETERM: result = rasqal_expression_evaluate_sameterm(e, eval_context, error_p); break; case RASQAL_EXPR_CONCAT: result = rasqal_expression_evaluate_concat(e, eval_context, error_p); break; case RASQAL_EXPR_COALESCE: result = rasqal_expression_evaluate_coalesce(e, eval_context, error_p); break; case RASQAL_EXPR_IF: result = rasqal_expression_evaluate_if(e, eval_context, error_p); break; case RASQAL_EXPR_URI: case RASQAL_EXPR_IRI: result = rasqal_expression_evaluate_uri_constructor(e, eval_context, error_p); break; case RASQAL_EXPR_STRLANG: result = rasqal_expression_evaluate_strlang(e, eval_context, error_p); break; case RASQAL_EXPR_STRDT: result = rasqal_expression_evaluate_strdt(e, eval_context, error_p); break; case RASQAL_EXPR_BNODE: result = rasqal_expression_evaluate_bnode_constructor(e, eval_context, error_p); break; case RASQAL_EXPR_IN: result = rasqal_expression_evaluate_in_set(e, eval_context, error_p); break; case RASQAL_EXPR_NOT_IN: result = rasqal_expression_evaluate_in_set(e, eval_context, error_p); break; case RASQAL_EXPR_YEAR: case RASQAL_EXPR_MONTH: case RASQAL_EXPR_DAY: case RASQAL_EXPR_HOURS: case RASQAL_EXPR_MINUTES: case RASQAL_EXPR_SECONDS: result = rasqal_expression_evaluate_datetime_part(e, eval_context, error_p); break; case RASQAL_EXPR_CURRENT_DATETIME: case RASQAL_EXPR_NOW: result = rasqal_expression_evaluate_now(e, eval_context, error_p); break; case RASQAL_EXPR_TO_UNIXTIME: result = rasqal_expression_evaluate_to_unixtime(e, eval_context, error_p); break; case RASQAL_EXPR_FROM_UNIXTIME: result = rasqal_expression_evaluate_from_unixtime(e, eval_context, error_p); break; case RASQAL_EXPR_RAND: result = rasqal_expression_evaluate_rand(e, eval_context, error_p); break; case RASQAL_EXPR_STRLEN: result = rasqal_expression_evaluate_strlen(e, eval_context, error_p); break; case RASQAL_EXPR_UCASE: case RASQAL_EXPR_LCASE: result = rasqal_expression_evaluate_set_case(e, eval_context, error_p); break; case RASQAL_EXPR_STRSTARTS: case RASQAL_EXPR_STRENDS: case RASQAL_EXPR_CONTAINS: result = rasqal_expression_evaluate_str_prefix_suffix(e, eval_context, error_p); break; case RASQAL_EXPR_TIMEZONE: result = rasqal_expression_evaluate_datetime_timezone(e, eval_context, error_p); break; case RASQAL_EXPR_TZ: result = rasqal_expression_evaluate_datetime_tz(e, eval_context, error_p); break; case RASQAL_EXPR_ENCODE_FOR_URI: result = rasqal_expression_evaluate_encode_for_uri(e, eval_context, error_p); break; case RASQAL_EXPR_SUBSTR: result = rasqal_expression_evaluate_substr(e, eval_context, error_p); break; case RASQAL_EXPR_ABS: result = rasqal_expression_evaluate_abs(e, eval_context, error_p); break; case RASQAL_EXPR_ROUND: result = rasqal_expression_evaluate_round(e, eval_context, error_p); break; case RASQAL_EXPR_CEIL: result = rasqal_expression_evaluate_ceil(e, eval_context, error_p); break; case RASQAL_EXPR_FLOOR: result = rasqal_expression_evaluate_floor(e, eval_context, error_p); break; case RASQAL_EXPR_MD5: case RASQAL_EXPR_SHA1: case RASQAL_EXPR_SHA224: case RASQAL_EXPR_SHA256: case RASQAL_EXPR_SHA384: case RASQAL_EXPR_SHA512: result = rasqal_expression_evaluate_digest(e, eval_context, error_p); break; case RASQAL_EXPR_UNKNOWN: default: RASQAL_FATAL3("Unknown operation %s (%d)", rasqal_expression_op_label(e->op), e->op); } got_result: #ifdef RASQAL_DEBUG RASQAL_DEBUG2("result of %p: ", e); rasqal_expression_print(e, stderr); fputs( ": ", stderr); if(*error_p) fputs("FAILURE",stderr); else rasqal_literal_print(result, stderr); fputc('\n', stderr); #endif return result; failed: *error_p = 1; if(result) { rasqal_free_literal(result); result = NULL; } goto got_result; }
static int rasqal_query_engine_algebra_execute_init(void* ex_data, rasqal_query* query, rasqal_query_results* query_results, int flags, rasqal_engine_error *error_p) { rasqal_engine_algebra_data* execution_data; rasqal_engine_error error; int rc = 0; rasqal_algebra_node* node; rasqal_algebra_aggregate* ae; execution_data = (rasqal_engine_algebra_data*)ex_data; /* initialise the execution_data fields */ execution_data->query = query; execution_data->query_results = query_results; if(!execution_data->triples_source) { execution_data->triples_source = rasqal_new_triples_source(execution_data->query); if(!execution_data->triples_source) { *error_p = RASQAL_ENGINE_FAILED; return 1; } } node = rasqal_algebra_query_to_algebra(query); if(!node) return 1; node = rasqal_algebra_query_add_group_by(query, node); if(!node) return 1; ae = rasqal_algebra_query_prepare_aggregates(query, node); if(!ae) return 1; if(ae) { node = rasqal_algebra_query_add_aggregation(query, ae, node); ae = NULL; if(!node) return 1; } node = rasqal_algebra_query_add_having(query, node); if(!node) return 1; node = rasqal_algebra_query_add_projection(query, node); if(!node) return 1; node = rasqal_algebra_query_add_modifiers(query, node); if(!node) return 1; node = rasqal_algebra_query_add_distinct(query,node); if(!node) return 1; execution_data->algebra_node = node; /* count final number of nodes */ execution_data->nodes_count = 0; rasqal_algebra_node_visit(query, execution_data->algebra_node, rasqal_engine_algebra_count_nodes, &execution_data->nodes_count); #ifdef RASQAL_DEBUG RASQAL_DEBUG1("algebra result: \n"); rasqal_algebra_node_print(node, DEBUG_FH); fputc('\n', DEBUG_FH); #endif RASQAL_DEBUG2("algebra nodes: %d\n", execution_data->nodes_count); error = RASQAL_ENGINE_OK; execution_data->rowsource = rasqal_algebra_node_to_rowsource(execution_data, node, &error); #ifdef RASQAL_DEBUG RASQAL_DEBUG1("rowsource (query plan) result: \n"); if(execution_data->rowsource) rasqal_rowsource_print(execution_data->rowsource, DEBUG_FH); else fputs("NULL", DEBUG_FH); fputc('\n', DEBUG_FH); #endif if(error != RASQAL_ENGINE_OK) rc = 1; return rc; }
/** * rasqal_variables_table_add: * @vt: #rasqal_variables_table to associate the variable with * @type: variable type defined by enumeration rasqal_variable_type * @name: variable name * @value: variable #rasqal_literal value (or NULL) * * Constructor - Create a new variable and add it to the variables table * * The @name and @value become owned by the rasqal_variable structure * * Return value: a new #rasqal_variable or NULL on failure. **/ rasqal_variable* rasqal_variables_table_add(rasqal_variables_table* vt, rasqal_variable_type type, const unsigned char *name, rasqal_literal *value) { int i; rasqal_variable* v; raptor_sequence* seq = NULL; int* count_p = NULL; if(!vt) return NULL; switch(type) { case RASQAL_VARIABLE_TYPE_ANONYMOUS: seq = vt->anon_variables_sequence; count_p = &vt->anon_variables_count; break; case RASQAL_VARIABLE_TYPE_NORMAL: seq = vt->variables_sequence; count_p = &vt->variables_count; break; case RASQAL_VARIABLE_TYPE_UNKNOWN: default: RASQAL_DEBUG2("Unknown variable type %d", type); return NULL; } for(i = 0; i < raptor_sequence_size(seq); i++) { v = (rasqal_variable*)raptor_sequence_get_at(seq, i); if(!strcmp((const char*)v->name, (const char*)name)) { /* name already present, do not need a copy */ RASQAL_FREE(cstring, name); return v; } } v = (rasqal_variable*)RASQAL_CALLOC(rasqal_variable, 1, sizeof(rasqal_variable)); if(v) { v->vars_table = vt; v->type= type; v->name= name; v->value= value; if(count_p) v->offset= (*count_p); if(seq && raptor_sequence_push(seq, v)) return NULL; if(type == RASQAL_VARIABLE_TYPE_ANONYMOUS) { /* new anon variable: add base offset */ v->offset += vt->variables_count; } else { /* new normal variable: move all anon variable offsets up 1 */ for(i = 0; i < vt->anon_variables_count; i++) { rasqal_variable* anon_v; anon_v = (rasqal_variable*)raptor_sequence_get_at(vt->anon_variables_sequence, i); anon_v->offset++; } } /* Increment count and free var names only after sequence push succeeded */ if(count_p) (*count_p)++; if(vt->variable_names) { RASQAL_FREE(cstrings, vt->variable_names); vt->variable_names = NULL; } } else { RASQAL_FREE(cstring, name); if(value) rasqal_free_literal(value); } return v; }
static rasqal_rowsource* rasqal_algebra_node_to_rowsource(rasqal_engine_algebra_data* execution_data, rasqal_algebra_node* node, rasqal_engine_error *error_p) { rasqal_rowsource* rs = NULL; switch(node->op) { case RASQAL_ALGEBRA_OPERATOR_BGP: rs = rasqal_algebra_basic_algebra_node_to_rowsource(execution_data, node, error_p); break; case RASQAL_ALGEBRA_OPERATOR_FILTER: rs = rasqal_algebra_filter_algebra_node_to_rowsource(execution_data, node, error_p); break; case RASQAL_ALGEBRA_OPERATOR_ORDERBY: rs = rasqal_algebra_orderby_algebra_node_to_rowsource(execution_data, node, error_p); break; case RASQAL_ALGEBRA_OPERATOR_UNION: rs = rasqal_algebra_union_algebra_node_to_rowsource(execution_data, node, error_p); break; case RASQAL_ALGEBRA_OPERATOR_PROJECT: rs = rasqal_algebra_project_algebra_node_to_rowsource(execution_data, node, error_p); break; case RASQAL_ALGEBRA_OPERATOR_LEFTJOIN: rs = rasqal_algebra_leftjoin_algebra_node_to_rowsource(execution_data, node, error_p); break; case RASQAL_ALGEBRA_OPERATOR_GRAPH: rs = rasqal_algebra_graph_algebra_node_to_rowsource(execution_data, node, error_p); break; case RASQAL_ALGEBRA_OPERATOR_DISTINCT: rs = rasqal_algebra_distinct_algebra_node_to_rowsource(execution_data, node, error_p); break; case RASQAL_ALGEBRA_OPERATOR_JOIN: rs = rasqal_algebra_join_algebra_node_to_rowsource(execution_data, node, error_p); break; case RASQAL_ALGEBRA_OPERATOR_ASSIGN: rs = rasqal_algebra_assignment_algebra_node_to_rowsource(execution_data, node, error_p); break; case RASQAL_ALGEBRA_OPERATOR_GROUP: rs = rasqal_algebra_group_algebra_node_to_rowsource(execution_data, node, error_p); break; case RASQAL_ALGEBRA_OPERATOR_AGGREGATION: rs = rasqal_algebra_aggregation_algebra_node_to_rowsource(execution_data, node, error_p); break; case RASQAL_ALGEBRA_OPERATOR_HAVING: rs = rasqal_algebra_having_algebra_node_to_rowsource(execution_data, node, error_p); break; case RASQAL_ALGEBRA_OPERATOR_UNKNOWN: case RASQAL_ALGEBRA_OPERATOR_DIFF: case RASQAL_ALGEBRA_OPERATOR_TOLIST: case RASQAL_ALGEBRA_OPERATOR_REDUCED: case RASQAL_ALGEBRA_OPERATOR_SLICE: default: RASQAL_DEBUG2("Unsupported algebra node operator %s\n", rasqal_algebra_node_operator_as_string(node->op)); break; } if(!rs) *error_p = RASQAL_ENGINE_FAILED; return rs; }
int main(int argc, char *argv[]) { const char *program = rasqal_basename(argv[0]); rasqal_rowsource *rowsource = NULL; raptor_sequence *seq = NULL; rasqal_world* world = NULL; rasqal_query* query = NULL; rasqal_row* row = NULL; int count; int failures = 0; rasqal_variables_table* vt; int rows_count; int i; raptor_sequence* vars_seq = NULL; world = rasqal_new_world(); if(!world || rasqal_world_open(world)) { fprintf(stderr, "%s: rasqal_world init failed\n", program); return(1); } query = rasqal_new_query(world, "sparql", NULL); /* test 1-row rowsource (2 variables) */ rows_count = 1; #ifdef RASQAL_DEBUG RASQAL_DEBUG2("Testing %d-row rowsource\n", rows_count); #endif vt = rasqal_new_variables_table(world); /* add 2 variables to table and 1 row sequence */ seq = rasqal_new_row_sequence(world, vt, test_1_rows, 2, &vars_seq); if(!seq) { fprintf(stderr, "%s: failed to create sequence of %d rows\n", program, rows_count); failures++; goto tidy; } rowsource = rasqal_new_rowsequence_rowsource(world, query, vt, seq, vars_seq); if(!rowsource) { fprintf(stderr, "%s: failed to create %d-row sequence rowsource\n", program, rows_count); failures++; goto tidy; } /* vars_seq and seq are now owned by rowsource */ vars_seq = seq = NULL; row = rasqal_rowsource_read_row(rowsource); if(!row) { fprintf(stderr, "%s: read_row returned no row for a %d-row sequence rowsource\n", program, rows_count); failures++; goto tidy; } #ifdef RASQAL_DEBUG RASQAL_DEBUG1("Result Row:\n "); rasqal_row_print(row, stderr); fputc('\n', stderr); #endif rasqal_free_row(row); row = NULL; count = rasqal_rowsource_get_rows_count(rowsource); if(count != rows_count) { fprintf(stderr, "%s: read_rows returned count %d instead of %d for a %d-row sequence rowsource\n", program, count, rows_count, rows_count); failures++; goto tidy; } row = rasqal_rowsource_read_row(rowsource); if(row) { fprintf(stderr, "%s: read_row returned > %d rows for a %d-row sequence rowsource\n", program, rows_count, rows_count); failures++; goto tidy; } rasqal_free_rowsource(rowsource); rowsource = NULL; rasqal_free_variables_table(vt); vt = NULL; /* test 3-row rowsource */ rows_count = 3; #ifdef RASQAL_DEBUG RASQAL_DEBUG2("Testing %d-row rowsource\n", rows_count); #endif vt = rasqal_new_variables_table(world); /* add 4 variables to table and 3 row sequence */ seq = rasqal_new_row_sequence(world, vt, test_3_rows, 4, &vars_seq); if(!seq) { fprintf(stderr, "%s: failed to create sequence of %d rows\n", program, rows_count); failures++; goto tidy; } rowsource = rasqal_new_rowsequence_rowsource(world, query, vt, seq, vars_seq); if(!rowsource) { fprintf(stderr, "%s: failed to create %d-row sequence rowsource\n", program, rows_count); failures++; goto tidy; } /* vars_seq and seq are now owned by rowsource */ vars_seq = seq = NULL; for(i = 0; i < rows_count; i++) { row = rasqal_rowsource_read_row(rowsource); if(!row) { fprintf(stderr, "%s: read_row returned no row for row %d in a %d-row sequence rowsource\n", program, i, rows_count); failures++; goto tidy; } #ifdef RASQAL_DEBUG RASQAL_DEBUG1("Result Row:\n "); rasqal_row_print(row, stderr); fputc('\n', stderr); #endif rasqal_free_row(row); row = NULL; } count = rasqal_rowsource_get_rows_count(rowsource); if(count != rows_count) { fprintf(stderr, "%s: read_rows returned count %d instead of %d for a %d-row sequence rowsource\n", program, count, rows_count, rows_count); failures++; goto tidy; } row = rasqal_rowsource_read_row(rowsource); if(row) { fprintf(stderr, "%s: read_row returned >%d rows for a %d-row sequence rowsource\n", program, rows_count, rows_count); failures++; goto tidy; } rasqal_free_rowsource(rowsource); rowsource = NULL; rasqal_free_variables_table(vt); vt = NULL; tidy: if(row) rasqal_free_row(row); if(seq) raptor_free_sequence(seq); if(rowsource) rasqal_free_rowsource(rowsource); if(vt) rasqal_free_variables_table(vt); if(query) rasqal_free_query(query); if(world) rasqal_free_world(world); return failures; }
static void rasqal_sparql_xml_sax2_end_element_handler(void *user_data, raptor_xml_element* xml_element) { rasqal_rowsource_sparql_xml_context* con; raptor_qname* name; int i; rasqal_sparql_xml_read_state state=STATE_unknown; con=(rasqal_rowsource_sparql_xml_context*)user_data; name=raptor_xml_element_get_name(xml_element); for(i=STATE_first; i <= STATE_last; i++) { if(!strcmp((const char*)raptor_qname_get_local_name(name), sparql_xml_element_names[i])) { state=(rasqal_sparql_xml_read_state)i; con->state=state; } } if(state == STATE_unknown) { fprintf(stderr, "UNKNOWN element %s\n", raptor_qname_get_local_name(name)); con->failed++; } con->depth--; #ifdef TRACE_XML if(con->trace) { pad(stderr, con->depth); fprintf(stderr, "End Element %s (%d)\n", raptor_qname_get_local_name(name), con->state); } #endif switch(con->state) { case STATE_head: /* Only now is the full number of variables known */ con->variables_count = rasqal_variables_table_get_named_variables_count(con->vars_table); con->rowsource->size = con->variables_count; break; case STATE_literal: if(1) { rasqal_literal* l; unsigned char* lvalue; raptor_uri* datatype_uri=NULL; char* language_str=NULL; lvalue=(unsigned char*)RASQAL_MALLOC(cstring, con->value_len+1); memcpy(lvalue, con->value, con->value_len + 1); if(con->datatype) datatype_uri = raptor_new_uri(con->world->raptor_world_ptr, (const unsigned char*)con->datatype); if(con->language) { size_t language_len = strlen(con->language); language_str=(char*)RASQAL_MALLOC(cstring, language_len + 1); memcpy(language_str, con->language, language_len + 1); } l = rasqal_new_string_literal_node(con->world, lvalue, language_str, datatype_uri); rasqal_row_set_value_at(con->row, con->result_offset, l); rasqal_free_literal(l); RASQAL_DEBUG3("Saving row result %d string value at offset %d\n", con->offset, con->result_offset); } break; case STATE_bnode: if(1) { rasqal_literal* l; unsigned char* lvalue; lvalue=(unsigned char*)RASQAL_MALLOC(cstring, con->value_len+1); memcpy(lvalue, con->value, con->value_len + 1); l = rasqal_new_simple_literal(con->world, RASQAL_LITERAL_BLANK, lvalue); rasqal_row_set_value_at(con->row, con->result_offset, l); rasqal_free_literal(l); RASQAL_DEBUG3("Saving row result %d bnode value at offset %d\n", con->offset, con->result_offset); } break; case STATE_uri: if(1) { raptor_uri* uri; rasqal_literal* l; uri = raptor_new_uri(con->world->raptor_world_ptr, (const unsigned char*)con->value); l = rasqal_new_uri_literal(con->world, uri); rasqal_row_set_value_at(con->row, con->result_offset, l); rasqal_free_literal(l); RASQAL_DEBUG3("Saving row result %d uri value at offset %d\n", con->offset, con->result_offset); } break; case STATE_result: if(con->row) { RASQAL_DEBUG2("Saving row result %d\n", con->offset); raptor_sequence_push(con->results_sequence, con->row); } con->row=NULL; break; case STATE_unknown: case STATE_sparql: case STATE_variable: case STATE_results: case STATE_binding: default: break; } if(con->value) { RASQAL_FREE(cstring, con->value); con->value=NULL; } }
static void rasqal_sparql_xml_sax2_start_element_handler(void *user_data, raptor_xml_element *xml_element) { rasqal_rowsource_sparql_xml_context* con; int i; raptor_qname* name; rasqal_sparql_xml_read_state state=STATE_unknown; int attr_count; con=(rasqal_rowsource_sparql_xml_context*)user_data; name=raptor_xml_element_get_name(xml_element); for(i=STATE_first; i <= STATE_last; i++) { if(!strcmp((const char*)raptor_qname_get_local_name(name), sparql_xml_element_names[i])) { state=(rasqal_sparql_xml_read_state)i; con->state=state; } } if(state == STATE_unknown) { fprintf(stderr, "UNKNOWN element %s\n", raptor_qname_get_local_name(name)); con->failed++; } #ifdef TRACE_XML if(con->trace) { pad(stderr, con->depth); fprintf(stderr, "Element %s (%d)\n", raptor_qname_get_local_name(name), state); } #endif attr_count=raptor_xml_element_get_attributes_count(xml_element); con->name=NULL; con->datatype=NULL; con->language=NULL; if(attr_count > 0) { raptor_qname** attrs=raptor_xml_element_get_attributes(xml_element); for(i=0; i < attr_count; i++) { #ifdef TRACE_XML if(con->trace) { pad(stderr, con->depth+1); fprintf(stderr, "Attribute %s='%s'\n", raptor_qname_get_local_name(attrs[i]), raptor_qname_get_value(attrs[i])); } #endif if(!strcmp((const char*)raptor_qname_get_local_name(attrs[i]), "name")) con->name=(const char*)raptor_qname_get_counted_value(attrs[i], &con->name_length); else if(!strcmp((const char*)raptor_qname_get_local_name(attrs[i]), "datatype")) con->datatype=(const char*)raptor_qname_get_value(attrs[i]); } } if(raptor_xml_element_get_language(xml_element)) { con->language=(const char*)raptor_xml_element_get_language(xml_element); #ifdef TRACE_XML if(con->trace) { pad(stderr, con->depth+1); fprintf(stderr, "xml:lang '%s'\n", con->language); } #endif } switch(state) { case STATE_variable: if(con->name) { unsigned char* var_name; rasqal_variable *v; var_name = (unsigned char*)RASQAL_MALLOC(cstring, con->name_length+1); memcpy(var_name, con->name, con->name_length + 1); v = rasqal_variables_table_add(con->vars_table, RASQAL_VARIABLE_TYPE_NORMAL, var_name, NULL); if(v) rasqal_rowsource_add_variable(con->rowsource, v); } break; case STATE_result: if(1) { con->row = rasqal_new_row(con->rowsource); RASQAL_DEBUG2("Made new row %d\n", con->offset); con->offset++; } break; case STATE_binding: con->result_offset = rasqal_rowsource_get_variable_offset_by_name(con->rowsource, (const unsigned char*)con->name); break; case STATE_sparql: case STATE_head: case STATE_results: case STATE_literal: case STATE_bnode: case STATE_uri: case STATE_unknown: default: break; } con->depth++; }
static rasqal_row* rasqal_aggregation_rowsource_read_row(rasqal_rowsource* rowsource, void *user_data) { rasqal_aggregation_rowsource_context* con; rasqal_row* row; int error = 0; con = (rasqal_aggregation_rowsource_context*)user_data; if(con->finished) return NULL; /* Iterate over input rows until last row seen or group done */ while(1) { error = 0; if(con->saved_row) row = con->saved_row; else row = rasqal_rowsource_read_row(con->rowsource); if(!row) { /* End of input - calculate last aggregation result */ con->finished = 1; break; } if(con->last_group_id != row->group_id) { int i; if(!con->saved_row && con->last_group_id >= 0) { /* Existing aggregation is done - return result */ /* save current row for next time this function is called */ con->saved_row = row; row = NULL; #ifdef RASQAL_DEBUG RASQAL_DEBUG2("Aggregation ending group %d", con->last_group_id); fputc('\n', DEBUG_FH); #endif /* Empty distinct maps */ for(i = 0; i < con->expr_count; i++) { rasqal_agg_expr_data* expr_data = &con->expr_data[i]; if(expr_data->map) { rasqal_free_map(expr_data->map); expr_data->map = NULL; } } break; } /* reference is now in 'row' variable */ con->saved_row = NULL; #ifdef RASQAL_DEBUG RASQAL_DEBUG2("Aggregation starting group %d", row->group_id); fputc('\n', DEBUG_FH); #endif /* next time this function is called we continue here */ for(i = 0; i < con->expr_count; i++) { rasqal_agg_expr_data* expr_data = &con->expr_data[i]; if(!expr_data->agg_user_data) { /* init once */ expr_data->agg_user_data = rasqal_builtin_agg_expression_execute_init(rowsource->world, expr_data->expr); if(!expr_data->agg_user_data) { error = 1; break; } } /* Init map for each group */ if(expr_data->expr->flags & RASQAL_EXPR_FLAG_DISTINCT) { expr_data->map = rasqal_new_literal_sequence_sort_map(1 /* is_distinct */, 0 /* compare_flags */); if(!expr_data->map) { error = 1; break; } } } if(error) break; con->last_group_id = row->group_id; } /* end if handling change of group ID */ /* Bind the values in the input row to the variables in the table */ rasqal_row_bind_variables(row, rowsource->query->vars_table); /* Evaluate the expressions giving a sequence of literals to * run the aggregation step over. */ if(1) { int i; if(!con->step_count) { /* copy first value row from input rowsource */ for(i = 0; i < con->input_values_count; i++) { rasqal_literal* value; value = rasqal_new_literal_from_literal(row->values[i]); raptor_sequence_set_at(con->input_values, i, value); } } con->step_count++; for(i = 0; i < con->expr_count; i++) { rasqal_agg_expr_data* expr_data = &con->expr_data[i]; raptor_sequence* seq; /* SPARQL Aggregation uses ListEvalE() to evaluate - ignoring * errors and filtering out expressions that fail */ seq = rasqal_expression_sequence_evaluate(rowsource->query, expr_data->exprs_seq, /* ignore_errors */ 1, &error); if(error) continue; if(expr_data->map) { if(rasqal_literal_sequence_sort_map_add_literal_sequence(expr_data->map, seq)) { /* duplicate found * * The above function just freed seq so no data is lost */ continue; } } #ifdef RASQAL_DEBUG RASQAL_DEBUG1("Aggregation step over literals: "); raptor_sequence_print(seq, DEBUG_FH); fputc('\n', DEBUG_FH); #endif error = rasqal_builtin_agg_expression_execute_step(expr_data->agg_user_data, seq); /* when DISTINCTing, seq remains owned by the map * otherwise seq is local and must be freed */ if(!expr_data->map) raptor_free_sequence(seq); if(error) break; } } rasqal_free_row(row); row = NULL; if(error) break; } /* end while reading rows */ if(error) { /* Discard row on error */ if(row) { rasqal_free_row(row); row = NULL; } } else if (con->last_group_id >= 0) { int offset = 0; int i; /* Generate result row and reset for next group */ row = rasqal_new_row(rowsource); /* Copy scalar results through */ for(i = 0; i < con->input_values_count; i++) { rasqal_literal* result; /* Reset: get and delete any stored input rowsource literal */ result = (rasqal_literal*)raptor_sequence_delete_at(con->input_values, i); rasqal_row_set_value_at(row, offset, result); rasqal_free_literal(result); offset++; } /* Set aggregate results */ for(i = 0; i < con->expr_count; i++) { rasqal_literal* result; rasqal_agg_expr_data* expr_data = &con->expr_data[i]; rasqal_variable* v; /* Calculate the result because the input ended or a new group started */ result = rasqal_builtin_agg_expression_execute_result(expr_data->agg_user_data); #ifdef RASQAL_DEBUG RASQAL_DEBUG1("Aggregation ending group with result: "); if(result) rasqal_literal_print(result, DEBUG_FH); else fputs("NULL", DEBUG_FH); fputc('\n', DEBUG_FH); #endif v = rasqal_rowsource_get_variable_by_offset(rowsource, offset); result = rasqal_new_literal_from_literal(result); /* it is OK to bind to NULL */ rasqal_variable_set_value(v, result); rasqal_row_set_value_at(row, offset, result); if(result) rasqal_free_literal(result); offset++; if(rasqal_builtin_agg_expression_execute_reset(expr_data->agg_user_data)) { rasqal_free_row(row); row = NULL; break; } } con->step_count = 0; if(row) row->offset = con->offset++; } return row; }
int main(int argc, char *argv[]) { rasqal_world *world; raptor_world* raptor_world_ptr = NULL; int rc = 0; int usage = 0; int help = 0; const char* query_language = DEFAULT_QUERY_LANGUAGE; const char* query_filename = NULL; const char* data_format_name = NULL; const char* result_filename = NULL; const char* result_format_name = NULL; unsigned char* query_string = NULL; size_t query_len = 0; unsigned char *query_base_uri_string = NULL; int free_query_base_uri_string = 0; raptor_uri* query_base_uri = NULL; rasqal_query* rq = NULL; rasqal_query_results* results = NULL; rasqal_query_results* expected_results = NULL; raptor_sequence* data_graphs = NULL; raptor_iostream* result_iostr = NULL; rasqal_dataset* ds = NULL; rasqal_query_results_type results_type; /* Set globals */ if(1) { char *p; program = argv[0]; if((p = strrchr(program, '/'))) program = p + 1; else if((p = strrchr(program, '\\'))) program = p + 1; argv[0] = program; } world = rasqal_new_world(); if(!world || rasqal_world_open(world)) { fprintf(stderr, "%s: rasqal_world init failed\n", program); return(1); } raptor_world_ptr = rasqal_world_get_raptor(world); rasqal_world_set_log_handler(world, world, check_query_log_handler); /* Option parsing */ while (!usage && !help) { int c; #ifdef HAVE_GETOPT_LONG int option_index = 0; c = getopt_long (argc, argv, GETOPT_STRING, long_options, &option_index); #else c = getopt (argc, argv, GETOPT_STRING); #endif if (c == -1) break; switch (c) { case 0: case '?': /* getopt() - unknown option */ usage = 1; break; case 'd': verbose++; break; case 'F': if(optarg) { data_format_name = optarg; } break; case 'h': help = 1; break; case 'l': if(optarg) { query_language = optarg; } break; case 'q': if(optarg) { query_filename = optarg; } break; case 'Q': if(optarg) { query_base_uri_string = (unsigned char*)optarg; } break; case 'r': if(optarg) { result_filename = optarg; } break; case 'R': if(optarg) { result_format_name = optarg; } break; case 'v': fputs(rasqal_version_string, stdout); fputc('\n', stdout); rasqal_free_world(world); exit(0); case 'g': case 'n': if(optarg) { rasqal_data_graph *dg = NULL; rasqal_data_graph_flags type; type = (c == 'n') ? RASQAL_DATA_GRAPH_NAMED : RASQAL_DATA_GRAPH_BACKGROUND; dg = rasqal_cmdline_read_data_graph(world, type, (const char*)optarg, data_format_name); if(!dg) { fprintf(stderr, "%s: Failed to create data graph for `%s'\n", program, optarg); return(1); } if(!data_graphs) { data_graphs = raptor_new_sequence((raptor_data_free_handler)rasqal_free_data_graph, NULL); if(!data_graphs) { fprintf(stderr, "%s: Failed to create data graphs sequence\n", program); return(1); } } raptor_sequence_push(data_graphs, dg); } break; } } /* end while option */ if(!help && !usage) { if(optind != argc) { fprintf(stderr, "%s: Extra arguments.\n", program); usage = 1; } else if(!result_filename) { usage = 2; /* Title and usage */ } else if(!query_filename) { usage = 2; /* Title and usage */ } } if(usage) { if(usage > 1) { fprintf(stderr, title_format_string, rasqal_version_string); fputs("Rasqal home page: ", stderr); fputs(rasqal_home_url_string, stderr); fputc('\n', stderr); fputs(rasqal_copyright_string, stderr); fputs("\nLicense: ", stderr); fputs(rasqal_license_string, stderr); fputs("\n\n", stderr); } fprintf(stderr, "Try `%s " HELP_ARG(h, help) "' for more information.\n", program); rasqal_free_world(world); exit(1); } if(help) { int i; printf(title_format_string, rasqal_version_string); puts("Run an RDF query and check it against a known result."); printf("Usage: %s [OPTIONS] -g DATA -q QUERY-FILE -r RESULT-FILE\n\n", program); fputs(rasqal_copyright_string, stdout); fputs("\nLicense: ", stdout); puts(rasqal_license_string); fputs("Rasqal home page: ", stdout); puts(rasqal_home_url_string); puts("\nNormal operation is to execute the query in the QUERY-FILE and\ncompare to the query results in RESULT-FILE."); puts("\nMain options:"); puts(HELP_TEXT("g URI", "default-graph URI", "Use URI as the default graph in the dataset")); puts(HELP_TEXT("l", "language LANGUAGE ", "Set query language name to one of:")); for(i = 0; 1; i++) { const raptor_syntax_description* desc; desc = rasqal_world_get_query_language_description(world, i); if(!desc) break; printf(" %-15s %s", desc->names[0], desc->label); if(!i) puts(" (default)"); else putchar('\n'); } puts(HELP_TEXT("n URI", "named-graph URI ", "Add named graph URI to dataset")); puts(HELP_TEXT("q FILE", "query QUERY-FILE", "Execute query in file QUERY-FILE")); puts(HELP_TEXT("r FILE", "result FILE ", "Compare to result in file RESULTS-FILE")); puts("\nAdditional options:"); puts(HELP_TEXT("d", "debug ", "Increase debug message level")); puts(HELP_TEXT("F", "data-format NAME ", "Set the data source format NAME (default: " DEFAULT_DATA_FORMAT_NAME_GRAPH ")")); puts(HELP_TEXT("h", "help ", "Print this help, then exit")); puts(HELP_TEXT("Q URI", "query-base-uri URI", "Set the base URI for the query")); puts(HELP_TEXT("R", "result-format NAME ", "Set the result format NAME (default: " DEFAULT_RESULT_FORMAT_NAME ")")); puts(" For variable bindings and boolean results:"); for(i = 0; 1; i++) { const raptor_syntax_description* desc; desc = rasqal_world_get_query_results_format_description(world, i); if(!desc) break; if(desc->flags & RASQAL_QUERY_RESULTS_FORMAT_FLAG_READER) { printf(" %-10s %s", desc->names[0], desc->label); if(!strcmp(desc->names[0], DEFAULT_RESULT_FORMAT_NAME)) puts(" (default)"); else putchar('\n'); } } puts(" For RDF graph results:"); for(i = 0; 1; i++) { const raptor_syntax_description *desc; desc = raptor_world_get_parser_description(raptor_world_ptr, i); if(!desc) break; printf(" %-15s%s", desc->names[0], desc->label); if(!strcmp(desc->names[0], DEFAULT_DATA_FORMAT_NAME_GRAPH)) puts(" (default)"); else putchar('\n'); } puts(HELP_TEXT("v", "version ", "Print the Rasqal version")); puts("\nReport bugs to http://bugs.librdf.org/"); rasqal_free_world(world); exit(0); } /* Compute query base URI from filename or passed in -Q QUERY-BASE-URI */ if(!query_base_uri_string) { query_base_uri_string = raptor_uri_filename_to_uri_string(query_filename); free_query_base_uri_string = 1; } query_base_uri = raptor_new_uri(raptor_world_ptr, query_base_uri_string); if(!query_base_uri) { fprintf(stderr, "%s: Failed to create URI for %s\n", program, query_base_uri_string); return(1); } /* Read query from file into a string */ query_string = rasqal_cmdline_read_file_string(world, query_filename, "query file", &query_len); if(!query_string) { rc = 1; goto tidy_setup; } /* Report information */ if(verbose) { fprintf(stderr, "%s: Reading query in language %s from file %s URI %s:\n", program, query_language, query_filename, raptor_uri_as_string(query_base_uri)); if(verbose > 1) fprintf(stderr, "%s\n", (const char*)query_string); fprintf(stderr, "%s: Reading results from file '%s'\n", program, result_filename); } /* Parse and prepare query */ rq = check_query_init_query(world, query_language, query_string, query_base_uri, data_graphs); rasqal_free_memory(query_string); if(!rq) { fprintf(stderr, "%s: Parsing query in %s failed\n", program, query_filename); goto tidy_query; } /* Query prepared OK - we now know the query details such as result type */ /* Read expected results */ if(1) { results_type = rasqal_query_get_result_type(rq); fprintf(stderr, "%s: Expecting result type %d\n", program, results_type); /* Read result file */ result_iostr = raptor_new_iostream_from_filename(raptor_world_ptr, result_filename); if(!result_iostr) { fprintf(stderr, "%s: result file '%s' open failed - %s\n", program, result_filename, strerror(errno)); rc = 1; goto tidy_setup; } switch(results_type) { case RASQAL_QUERY_RESULTS_BINDINGS: case RASQAL_QUERY_RESULTS_BOOLEAN: /* read results via rasqal query results format */ expected_results = rasqal_cmdline_read_results(world, raptor_world_ptr, results_type, result_iostr, result_filename, result_format_name); raptor_free_iostream(result_iostr); result_iostr = NULL; if(!expected_results) { fprintf(stderr, "%s: Failed to create query results\n", program); rc = 1; goto tidy_setup; } break; case RASQAL_QUERY_RESULTS_GRAPH: /* read results via raptor parser */ if(1) { const char* format_name = NULL; if(result_format_name) { if(!raptor_world_is_parser_name(raptor_world_ptr, result_format_name)) { fprintf(stderr, "%s: invalid parser name `%s' for `" HELP_ARG(R, result-format) "'\n\n", program, result_format_name); } else format_name = result_format_name; } if(!format_name) format_name = DEFAULT_RESULT_FORMAT_NAME; ds = rasqal_new_dataset(world); if(!ds) { fprintf(stderr, "%s: Failed to create dataset", program); rc = 1; goto tidy_setup; } if(rasqal_dataset_load_graph_iostream(ds, format_name, result_iostr, NULL)) { fprintf(stderr, "%s: Failed to load graph into dataset", program); rc = 1; goto tidy_setup; } raptor_free_iostream(result_iostr); result_iostr = NULL; /* FIXME * * The code at this point should do something with triples * in the dataset; save them for later to compare them to * the expected triples. that requires a triples compare * OR a true RDF graph compare. * * Deleting the dataset here frees the triples just loaded. */ rasqal_free_dataset(ds); ds = NULL; } break; case RASQAL_QUERY_RESULTS_SYNTAX: case RASQAL_QUERY_RESULTS_UNKNOWN: /* failure */ fprintf(stderr, "%s: Reading %s query results format is not supported", program, rasqal_query_results_type_label(results_type)); rc = 1; goto tidy_setup; } } /* save results for query execution so we can print and rewind */ rasqal_query_set_store_results(rq, 1); results = rasqal_query_execute(rq); if(results) { switch(results_type) { case RASQAL_QUERY_RESULTS_BINDINGS: fprintf(stderr, "%s: Expected bindings results:\n", program); rasqal_cmdline_print_bindings_results_simple(program, expected_results, stderr, 1, 0); fprintf(stderr, "%s: Actual bindings results:\n", program); rasqal_cmdline_print_bindings_results_simple(program, results, stderr, 1, 0); rasqal_query_results_rewind(expected_results); rasqal_query_results_rewind(results); /* FIXME: should NOT do this if results are expected to be ordered */ rasqal_query_results_sort(expected_results); rasqal_query_results_sort(results); if(1) { rasqal_results_compare* rrc; rrc = rasqal_new_results_compare(world, expected_results, "expected", results, "actual"); rasqal_results_compare_set_log_handler(rrc, world, check_query_log_handler); rc = !rasqal_results_compare_compare(rrc); rasqal_free_results_compare(rrc); rrc = NULL; } break; case RASQAL_QUERY_RESULTS_BOOLEAN: if(1) { int expected_boolean = rasqal_query_results_get_boolean(expected_results); int actual_boolean = rasqal_query_results_get_boolean(results); RASQAL_DEBUG2("Expected boolean result: %d\n", expected_boolean); RASQAL_DEBUG2("Actual boolean result: %d\n", actual_boolean); rc = (expected_boolean != actual_boolean); } break; case RASQAL_QUERY_RESULTS_GRAPH: case RASQAL_QUERY_RESULTS_SYNTAX: case RASQAL_QUERY_RESULTS_UNKNOWN: /* failure */ fprintf(stderr, "%s: Query result format %d cannot be tested.", program, results_type); rc = 1; goto tidy_setup; } } else rc = 1; if(verbose) { fprintf(stdout, "%s: Result: %s\n", program, rc ? "FAILURE" : "success"); } if(results) { rasqal_free_query_results(results); results = NULL; } tidy_query: if(rq) rasqal_free_query(rq); tidy_setup: if(expected_results) rasqal_free_query_results(expected_results); if(results) rasqal_free_query_results(results); if(result_iostr) raptor_free_iostream(result_iostr); if(ds) rasqal_free_dataset(ds); if(free_query_base_uri_string) raptor_free_memory(query_base_uri_string); if(query_base_uri) raptor_free_uri(query_base_uri); if(data_graphs) raptor_free_sequence(data_graphs); rasqal_free_world(world); return (rc); }