|
| 1 | +/** |
| 2 | + * Test parameterized queries returning correct node IDs |
| 3 | + */ |
| 4 | +#include <stdio.h> |
| 5 | +#include <stdlib.h> |
| 6 | +#include <string.h> |
| 7 | +#include <sqlite3.h> |
| 8 | + |
| 9 | +int main() { |
| 10 | + sqlite3 *db; |
| 11 | + char *err_msg = NULL; |
| 12 | + int rc; |
| 13 | + |
| 14 | + // Open in-memory database |
| 15 | + rc = sqlite3_open(":memory:", &db); |
| 16 | + if (rc != SQLITE_OK) { |
| 17 | + fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db)); |
| 18 | + return 1; |
| 19 | + } |
| 20 | + |
| 21 | + // Load graphqlite extension |
| 22 | + sqlite3_enable_load_extension(db, 1); |
| 23 | + rc = sqlite3_load_extension(db, "./build/graphqlite", NULL, &err_msg); |
| 24 | + if (rc != SQLITE_OK) { |
| 25 | + fprintf(stderr, "Cannot load extension: %s\n", err_msg); |
| 26 | + sqlite3_free(err_msg); |
| 27 | + return 1; |
| 28 | + } |
| 29 | + |
| 30 | + printf("Test: Parameterized queries should return unique node IDs\n\n"); |
| 31 | + |
| 32 | + // Create three nodes with different names using parameters |
| 33 | + const char *names[] = {"Alice", "Bob", "Charlie"}; |
| 34 | + int node_ids[3] = {0, 0, 0}; |
| 35 | + |
| 36 | + for (int i = 0; i < 3; i++) { |
| 37 | + // Create node with parameterized query |
| 38 | + char query[512]; |
| 39 | + snprintf(query, sizeof(query), |
| 40 | + "SELECT cypher('CREATE (a:Person {name: $name})', '{\"name\": \"%s\"}')", |
| 41 | + names[i]); |
| 42 | + |
| 43 | + rc = sqlite3_exec(db, query, NULL, NULL, &err_msg); |
| 44 | + if (rc != SQLITE_OK) { |
| 45 | + fprintf(stderr, "Create failed: %s\n", err_msg); |
| 46 | + sqlite3_free(err_msg); |
| 47 | + return 1; |
| 48 | + } |
| 49 | + printf("Created node with name: %s\n", names[i]); |
| 50 | + } |
| 51 | + |
| 52 | + printf("\nQuerying nodes back:\n"); |
| 53 | + |
| 54 | + // Query each node back |
| 55 | + for (int i = 0; i < 3; i++) { |
| 56 | + char query[512]; |
| 57 | + snprintf(query, sizeof(query), |
| 58 | + "SELECT cypher('MATCH (a:Person {name: $name}) RETURN id(a) AS node_id, a.name AS name', '{\"name\": \"%s\"}')", |
| 59 | + names[i]); |
| 60 | + |
| 61 | + sqlite3_stmt *stmt; |
| 62 | + rc = sqlite3_prepare_v2(db, query, -1, &stmt, NULL); |
| 63 | + if (rc != SQLITE_OK) { |
| 64 | + fprintf(stderr, "Prepare failed: %s\n", sqlite3_errmsg(db)); |
| 65 | + return 1; |
| 66 | + } |
| 67 | + |
| 68 | + while (sqlite3_step(stmt) == SQLITE_ROW) { |
| 69 | + const char *result = (const char *)sqlite3_column_text(stmt, 0); |
| 70 | + printf(" Query for '%s': %s\n", names[i], result); |
| 71 | + } |
| 72 | + sqlite3_finalize(stmt); |
| 73 | + } |
| 74 | + |
| 75 | + printf("\nQuerying all nodes without parameters:\n"); |
| 76 | + |
| 77 | + // Query all nodes |
| 78 | + sqlite3_stmt *stmt; |
| 79 | + rc = sqlite3_prepare_v2(db, |
| 80 | + "SELECT cypher('MATCH (a:Person) RETURN id(a) AS node_id, a.name AS name')", |
| 81 | + -1, &stmt, NULL); |
| 82 | + if (rc == SQLITE_OK) { |
| 83 | + while (sqlite3_step(stmt) == SQLITE_ROW) { |
| 84 | + const char *result = (const char *)sqlite3_column_text(stmt, 0); |
| 85 | + printf(" %s\n", result); |
| 86 | + } |
| 87 | + sqlite3_finalize(stmt); |
| 88 | + } |
| 89 | + |
| 90 | + sqlite3_close(db); |
| 91 | + printf("\nTest complete.\n"); |
| 92 | + return 0; |
| 93 | +} |
0 commit comments