@@ -599,6 +599,8 @@ func errorString(err Error) string {
599
599
// "deferred", "exclusive".
600
600
// _foreign_keys=X
601
601
// Enable or disable enforcement of foreign keys. X can be 1 or 0.
602
+ // _recursive_triggers=X
603
+ // Enable or disable recursive triggers. X can be 1 or 0.
602
604
func (d * SQLiteDriver ) Open (dsn string ) (driver.Conn , error ) {
603
605
if C .sqlite3_threadsafe () == 0 {
604
606
return nil , errors .New ("sqlite library was not compiled for thread-safe operation" )
@@ -608,6 +610,7 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
608
610
txlock := "BEGIN"
609
611
busyTimeout := 5000
610
612
foreignKeys := - 1
613
+ recursiveTriggers := - 1
611
614
pos := strings .IndexRune (dsn , '?' )
612
615
if pos >= 1 {
613
616
params , err := url .ParseQuery (dsn [pos + 1 :])
@@ -662,6 +665,18 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
662
665
}
663
666
}
664
667
668
+ // _recursive_triggers
669
+ if val := params .Get ("_recursive_triggers" ); val != "" {
670
+ switch val {
671
+ case "1" :
672
+ recursiveTriggers = 1
673
+ case "0" :
674
+ recursiveTriggers = 0
675
+ default :
676
+ return nil , fmt .Errorf ("Invalid _recursive_triggers: %v" , val )
677
+ }
678
+ }
679
+
665
680
if ! strings .HasPrefix (dsn , "file:" ) {
666
681
dsn = dsn [:pos ]
667
682
}
@@ -708,6 +723,17 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
708
723
return nil , err
709
724
}
710
725
}
726
+ if recursiveTriggers == 0 {
727
+ if err := exec ("PRAGMA recursive_triggers = OFF;" ); err != nil {
728
+ C .sqlite3_close_v2 (db )
729
+ return nil , err
730
+ }
731
+ } else if recursiveTriggers == 1 {
732
+ if err := exec ("PRAGMA recursive_triggers = ON;" ); err != nil {
733
+ C .sqlite3_close_v2 (db )
734
+ return nil , err
735
+ }
736
+ }
711
737
712
738
conn := & SQLiteConn {db : db , loc : loc , txlock : txlock }
713
739
0 commit comments