@@ -275,6 +275,140 @@ CheckIndexCompatible(Oid oldId,
275
275
return ret ;
276
276
}
277
277
278
+ #if 0
279
+ void
280
+ AlterIndex (Oid relationId , IndexStmt * stmt , Oid indexRelationId )
281
+ {
282
+ char * select ;
283
+ IndexUniqueCheck checkUnique ;
284
+ bool satisfiesConstraint ;
285
+ Datum values [INDEX_MAX_KEYS ];
286
+ bool isnull [INDEX_MAX_KEYS ];
287
+ Relation heapRelation ;
288
+ Relation indexRelation ;
289
+ SPIPlanPtr plan ;
290
+ Portal portal ;
291
+ HeapTuple tuple ;
292
+ TupleDesc tupdesc ;
293
+ TupleTableSlot * slot ;
294
+ ItemPointer tupleid ;
295
+ IndexInfo * indexInfo ;
296
+ EState * estate ;
297
+
298
+ Assert (stmt -> whereClause );
299
+
300
+ /* Open and lock the parent heap relation */
301
+ heapRelation = heap_openrv (stmt -> relation , ShareUpdateExclusiveLock );
302
+
303
+ /* And the target index relation */
304
+ indexRelation = index_open (indexRelationId , RowExclusiveLock );
305
+
306
+ indexInfo = BuildIndexInfo (indexRelation );
307
+ Assert (indexInfo -> ii_Predicate );
308
+ Assert (!indexInfo -> ii_ExclusionOps );
309
+
310
+ /*
311
+ * Generate the constraint and default execution states
312
+ */
313
+ estate = CreateExecutorState ();
314
+
315
+ checkUnique = indexRelation -> rd_index -> indisunique ? UNIQUE_CHECK_YES : UNIQUE_CHECK_NO ;
316
+
317
+ SPI_connect ();
318
+ select = psprintf ("select * from %s where %s and not (%s)" ,
319
+ quote_qualified_identifier (get_namespace_name (RelationGetNamespace (heapRelation )),
320
+ get_rel_name (relationId )),
321
+ nodeToString (indexInfo -> ii_Predicate ),
322
+ nodeToString (stmt -> whereClause )
323
+ );
324
+ plan = SPI_parepare (select , 0 , NULL );
325
+ if (plan == NULL ) {
326
+ ereport (ERROR ,
327
+ (errcode (ERRCODE_INVALID_CURSOR_STATE ),
328
+ errmsg ("Failed to preapre statement " , select )));
329
+ }
330
+ portal = SPI_cursor_open (NULL , plan , NULL , NULL , true);
331
+ if (portal == NULL ) {
332
+ ereport (ERROR ,
333
+ (errcode (ERRCODE_INVALID_CURSOR_STATE ),
334
+ errmsg ("Failed to open cursor for " , select )));
335
+ }
336
+ while (true)
337
+ {
338
+ SPI_cursor_fetch (portal , true, 1 );
339
+ if (!SPI_processed ) {
340
+ break ;
341
+ }
342
+ tuple = SPI_tuptable -> vals [0 ];
343
+ tupdesc = SPI_tuptable -> tupdesc ;
344
+ slot = TupleDescGetSlot (tupdesc );
345
+ tupleid = & tuple -> t_datat -> t_ctid ;
346
+
347
+ /* delete tuple from index */
348
+ }
349
+ SPI_cursor_close (portal );
350
+
351
+
352
+ select = psprintf ("select * from %s where %s and not (%s)" ,
353
+ quote_qualified_identifier (get_namespace_name (RelationGetNamespace (heapRelation )),
354
+ get_rel_name (relationId )),
355
+ nodeToString (stmt -> whereClause ),
356
+ nodeToString (indexInfo -> ii_Predicate )
357
+ );
358
+ plan = SPI_parepare (select , 0 , NULL );
359
+ if (plan == NULL ) {
360
+ ereport (ERROR ,
361
+ (errcode (ERRCODE_INVALID_CURSOR_STATE ),
362
+ errmsg ("Failed to preapre statement " , select )));
363
+ }
364
+ portal = SPI_cursor_open (NULL , plan , NULL , NULL , true);
365
+ if (portal == NULL ) {
366
+ ereport (ERROR ,
367
+ (errcode (ERRCODE_INVALID_CURSOR_STATE ),
368
+ errmsg ("Failed to open cursor for " , select )));
369
+ }
370
+ while (true)
371
+ {
372
+ SPI_cursor_fetch (portal , true, 1 );
373
+ if (!SPI_processed ) {
374
+ break ;
375
+ }
376
+ tuple = SPI_tuptable -> vals [0 ];
377
+ tupdesc = SPI_tuptable -> tupdesc ;
378
+ slot = TupleDescGetSlot (tupdesc );
379
+ tupleid = & tuple -> t_datat -> t_ctid ;
380
+
381
+ FormIndexDatum (indexInfo ,
382
+ slot ,
383
+ estate ,
384
+ values ,
385
+ isnull );
386
+ satisfiesConstraint =
387
+ index_insert (indexRelation , /* index relation */
388
+ values , /* array of index Datums */
389
+ isnull , /* null flags */
390
+ tupleid , /* tid of heap tuple */
391
+ heapRelation , /* heap relation */
392
+ checkUnique ); /* type of uniqueness check to do */
393
+
394
+ if (!satisfiesConstraint )
395
+ {
396
+ ereport (ERROR ,
397
+ (errcode (ERRCODE_INTEGRITY_CONSTRAINT_VIOLATION ),
398
+ errmsg ("Index constraint violation" )));
399
+ }
400
+ SPI_freetuple (tuple );
401
+ SPI_freetuptable (SPI_tuptable );
402
+ }
403
+ SPI_cursor_close (portal );
404
+ SPI_finish ();
405
+
406
+ /* Close both the relations, but keep the locks */
407
+ heap_close (heapRelation , NoLock );
408
+ index_close (indexRelation , NoLock );
409
+ }
410
+ #endif
411
+
278
412
/*
279
413
* DefineIndex
280
414
* Creates a new index.
0 commit comments