|
1 | 1 | /*
|
2 | 2 | * GiST support for ltree
|
3 | 3 | * Teodor Sigaev <teodor@stack.net>
|
4 |
| - * $PostgreSQL: pgsql/contrib/ltree/ltree_gist.c,v 1.17 2006/08/07 17:39:04 teodor Exp $ |
| 4 | + * $PostgreSQL: pgsql/contrib/ltree/ltree_gist.c,v 1.18 2006/08/08 15:45:18 teodor Exp $ |
5 | 5 | */
|
6 | 6 |
|
7 | 7 | #include"ltree.h"
|
@@ -456,16 +456,36 @@ gist_isparent(ltree_gist * key, ltree * query)
|
456 | 456 | return false;
|
457 | 457 | }
|
458 | 458 |
|
| 459 | +staticltree* |
| 460 | +copy_ltree(ltree*src ) { |
| 461 | +ltree*dst= (ltree*)palloc(src->len); |
| 462 | +memcpy(dst,src,src->len); |
| 463 | +returndst; |
| 464 | +} |
| 465 | + |
459 | 466 | staticbool
|
460 | 467 | gist_ischild(ltree_gist*key,ltree*query)
|
461 | 468 | {
|
462 |
| -if (ltree_compare(query,LTG_GETLNODE(key))<0) |
463 |
| -return false; |
| 469 | +ltree*left=copy_ltree(LTG_GETLNODE(key)); |
| 470 | +ltree*right=copy_ltree(LTG_GETRNODE(key)); |
| 471 | +boolres= true; |
464 | 472 |
|
465 |
| -if (ltree_compare(query,LTG_GETRNODE(key))>0) |
466 |
| -return false; |
| 473 | +if (left->numlevel>query->numlevel) |
| 474 | +left->numlevel=query->numlevel; |
467 | 475 |
|
468 |
| -return true; |
| 476 | +if (ltree_compare(query,left)<0) |
| 477 | +res= false; |
| 478 | + |
| 479 | +if (right->numlevel>query->numlevel) |
| 480 | +right->numlevel=query->numlevel; |
| 481 | + |
| 482 | +if (res&<ree_compare(query,right)>0) |
| 483 | +res= false; |
| 484 | + |
| 485 | +pfree(left); |
| 486 | +pfree(right); |
| 487 | + |
| 488 | +returnres; |
469 | 489 | }
|
470 | 490 |
|
471 | 491 | staticbool
|
|