Annotation of embedaddon/sqlite3/test/notnull.test, revision 1.1.1.1

1.1       misho       1: # 2002 January 29
                      2: #
                      3: # The author disclaims copyright to this source code.  In place of
                      4: # a legal notice, here is a blessing:
                      5: #
                      6: #    May you do good and not evil.
                      7: #    May you find forgiveness for yourself and forgive others.
                      8: #    May you share freely, never taking more than you give.
                      9: #
                     10: #***********************************************************************
                     11: # This file implements regression tests for SQLite library.
                     12: #
                     13: # This file implements tests for the NOT NULL constraint.
                     14: #
                     15: # $Id: notnull.test,v 1.4 2006/01/17 09:35:02 danielk1977 Exp $
                     16: 
                     17: set testdir [file dirname $argv0]
                     18: source $testdir/tester.tcl
                     19: 
                     20: ifcapable !conflict {
                     21:   finish_test
                     22:   return
                     23: }
                     24: 
                     25: do_test notnull-1.0 {
                     26:   execsql {
                     27:     CREATE TABLE t1 (
                     28:       a NOT NULL,
                     29:       b NOT NULL DEFAULT 5,
                     30:       c NOT NULL ON CONFLICT REPLACE DEFAULT 6,
                     31:       d NOT NULL ON CONFLICT IGNORE DEFAULT 7,
                     32:       e NOT NULL ON CONFLICT ABORT DEFAULT 8
                     33:     );
                     34:     SELECT * FROM t1;
                     35:   }
                     36: } {}
                     37: do_test notnull-1.1 {
                     38:   catchsql {
                     39:     DELETE FROM t1;
                     40:     INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5);
                     41:     SELECT * FROM t1 order by a;
                     42:   }
                     43: } {0 {1 2 3 4 5}}
                     44: do_test notnull-1.2 {
                     45:   catchsql {
                     46:     DELETE FROM t1;
                     47:     INSERT INTO t1(b,c,d,e) VALUES(2,3,4,5);
                     48:     SELECT * FROM t1 order by a;
                     49:   }
                     50: } {1 {t1.a may not be NULL}}
                     51: do_test notnull-1.3 {
                     52:   catchsql {
                     53:     DELETE FROM t1;
                     54:     INSERT OR IGNORE INTO t1(b,c,d,e) VALUES(2,3,4,5);
                     55:     SELECT * FROM t1 order by a;
                     56:   }
                     57: } {0 {}}
                     58: do_test notnull-1.4 {
                     59:   catchsql {
                     60:     DELETE FROM t1;
                     61:     INSERT OR REPLACE INTO t1(b,c,d,e) VALUES(2,3,4,5);
                     62:     SELECT * FROM t1 order by a;
                     63:   }
                     64: } {1 {t1.a may not be NULL}}
                     65: do_test notnull-1.5 {
                     66:   catchsql {
                     67:     DELETE FROM t1;
                     68:     INSERT OR ABORT INTO t1(b,c,d,e) VALUES(2,3,4,5);
                     69:     SELECT * FROM t1 order by a;
                     70:   }
                     71: } {1 {t1.a may not be NULL}}
                     72: do_test notnull-1.6 {
                     73:   catchsql {
                     74:     DELETE FROM t1;
                     75:     INSERT INTO t1(a,c,d,e) VALUES(1,3,4,5);
                     76:     SELECT * FROM t1 order by a;
                     77:   }
                     78: } {0 {1 5 3 4 5}}
                     79: do_test notnull-1.7 {
                     80:   catchsql {
                     81:     DELETE FROM t1;
                     82:     INSERT OR IGNORE INTO t1(a,c,d,e) VALUES(1,3,4,5);
                     83:     SELECT * FROM t1 order by a;
                     84:   }
                     85: } {0 {1 5 3 4 5}}
                     86: do_test notnull-1.8 {
                     87:   catchsql {
                     88:     DELETE FROM t1;
                     89:     INSERT OR REPLACE INTO t1(a,c,d,e) VALUES(1,3,4,5);
                     90:     SELECT * FROM t1 order by a;
                     91:   }
                     92: } {0 {1 5 3 4 5}}
                     93: do_test notnull-1.9 {
                     94:   catchsql {
                     95:     DELETE FROM t1;
                     96:     INSERT OR ABORT INTO t1(a,c,d,e) VALUES(1,3,4,5);
                     97:     SELECT * FROM t1 order by a;
                     98:   }
                     99: } {0 {1 5 3 4 5}}
                    100: do_test notnull-1.10 {
                    101:   catchsql {
                    102:     DELETE FROM t1;
                    103:     INSERT INTO t1(a,b,c,d,e) VALUES(1,null,3,4,5);
                    104:     SELECT * FROM t1 order by a;
                    105:   }
                    106: } {1 {t1.b may not be NULL}}
                    107: do_test notnull-1.11 {
                    108:   catchsql {
                    109:     DELETE FROM t1;
                    110:     INSERT OR IGNORE INTO t1(a,b,c,d,e) VALUES(1,null,3,4,5);
                    111:     SELECT * FROM t1 order by a;
                    112:   }
                    113: } {0 {}}
                    114: do_test notnull-1.12 {
                    115:   catchsql {
                    116:     DELETE FROM t1;
                    117:     INSERT OR REPLACE INTO t1(a,b,c,d,e) VALUES(1,null,3,4,5);
                    118:     SELECT * FROM t1 order by a;
                    119:   }
                    120: } {0 {1 5 3 4 5}}
                    121: do_test notnull-1.13 {
                    122:   catchsql {
                    123:     DELETE FROM t1;
                    124:     INSERT INTO t1(a,b,c,d,e) VALUES(1,2,null,4,5);
                    125:     SELECT * FROM t1 order by a;
                    126:   }
                    127: } {0 {1 2 6 4 5}}
                    128: do_test notnull-1.14 {
                    129:   catchsql {
                    130:     DELETE FROM t1;
                    131:     INSERT OR IGNORE INTO t1(a,b,c,d,e) VALUES(1,2,null,4,5);
                    132:     SELECT * FROM t1 order by a;
                    133:   }
                    134: } {0 {}}
                    135: do_test notnull-1.15 {
                    136:   catchsql {
                    137:     DELETE FROM t1;
                    138:     INSERT OR REPLACE INTO t1(a,b,c,d,e) VALUES(1,2,null,4,5);
                    139:     SELECT * FROM t1 order by a;
                    140:   }
                    141: } {0 {1 2 6 4 5}}
                    142: do_test notnull-1.16 {
                    143:   catchsql {
                    144:     DELETE FROM t1;
                    145:     INSERT OR ABORT INTO t1(a,b,c,d,e) VALUES(1,2,null,4,5);
                    146:     SELECT * FROM t1 order by a;
                    147:   }
                    148: } {1 {t1.c may not be NULL}}
                    149: do_test notnull-1.17 {
                    150:   catchsql {
                    151:     DELETE FROM t1;
                    152:     INSERT OR ABORT INTO t1(a,b,c,d,e) VALUES(1,2,3,null,5);
                    153:     SELECT * FROM t1 order by a;
                    154:   }
                    155: } {1 {t1.d may not be NULL}}
                    156: do_test notnull-1.18 {
                    157:   catchsql {
                    158:     DELETE FROM t1;
                    159:     INSERT OR ABORT INTO t1(a,b,c,e) VALUES(1,2,3,5);
                    160:     SELECT * FROM t1 order by a;
                    161:   }
                    162: } {0 {1 2 3 7 5}}
                    163: do_test notnull-1.19 {
                    164:   catchsql {
                    165:     DELETE FROM t1;
                    166:     INSERT INTO t1(a,b,c,d) VALUES(1,2,3,4);
                    167:     SELECT * FROM t1 order by a;
                    168:   }
                    169: } {0 {1 2 3 4 8}}
                    170: do_test notnull-1.20 {
                    171:   catchsql {
                    172:     DELETE FROM t1;
                    173:     INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,null);
                    174:     SELECT * FROM t1 order by a;
                    175:   }
                    176: } {1 {t1.e may not be NULL}}
                    177: do_test notnull-1.21 {
                    178:   catchsql {
                    179:     DELETE FROM t1;
                    180:     INSERT OR REPLACE INTO t1(e,d,c,b,a) VALUES(1,2,3,null,5);
                    181:     SELECT * FROM t1 order by a;
                    182:   }
                    183: } {0 {5 5 3 2 1}}
                    184: 
                    185: do_test notnull-2.1 {
                    186:   catchsql {
                    187:     DELETE FROM t1;
                    188:     INSERT INTO t1 VALUES(1,2,3,4,5);
                    189:     UPDATE t1 SET a=null;
                    190:     SELECT * FROM t1 ORDER BY a;
                    191:   }
                    192: } {1 {t1.a may not be NULL}}
                    193: do_test notnull-2.2 {
                    194:   catchsql {
                    195:     DELETE FROM t1;
                    196:     INSERT INTO t1 VALUES(1,2,3,4,5);
                    197:     UPDATE OR REPLACE t1 SET a=null;
                    198:     SELECT * FROM t1 ORDER BY a;
                    199:   }
                    200: } {1 {t1.a may not be NULL}}
                    201: do_test notnull-2.3 {
                    202:   catchsql {
                    203:     DELETE FROM t1;
                    204:     INSERT INTO t1 VALUES(1,2,3,4,5);
                    205:     UPDATE OR IGNORE t1 SET a=null;
                    206:     SELECT * FROM t1 ORDER BY a;
                    207:   }
                    208: } {0 {1 2 3 4 5}}
                    209: do_test notnull-2.4 {
                    210:   catchsql {
                    211:     DELETE FROM t1;
                    212:     INSERT INTO t1 VALUES(1,2,3,4,5);
                    213:     UPDATE OR ABORT t1 SET a=null;
                    214:     SELECT * FROM t1 ORDER BY a;
                    215:   }
                    216: } {1 {t1.a may not be NULL}}
                    217: do_test notnull-2.5 {
                    218:   catchsql {
                    219:     DELETE FROM t1;
                    220:     INSERT INTO t1 VALUES(1,2,3,4,5);
                    221:     UPDATE t1 SET b=null;
                    222:     SELECT * FROM t1 ORDER BY a;
                    223:   }
                    224: } {1 {t1.b may not be NULL}}
                    225: do_test notnull-2.6 {
                    226:   catchsql {
                    227:     DELETE FROM t1;
                    228:     INSERT INTO t1 VALUES(1,2,3,4,5);
                    229:     UPDATE OR REPLACE t1 SET b=null, d=e, e=d;
                    230:     SELECT * FROM t1 ORDER BY a;
                    231:   }
                    232: } {0 {1 5 3 5 4}}
                    233: do_test notnull-2.7 {
                    234:   catchsql {
                    235:     DELETE FROM t1;
                    236:     INSERT INTO t1 VALUES(1,2,3,4,5);
                    237:     UPDATE OR IGNORE t1 SET b=null, d=e, e=d;
                    238:     SELECT * FROM t1 ORDER BY a;
                    239:   }
                    240: } {0 {1 2 3 4 5}}
                    241: do_test notnull-2.8 {
                    242:   catchsql {
                    243:     DELETE FROM t1;
                    244:     INSERT INTO t1 VALUES(1,2,3,4,5);
                    245:     UPDATE t1 SET c=null, d=e, e=d;
                    246:     SELECT * FROM t1 ORDER BY a;
                    247:   }
                    248: } {0 {1 2 6 5 4}}
                    249: do_test notnull-2.9 {
                    250:   catchsql {
                    251:     DELETE FROM t1;
                    252:     INSERT INTO t1 VALUES(1,2,3,4,5);
                    253:     UPDATE t1 SET d=null, a=b, b=a;
                    254:     SELECT * FROM t1 ORDER BY a;
                    255:   }
                    256: } {0 {1 2 3 4 5}}
                    257: do_test notnull-2.10 {
                    258:   catchsql {
                    259:     DELETE FROM t1;
                    260:     INSERT INTO t1 VALUES(1,2,3,4,5);
                    261:     UPDATE t1 SET e=null, a=b, b=a;
                    262:     SELECT * FROM t1 ORDER BY a;
                    263:   }
                    264: } {1 {t1.e may not be NULL}}
                    265: 
                    266: do_test notnull-3.0 {
                    267:   execsql {
                    268:     CREATE INDEX t1a ON t1(a);
                    269:     CREATE INDEX t1b ON t1(b);
                    270:     CREATE INDEX t1c ON t1(c);
                    271:     CREATE INDEX t1d ON t1(d);
                    272:     CREATE INDEX t1e ON t1(e);
                    273:     CREATE INDEX t1abc ON t1(a,b,c);
                    274:   }
                    275: } {}
                    276: do_test notnull-3.1 {
                    277:   catchsql {
                    278:     DELETE FROM t1;
                    279:     INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5);
                    280:     SELECT * FROM t1 order by a;
                    281:   }
                    282: } {0 {1 2 3 4 5}}
                    283: do_test notnull-3.2 {
                    284:   catchsql {
                    285:     DELETE FROM t1;
                    286:     INSERT INTO t1(b,c,d,e) VALUES(2,3,4,5);
                    287:     SELECT * FROM t1 order by a;
                    288:   }
                    289: } {1 {t1.a may not be NULL}}
                    290: do_test notnull-3.3 {
                    291:   catchsql {
                    292:     DELETE FROM t1;
                    293:     INSERT OR IGNORE INTO t1(b,c,d,e) VALUES(2,3,4,5);
                    294:     SELECT * FROM t1 order by a;
                    295:   }
                    296: } {0 {}}
                    297: do_test notnull-3.4 {
                    298:   catchsql {
                    299:     DELETE FROM t1;
                    300:     INSERT OR REPLACE INTO t1(b,c,d,e) VALUES(2,3,4,5);
                    301:     SELECT * FROM t1 order by a;
                    302:   }
                    303: } {1 {t1.a may not be NULL}}
                    304: do_test notnull-3.5 {
                    305:   catchsql {
                    306:     DELETE FROM t1;
                    307:     INSERT OR ABORT INTO t1(b,c,d,e) VALUES(2,3,4,5);
                    308:     SELECT * FROM t1 order by a;
                    309:   }
                    310: } {1 {t1.a may not be NULL}}
                    311: do_test notnull-3.6 {
                    312:   catchsql {
                    313:     DELETE FROM t1;
                    314:     INSERT INTO t1(a,c,d,e) VALUES(1,3,4,5);
                    315:     SELECT * FROM t1 order by a;
                    316:   }
                    317: } {0 {1 5 3 4 5}}
                    318: do_test notnull-3.7 {
                    319:   catchsql {
                    320:     DELETE FROM t1;
                    321:     INSERT OR IGNORE INTO t1(a,c,d,e) VALUES(1,3,4,5);
                    322:     SELECT * FROM t1 order by a;
                    323:   }
                    324: } {0 {1 5 3 4 5}}
                    325: do_test notnull-3.8 {
                    326:   catchsql {
                    327:     DELETE FROM t1;
                    328:     INSERT OR REPLACE INTO t1(a,c,d,e) VALUES(1,3,4,5);
                    329:     SELECT * FROM t1 order by a;
                    330:   }
                    331: } {0 {1 5 3 4 5}}
                    332: do_test notnull-3.9 {
                    333:   catchsql {
                    334:     DELETE FROM t1;
                    335:     INSERT OR ABORT INTO t1(a,c,d,e) VALUES(1,3,4,5);
                    336:     SELECT * FROM t1 order by a;
                    337:   }
                    338: } {0 {1 5 3 4 5}}
                    339: do_test notnull-3.10 {
                    340:   catchsql {
                    341:     DELETE FROM t1;
                    342:     INSERT INTO t1(a,b,c,d,e) VALUES(1,null,3,4,5);
                    343:     SELECT * FROM t1 order by a;
                    344:   }
                    345: } {1 {t1.b may not be NULL}}
                    346: do_test notnull-3.11 {
                    347:   catchsql {
                    348:     DELETE FROM t1;
                    349:     INSERT OR IGNORE INTO t1(a,b,c,d,e) VALUES(1,null,3,4,5);
                    350:     SELECT * FROM t1 order by a;
                    351:   }
                    352: } {0 {}}
                    353: do_test notnull-3.12 {
                    354:   catchsql {
                    355:     DELETE FROM t1;
                    356:     INSERT OR REPLACE INTO t1(a,b,c,d,e) VALUES(1,null,3,4,5);
                    357:     SELECT * FROM t1 order by a;
                    358:   }
                    359: } {0 {1 5 3 4 5}}
                    360: do_test notnull-3.13 {
                    361:   catchsql {
                    362:     DELETE FROM t1;
                    363:     INSERT INTO t1(a,b,c,d,e) VALUES(1,2,null,4,5);
                    364:     SELECT * FROM t1 order by a;
                    365:   }
                    366: } {0 {1 2 6 4 5}}
                    367: do_test notnull-3.14 {
                    368:   catchsql {
                    369:     DELETE FROM t1;
                    370:     INSERT OR IGNORE INTO t1(a,b,c,d,e) VALUES(1,2,null,4,5);
                    371:     SELECT * FROM t1 order by a;
                    372:   }
                    373: } {0 {}}
                    374: do_test notnull-3.15 {
                    375:   catchsql {
                    376:     DELETE FROM t1;
                    377:     INSERT OR REPLACE INTO t1(a,b,c,d,e) VALUES(1,2,null,4,5);
                    378:     SELECT * FROM t1 order by a;
                    379:   }
                    380: } {0 {1 2 6 4 5}}
                    381: do_test notnull-3.16 {
                    382:   catchsql {
                    383:     DELETE FROM t1;
                    384:     INSERT OR ABORT INTO t1(a,b,c,d,e) VALUES(1,2,null,4,5);
                    385:     SELECT * FROM t1 order by a;
                    386:   }
                    387: } {1 {t1.c may not be NULL}}
                    388: do_test notnull-3.17 {
                    389:   catchsql {
                    390:     DELETE FROM t1;
                    391:     INSERT OR ABORT INTO t1(a,b,c,d,e) VALUES(1,2,3,null,5);
                    392:     SELECT * FROM t1 order by a;
                    393:   }
                    394: } {1 {t1.d may not be NULL}}
                    395: do_test notnull-3.18 {
                    396:   catchsql {
                    397:     DELETE FROM t1;
                    398:     INSERT OR ABORT INTO t1(a,b,c,e) VALUES(1,2,3,5);
                    399:     SELECT * FROM t1 order by a;
                    400:   }
                    401: } {0 {1 2 3 7 5}}
                    402: do_test notnull-3.19 {
                    403:   catchsql {
                    404:     DELETE FROM t1;
                    405:     INSERT INTO t1(a,b,c,d) VALUES(1,2,3,4);
                    406:     SELECT * FROM t1 order by a;
                    407:   }
                    408: } {0 {1 2 3 4 8}}
                    409: do_test notnull-3.20 {
                    410:   catchsql {
                    411:     DELETE FROM t1;
                    412:     INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,null);
                    413:     SELECT * FROM t1 order by a;
                    414:   }
                    415: } {1 {t1.e may not be NULL}}
                    416: do_test notnull-3.21 {
                    417:   catchsql {
                    418:     DELETE FROM t1;
                    419:     INSERT OR REPLACE INTO t1(e,d,c,b,a) VALUES(1,2,3,null,5);
                    420:     SELECT * FROM t1 order by a;
                    421:   }
                    422: } {0 {5 5 3 2 1}}
                    423: 
                    424: do_test notnull-4.1 {
                    425:   catchsql {
                    426:     DELETE FROM t1;
                    427:     INSERT INTO t1 VALUES(1,2,3,4,5);
                    428:     UPDATE t1 SET a=null;
                    429:     SELECT * FROM t1 ORDER BY a;
                    430:   }
                    431: } {1 {t1.a may not be NULL}}
                    432: do_test notnull-4.2 {
                    433:   catchsql {
                    434:     DELETE FROM t1;
                    435:     INSERT INTO t1 VALUES(1,2,3,4,5);
                    436:     UPDATE OR REPLACE t1 SET a=null;
                    437:     SELECT * FROM t1 ORDER BY a;
                    438:   }
                    439: } {1 {t1.a may not be NULL}}
                    440: do_test notnull-4.3 {
                    441:   catchsql {
                    442:     DELETE FROM t1;
                    443:     INSERT INTO t1 VALUES(1,2,3,4,5);
                    444:     UPDATE OR IGNORE t1 SET a=null;
                    445:     SELECT * FROM t1 ORDER BY a;
                    446:   }
                    447: } {0 {1 2 3 4 5}}
                    448: do_test notnull-4.4 {
                    449:   catchsql {
                    450:     DELETE FROM t1;
                    451:     INSERT INTO t1 VALUES(1,2,3,4,5);
                    452:     UPDATE OR ABORT t1 SET a=null;
                    453:     SELECT * FROM t1 ORDER BY a;
                    454:   }
                    455: } {1 {t1.a may not be NULL}}
                    456: do_test notnull-4.5 {
                    457:   catchsql {
                    458:     DELETE FROM t1;
                    459:     INSERT INTO t1 VALUES(1,2,3,4,5);
                    460:     UPDATE t1 SET b=null;
                    461:     SELECT * FROM t1 ORDER BY a;
                    462:   }
                    463: } {1 {t1.b may not be NULL}}
                    464: do_test notnull-4.6 {
                    465:   catchsql {
                    466:     DELETE FROM t1;
                    467:     INSERT INTO t1 VALUES(1,2,3,4,5);
                    468:     UPDATE OR REPLACE t1 SET b=null, d=e, e=d;
                    469:     SELECT * FROM t1 ORDER BY a;
                    470:   }
                    471: } {0 {1 5 3 5 4}}
                    472: do_test notnull-4.7 {
                    473:   catchsql {
                    474:     DELETE FROM t1;
                    475:     INSERT INTO t1 VALUES(1,2,3,4,5);
                    476:     UPDATE OR IGNORE t1 SET b=null, d=e, e=d;
                    477:     SELECT * FROM t1 ORDER BY a;
                    478:   }
                    479: } {0 {1 2 3 4 5}}
                    480: do_test notnull-4.8 {
                    481:   catchsql {
                    482:     DELETE FROM t1;
                    483:     INSERT INTO t1 VALUES(1,2,3,4,5);
                    484:     UPDATE t1 SET c=null, d=e, e=d;
                    485:     SELECT * FROM t1 ORDER BY a;
                    486:   }
                    487: } {0 {1 2 6 5 4}}
                    488: do_test notnull-4.9 {
                    489:   catchsql {
                    490:     DELETE FROM t1;
                    491:     INSERT INTO t1 VALUES(1,2,3,4,5);
                    492:     UPDATE t1 SET d=null, a=b, b=a;
                    493:     SELECT * FROM t1 ORDER BY a;
                    494:   }
                    495: } {0 {1 2 3 4 5}}
                    496: do_test notnull-4.10 {
                    497:   catchsql {
                    498:     DELETE FROM t1;
                    499:     INSERT INTO t1 VALUES(1,2,3,4,5);
                    500:     UPDATE t1 SET e=null, a=b, b=a;
                    501:     SELECT * FROM t1 ORDER BY a;
                    502:   }
                    503: } {1 {t1.e may not be NULL}}
                    504: 
                    505: # Test that bug 29ab7be99f is fixed.
                    506: #
                    507: do_test notnull-5.1 {
                    508:   execsql {
                    509:     DROP TABLE IF EXISTS t1;
                    510:     CREATE TABLE t1(a, b NOT NULL);
                    511:     CREATE TABLE t2(c, d);
                    512:     INSERT INTO t2 VALUES(3, 4);
                    513:     INSERT INTO t2 VALUES(5, NULL);
                    514:   }
                    515: }  {}
                    516: do_test notnull-5.2 {
                    517:   catchsql {
                    518:     INSERT INTO t1 VALUES(1, 2);
                    519:     INSERT INTO t1 SELECT * FROM t2;
                    520:   }
                    521: } {1 {t1.b may not be NULL}}
                    522: do_test notnull-5.3 {
                    523:   execsql { SELECT * FROM t1 }
                    524: } {1 2}
                    525: do_test notnull-5.4 {
                    526:   catchsql {
                    527:     DELETE FROM t1;
                    528:     BEGIN;
                    529:       INSERT INTO t1 VALUES(1, 2);
                    530:       INSERT INTO t1 SELECT * FROM t2;
                    531:     COMMIT;
                    532:   }
                    533: } {1 {t1.b may not be NULL}}
                    534: do_test notnull-5.5 {
                    535:   execsql { SELECT * FROM t1 }
                    536: } {1 2}
                    537: 
                    538: finish_test
                    539: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>