@@ -172,22 +172,31 @@ func TestObserve(t *testing.T) {
172172 }
173173
174174 var (
175- observedErr error
176- observedKeyspace string
177- observedStmt string
175+ observedErr error
176+ observedKeyspace string
177+ observedPreparedKeyspace string
178+ observedStmt string
179+ observedPreparedTable string
180+ observedIsPrepared bool
178181 )
179182
180183 const keyspace = "gocql_test"
181184
182185 resetObserved := func () {
183186 observedErr = errors .New ("placeholder only" ) // used to distinguish err=nil cases
184187 observedKeyspace = ""
188+ observedPreparedKeyspace = ""
185189 observedStmt = ""
190+ observedPreparedTable = ""
191+ observedIsPrepared = false
186192 }
187193
188194 observer := funcQueryObserver (func (ctx context.Context , o ObservedQuery ) {
189195 observedKeyspace = o .Keyspace
196+ observedPreparedKeyspace = o .PreparedMetadata .Keyspace
190197 observedStmt = o .Statement
198+ observedPreparedTable = o .PreparedMetadata .Table
199+ observedIsPrepared = o .IsPrepared
191200 observedErr = o .Err
192201 })
193202
@@ -202,6 +211,12 @@ func TestObserve(t *testing.T) {
202211 t .Fatal ("select: unexpected observed keyspace" , observedKeyspace )
203212 } else if observedStmt != `SELECT id FROM observe WHERE id = ?` {
204213 t .Fatal ("select: unexpected observed stmt" , observedStmt )
214+ } else if ! observedIsPrepared {
215+ t .Fatal ("select: expected observed IsPrepared to be true" )
216+ } else if observedPreparedKeyspace != keyspace {
217+ t .Fatal ("select: unexpected observed prepared keyspace" , observedPreparedKeyspace )
218+ } else if observedPreparedTable != "observe" {
219+ t .Fatal ("select: unexpected observed prepared table" , observedPreparedTable )
205220 }
206221
207222 resetObserved ()
@@ -213,6 +228,12 @@ func TestObserve(t *testing.T) {
213228 t .Fatal ("insert: unexpected observed keyspace" , observedKeyspace )
214229 } else if observedStmt != `INSERT INTO observe (id) VALUES (?)` {
215230 t .Fatal ("insert: unexpected observed stmt" , observedStmt )
231+ } else if ! observedIsPrepared {
232+ t .Fatal ("insert: expected observed IsPrepared to be true" )
233+ } else if observedPreparedKeyspace != keyspace {
234+ t .Fatal ("insert: unexpected observed prepared keyspace" , observedPreparedKeyspace )
235+ } else if observedPreparedTable != "observe" {
236+ t .Fatal ("insert: unexpected observed prepared table" , observedPreparedTable )
216237 }
217238
218239 resetObserved ()
@@ -227,6 +248,12 @@ func TestObserve(t *testing.T) {
227248 t .Fatal ("select: unexpected observed keyspace" , observedKeyspace )
228249 } else if observedStmt != `SELECT id FROM observe WHERE id = ?` {
229250 t .Fatal ("select: unexpected observed stmt" , observedStmt )
251+ } else if ! observedIsPrepared {
252+ t .Fatal ("select: expected observed IsPrepared to be true" )
253+ } else if observedPreparedKeyspace != keyspace {
254+ t .Fatal ("select: unexpected observed prepared keyspace" , observedPreparedKeyspace )
255+ } else if observedPreparedTable != "observe" {
256+ t .Fatal ("select: unexpected observed prepared table" , observedPreparedTable )
230257 }
231258
232259 // also works from session observer
@@ -240,6 +267,12 @@ func TestObserve(t *testing.T) {
240267 t .Fatal ("select: unexpected observed keyspace" , observedKeyspace )
241268 } else if observedStmt != `SELECT id FROM observe WHERE id = ?` {
242269 t .Fatal ("select: unexpected observed stmt" , observedStmt )
270+ } else if ! observedIsPrepared {
271+ t .Fatal ("select: expected observed IsPrepared to be true" )
272+ } else if observedPreparedKeyspace != keyspace {
273+ t .Fatal ("select: unexpected observed prepared keyspace" , observedPreparedKeyspace )
274+ } else if observedPreparedTable != "observe" {
275+ t .Fatal ("select: unexpected observed prepared table" , observedPreparedTable )
243276 }
244277
245278 // reports errors when the query is poorly formed
@@ -254,6 +287,24 @@ func TestObserve(t *testing.T) {
254287 } else if observedStmt != `SELECT id FROM unknown_table WHERE id = ?` {
255288 t .Fatal ("select: unexpected observed stmt" , observedStmt )
256289 }
290+
291+ // statements that cannot be prepared (e.g. DDL) report IsPrepared=false and
292+ // a zero PreparedMetadata, so the contract is explicit for observers.
293+ resetObserved ()
294+ const ddlStmt = `CREATE TABLE IF NOT EXISTS gocql_test.observe_unprepared (id int primary key)`
295+ if err := session .Query (ddlStmt ).Observer (observer ).Exec (); err != nil {
296+ t .Fatal ("ddl:" , err )
297+ } else if observedErr != nil {
298+ t .Fatal ("ddl:" , observedErr )
299+ } else if observedStmt != ddlStmt {
300+ t .Fatal ("ddl: unexpected observed stmt" , observedStmt )
301+ } else if observedIsPrepared {
302+ t .Fatal ("ddl: expected observed IsPrepared to be false for unprepared statement" )
303+ } else if observedPreparedKeyspace != "" {
304+ t .Fatal ("ddl: expected zero PreparedMetadata.Keyspace, got" , observedPreparedKeyspace )
305+ } else if observedPreparedTable != "" {
306+ t .Fatal ("ddl: expected zero PreparedMetadata.Table, got" , observedPreparedTable )
307+ }
257308}
258309
259310func TestObserve_Pagination (t * testing.T ) {
@@ -2134,10 +2185,12 @@ func TestBatchObserve(t *testing.T) {
21342185 }
21352186
21362187 type observation struct {
2137- observedErr error
2138- observedKeyspace string
2139- observedStmts []string
2140- observedValues [][]interface {}
2188+ observedErr error
2189+ observedKeyspace string
2190+ observedPreparedMetadata []PreparedMetadata
2191+ observedStmts []string
2192+ observedIsPrepared []bool
2193+ observedValues [][]interface {}
21412194 }
21422195
21432196 var observedBatch * observation
@@ -2149,10 +2202,12 @@ func TestBatchObserve(t *testing.T) {
21492202 }
21502203
21512204 observedBatch = & observation {
2152- observedKeyspace : o .Keyspace ,
2153- observedStmts : o .Statements ,
2154- observedErr : o .Err ,
2155- observedValues : o .Values ,
2205+ observedKeyspace : o .Keyspace ,
2206+ observedPreparedMetadata : o .PreparedMetadata ,
2207+ observedStmts : o .Statements ,
2208+ observedIsPrepared : o .IsPrepared ,
2209+ observedErr : o .Err ,
2210+ observedValues : o .Values ,
21562211 }
21572212 }))
21582213 for i := 0 ; i < 100 ; i ++ {
@@ -2175,11 +2230,29 @@ func TestBatchObserve(t *testing.T) {
21752230 if observedBatch .observedKeyspace != "gocql_test" {
21762231 t .Fatalf ("expecting keyspace 'gocql_test', got %q" , observedBatch .observedKeyspace )
21772232 }
2233+ if len (observedBatch .observedPreparedMetadata ) != 100 {
2234+ t .Fatal ("expecting 100 observed prepared metadata entries, got" , len (observedBatch .observedPreparedMetadata ))
2235+ }
2236+ if len (observedBatch .observedIsPrepared ) != 100 {
2237+ t .Fatal ("expecting 100 observed IsPrepared flags, got" , len (observedBatch .observedIsPrepared ))
2238+ }
21782239 for i , stmt := range observedBatch .observedStmts {
21792240 if stmt != fmt .Sprintf (`INSERT INTO batch_observe_table (id,other) VALUES (?,%d)` , i ) {
21802241 t .Fatal ("unexpected query" , stmt )
21812242 }
21822243
2244+ if ! observedBatch .observedIsPrepared [i ] {
2245+ t .Fatalf ("expected observed IsPrepared at index %d to be true" , i )
2246+ }
2247+
2248+ if observedBatch .observedPreparedMetadata [i ].Keyspace != "gocql_test" {
2249+ t .Fatalf ("unexpected observed prepared keyspace at index %d: %q" , i , observedBatch .observedPreparedMetadata [i ].Keyspace )
2250+ }
2251+
2252+ if observedBatch .observedPreparedMetadata [i ].Table != "batch_observe_table" {
2253+ t .Fatalf ("unexpected observed prepared table at index %d: %q" , i , observedBatch .observedPreparedMetadata [i ].Table )
2254+ }
2255+
21832256 assertDeepEqual (t , "observed value" , []interface {}{i }, observedBatch .observedValues [i ])
21842257 }
21852258}
0 commit comments