test_prepare.mod 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. MODULE test_prepare ;
  2. (*
  3. m2SQLITE smoke test: prepare/bind/step/column/finalize round trip,
  4. covering int, int64, double and text plus the SQLiteUtils
  5. TRANSIENT bind helpers.
  6. *)
  7. FROM SYSTEM IMPORT ADDRESS, ADR;
  8. FROM SQLite IMPORT DbHandle, StmtHandle,
  9. SQLiteOk, SQLiteRow, SQLiteDone, SQLiteText,
  10. sqlite3_open, sqlite3_close,
  11. sqlite3_prepare_v2, sqlite3_step, sqlite3_finalize,
  12. sqlite3_bind_int, sqlite3_bind_int64, sqlite3_bind_double,
  13. sqlite3_bind_null,
  14. sqlite3_bind_parameter_count, sqlite3_bind_parameter_index,
  15. sqlite3_column_int, sqlite3_column_int64, sqlite3_column_double,
  16. sqlite3_column_text, sqlite3_column_type, sqlite3_column_count;
  17. FROM SQLiteUtils IMPORT ExecSimple, BindTextCopy, CStrToM2, ErrMsg;
  18. FROM libc IMPORT printf;
  19. VAR db: DbHandle; stmt: StmtHandle;
  20. rc, n: INTEGER; buf: ARRAY [0..63] OF CHAR;
  21. i: INTEGER; li: LONGINT; d: REAL;
  22. tp: INTEGER;
  23. BEGIN
  24. IF sqlite3_open(":memory:", db) # SQLiteOk THEN
  25. printf("FAIL test_prepare: open\n");
  26. HALT(1)
  27. END;
  28. IF ExecSimple(db, "CREATE TABLE t(a INTEGER, b INTEGER, c REAL, d TEXT);")
  29. # SQLiteOk THEN
  30. ErrMsg(db, buf);
  31. printf("FAIL test_prepare: create %s\n", buf);
  32. HALT(1)
  33. END;
  34. rc := sqlite3_prepare_v2(db, "INSERT INTO t(a,b,c,d) VALUES(?,?,?,?);",
  35. -1, stmt, NIL);
  36. IF rc # SQLiteOk THEN
  37. ErrMsg(db, buf);
  38. printf("FAIL test_prepare: prep insert %s\n", buf);
  39. HALT(1)
  40. END;
  41. IF sqlite3_bind_parameter_count(stmt) # 4 THEN
  42. printf("FAIL test_prepare: param count\n");
  43. HALT(1)
  44. END;
  45. IF sqlite3_bind_int(stmt, 1, 42) # SQLiteOk THEN HALT(1) END;
  46. IF sqlite3_bind_int64(stmt, 2, VAL(LONGINT, 9000000001)) # SQLiteOk THEN
  47. printf("FAIL test_prepare: bind int64\n");
  48. HALT(1)
  49. END;
  50. IF sqlite3_bind_double(stmt, 3, 2.5) # SQLiteOk THEN HALT(1) END;
  51. IF BindTextCopy(stmt, 4, "hello") # SQLiteOk THEN HALT(1) END;
  52. rc := sqlite3_step(stmt);
  53. IF rc # SQLiteDone THEN
  54. printf("FAIL test_prepare: step insert rc=%d\n", rc);
  55. HALT(1)
  56. END;
  57. rc := sqlite3_finalize(stmt);
  58. IF rc # SQLiteOk THEN HALT(1) END;
  59. (* named parameter lookup *)
  60. rc := sqlite3_prepare_v2(db, "SELECT * FROM t WHERE a = :v;", -1,
  61. stmt, NIL);
  62. IF rc # SQLiteOk THEN HALT(1) END;
  63. n := sqlite3_bind_parameter_index(stmt, ":v");
  64. printf("param :v index=%d\n", n);
  65. IF n # 1 THEN
  66. printf("FAIL test_prepare: param index=%d\n", n);
  67. HALT(1)
  68. END;
  69. IF sqlite3_bind_int(stmt, n, 42) # SQLiteOk THEN HALT(1) END;
  70. rc := sqlite3_step(stmt);
  71. IF rc # SQLiteRow THEN
  72. printf("FAIL test_prepare: step select rc=%d\n", rc);
  73. HALT(1)
  74. END;
  75. IF sqlite3_column_count(stmt) # 4 THEN
  76. printf("FAIL test_prepare: column count\n");
  77. HALT(1)
  78. END;
  79. i := sqlite3_column_int(stmt, 0);
  80. li := sqlite3_column_int64(stmt, 1);
  81. d := sqlite3_column_double(stmt, 2);
  82. tp := sqlite3_column_type(stmt, 3);
  83. CStrToM2(sqlite3_column_text(stmt, 3), buf);
  84. printf("row a=%d b=%ld c=%f d=%s t=%d\n", i, li, d, buf, tp);
  85. IF (i # 42) OR (li # VAL(LONGINT, 9000000001)) THEN
  86. printf("FAIL test_prepare: int values\n");
  87. HALT(1)
  88. END;
  89. IF (d < 2.49) OR (d > 2.51) THEN
  90. printf("FAIL test_prepare: double value\n");
  91. HALT(1)
  92. END;
  93. IF tp # SQLiteText THEN
  94. printf("FAIL test_prepare: text type=%d\n", tp);
  95. HALT(1)
  96. END;
  97. IF (buf[0] # 'h') THEN
  98. printf("FAIL test_prepare: text value\n");
  99. HALT(1)
  100. END;
  101. rc := sqlite3_step(stmt);
  102. IF rc # SQLiteDone THEN
  103. printf("FAIL test_prepare: drain rc=%d\n", rc);
  104. HALT(1)
  105. END;
  106. IF sqlite3_finalize(stmt) # SQLiteOk THEN HALT(1) END;
  107. (* NULL bind *)
  108. IF sqlite3_prepare_v2(db, "SELECT ?;", -1, stmt, NIL) # SQLiteOk THEN
  109. HALT(1)
  110. END;
  111. IF sqlite3_bind_null(stmt, 1) # SQLiteOk THEN HALT(1) END;
  112. IF sqlite3_step(stmt) # SQLiteRow THEN HALT(1) END;
  113. IF sqlite3_finalize(stmt) # SQLiteOk THEN HALT(1) END;
  114. IF sqlite3_close(db) # SQLiteOk THEN HALT(1) END;
  115. printf("PASS test_prepare\n")
  116. END test_prepare.