#!/usr/bin/tclsh # # Generate SQL that will populate an SQLite database with about 100 megabytes # of pseudo-random JSON text. # # tclsh json-generator.tcl | sqlite3 json110mb.db # # srand() is used to initialize the random seed so that the same JSON # is generated for every run. # expr srand(12345678) set wordlist { ability able abroad access account act action active actor add address adept adroit advance advice affect age ageless agency agent agile agree air airfare airline airport alert almond alpha always amend amount amplify analyst anchor angel angelic angle ankle annual answer antique anybody anyhow appeal apple apricot apt area argon arm army arrival arsenic art artful article arugula aside ask aspect assist assume atom atone attempt author autumn average avocado award awl azure back bacon bag bagel bake baker balance ball balloon bamboo banana band banjo bank barium base basil basin basis basket bass bat bath battery beach beak bean bear bearcub beauty beef beet beige being bell belly belt bench bend benefit best beta better beyond bicycle bid big bike bill bird biscuit bismuth bisque bit black blank blest blind bliss block bloom blue board boat body bokchoy bone bonus book bookish boot border boron boss bossy bottle bottom bow bowl bowtie box brain brainy branch brave bravely bread break breath breezy brick bridge brie brief briefly bright broad broil bromine bronze brother brow brown brush buddy budget buffalo bug bugle bull bunch burger burly burrito bus busy butter button buy buyer byte cab cabbage cabinet cable cadet cadmium caesium cake calcium caliper call caller calm calmly camera camp can canary cancel candle candy cap capable caper capital captain car carbon card care career careful carp carpet carrot carry case cash cassava casual cat catch catfish catsear catsup cause cave celery cell century chain chair chalk chance change channel chapter chard charge charity chart check cheddar cheery cheese chicken chicory chiffon child chin chip chives choice chowder chum church circle city claim clam class classic classy clay clean cleaner clear clearly clerk click client climate clock clorine closet clothes cloud clown club clue cluster coach coast coat cobbler cobolt cod code coffee colby cold collar college comb combine comet comfort command comment common company complex concept concern concert conduit consist contact contest context control convert cook cookie copilot copper copy coral cordial corn corner corny correct cost count counter country county couple courage course court cover cow cowbird crab crack craft crash crazy cream credit creek cress crevice crew crimson croaker crop cross crowd cube cuckoo cuisine culture cup current curve cut cyan cycle dagger daily dance dare darter data date day daylily deal dear dearly debate debit decade decimal deep deft deftly degree delay deluxe deposit depth design desk detail device dew diamond diet dig dill dinner dip direct dirt dish disk display diver divide divine doctor dodger donut door dot double dough draft drag dragon drama draw drawer drawing dream drill drink drive driver drop drum dry dryer drywall duck due dump dusk dust duty dye eagle ear earring earth ease east easy eat economy edge editor eel effect effort egg eight elbow elegant element elf elk email emerald employ end endive endless energy engine enjoy enter entry equal equip error escape essay eternal evening event exam example excuse exit expert extent extreme eye face fact factor factual fail failure fair fajita fall family fan fang farm farmer fat fault feature feed feel feeling fench fennel festive few fiber field fig figure file fill film filter final finance finding finger finish fire fish fishing fit fitting five fix flier flight floor floral florine flour flow flower fly flying focus fold folding food foot force forest forever forgive form formal format fortune forum frame free freedom freely fresh friend frog front fruit fuchsia fuel fun funny future gain galaxy gallium game gamma gap garage garden garlic gas gate gather gauge gear gem gene general gentle gently gherkin ghost gift give glad glass gleeful glossy glove glue goal goat goby gold goldeye golf good gouda goulash gourd grab grace grade gram grand grape grapes grass gravy gray great green grits grocery ground group grouper grout growth guard guave guess guest guide guitar gumbo guppy habit hacksaw haddock hafnium hagfish hair half halibut hall hammer hand handle handy hanger happy hat havarti hay haybale head health healthy hearing heart hearty heat heavy heel height helium hello help helpful herald herring hide high highly highway hill hip hipster hire history hit hoki hold hole holiday holly home honest honey hook hope hopeful horizon horn horse host hotel hour house housing human humane humor hunt hurry ice icecube icefish icy idea ideal image impact impress inch income indigo initial inkpen insect inside intense invite iodine iridium iron island issue item ivory jacket jargon javelin jello jelly jewel job jocund join joint joke jovial joy joyful joyous judge juice jump junior jury just justice kale keel keep kelp ketchup key keyhole keyway khaki kick kid kidney kiloohm kind kindly king kitchen kite kiwi knee knife krill krypton kumquat lab lace lack ladder lake lamp lamprey land laser laugh law lawn lawyer layer lead leader leading leaf leafy league leather leave lecture leek leg lemon length lentil lesson let letter lettuce level library life lift light lily lime limit line linen link lip list listen lithium lively living lizard load loan lobster local lock log long longfin look lotus love lovely loving low lucid luck luffa lunch lung machine magenta magnet mail main major make mall manager mango manner many map march market maroon martian master match math matter maximum maybe meal meaning meat media medium meet meeting melody melon member memory mention menu mercury merry mess message messy metal meter method micron middle might mile milk mind mine minimum minnow minor mint minute mirror miss mission misty mix mixer mixture mobile mode model moment monitor monk month moon moray morning most motor mouse mouth move mover movie much mud mudfish muffin mullet munster muon muscle music mustard nail name nation native natural nature navy neat neatly nebula neck needle neon nerve net network neutron news nibble nice nickel night niobium nobody noise noodle normal north nose note nothing notice nova novel number nurse nursery oar object offer office officer oil okay okra old olive one onion open opening opinion option orange orbit orchid order oregano other ounce outcome outside oven owner oxygen oyster pace pack package page pager paint pair pale pan pancake papaya paper pardon parent park parking parsley parsnip part partner party pass passage past pasta path patient pattern pause pay pea peace peach peacock peahen peak peanut pear pearl pen penalty pencil pension people pepper perch perfect period permit person phase phone photo phrase physics piano pick picture pie piece pigeon pike pilot pin pink pinkie pious pipe pitch pizza place plan plane planet plant planter plastic plate play player playful plenty pliers plum pod poem poet poetry point police policy pollock pony pool pop popover poptart pork port portal post pot potato pound powder power present press price pride primary print prior private prize problem process produce product profile profit program project promise prompt proof proper protein proton public puff puffer pull pumpkin pup pupfish pure purple purpose push put quality quark quarter quiet quill quit quote rabbit raccoon race radiant radio radish radium radon rain rainbow raise ramp ranch range rasp rate ratio ray razor reach read reading real reality reason recipe record recover red redeem reed reef refuse region regret regular relaxed release relief relish remote remove rent repair repeat reply report request reserve resist resolve resort rest result return reveal review reward ribbon rice rich ride ridge right ring rise risk river rivet road roast rock rocket role roll roof room rope rose rough roughy round row royal rub ruby rudder ruin rule run runner rush rust sacred saddle safe safety sail salad salami sale salmon salt sample sand sander sandy sauce save saving saw scale scampi scene scheme school score screen script sea search season seat second secret sector seemly self sell senate senior sense series serve set shake shape share shark shell shift shine shiny ship shock shoe shoot shop shovel show side sign signal silk silly silver simple sing singer single sink site size skill skin sky slate sleep sleepy slice slide slip smart smell smelt smile smoke smooth snap snipe snow snowy sock socket sodium soft softly soil sole solid song sorrel sort soul sound soup source south space spare speech speed spell spend sphere spice spider spirit spite split spoon sport spot spray spread spring squab square squash stable staff stage stand staple star start state status stay steak steel step stern stew stick still stock stone stop store storm story strain street stress strike string stroke strong studio study stuff style sugar suit sulfur summer sun sunny sunset super superb surf survey sweet swim swing switch symbol system table tackle tail tale talk tan tank tap tape target task taste tau tea teach teal team tear tell ten tender tennis tent term test tetra text thanks theme theory thing think thread throat thumb ticket tidy tie tiger till time timely tin tip title toast today toe tomato tone tongue tool tooth top topic total touch tough tour towel tower town track trade train trash travel tray treat tree trick trip trout trowel truck trupet trust truth try tube tuna tune turf turkey turn turnip tutor tux tweet twist two type union unique unit upbeat upper use useful user usual valley value van vase vast veil vein velvet verse very vessel vest video view violet visit visual vivid voice volume vowel voyage waffle wait wake walk wall warm warmth wasabi wash watch water wave wax way wealth wear web wedge week weekly weight west whale what wheat wheel when where while who whole why will win wind window wing winner winter wire wish witty wolf wonder wood wool woolly word work worker world worry worth worthy wrap wrench wrist writer xenon yak yam yard yarrow year yearly yellow yew yogurt young youth zebra zephyr zinc zone zoo } set nwordlist [llength $wordlist] proc random_char {} { return [string index \ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" \ [expr {int(rand()*52)}]] } proc random_label {} { set label [random_char] while {rand()>0.8} { append label [random_char] } if {rand()>0.9} {append label -} append label [format %d [expr {int(rand()*100)}]] return $label } proc random_numeric {} { set n [expr {(rand()*2-1.0)*1e6}] switch [expr {int(rand()*6)}] { 0 {set format %.3f} 1 {set format %.6E} 2 {set format %.4e} default {set format %g} } return [format $format $n] } proc random_json {limit indent} { global nwordlist wordlist set res {} if {$indent==0 || ($limit>0 && rand()>0.5)} { incr limit -1 incr indent 2 set n [expr {int(rand()*5)+1}] if {$n==5} {incr n [expr {int(rand()*10)}]} if {rand()>0.5} { set res \173\n for {set i 0} {$i<$n} {incr i} { append res [string repeat { } $indent] if {rand()>0.8} { if {rand()>0.5} { set sep ":\n [string repeat { } $indent]" } else { set sep " : " } } else { set sep : } append res \"[random_label]\"$sep[random_json $limit $indent] if {$i<$n-1} {append res ,} append res \n } incr indent -2 append res [string repeat { } $indent] append res \175 return $res } else { set res \[\n for {set i 0} {$i<$n} {incr i} { append res [string repeat { } $indent] append res [random_json $limit $indent] if {$i<$n-1} {append res ,} append res \n } incr indent -2 append res [string repeat { } $indent] append res \] return $res } } elseif {rand()>0.9} { if {rand()>0.7} {return "true"} if {rand()>0.5} {return "false"} return "null" } elseif {rand()>0.5} { return [random_numeric] } else { set res \" set n [expr {int(rand()*4)+1}] if {$n>=4} {set n [expr {$n+int(rand()*6)}]} for {set i 0} {$i<$n} {incr i} { if {rand()<0.05} { set w [random_numeric] } else { set k [expr {int(rand()*$nwordlist)}] set w [lindex $wordlist $k] } if {rand()<0.07} { set w \\\"$w\\\" } if {$i<$n-1} { switch [expr {int(rand()*9)}] { 0 {set sp {, }} 1 {set sp "\\n "} 2 {set sp "-"} default {set sp { }} } append res $w$sp } else { append res $w if {rand()<0.2} {append res .} } } return $res\" } } puts "CREATE TABLE IF NOT EXISTS data1(x JSON);" puts "BEGIN;" set sz 0 for {set i 0} {$sz<100000000} {incr i} { set j [random_json 7 0] incr sz [string length $j] puts "INSERT INTO data1(x) VALUES('$j');" } puts "COMMIT;" puts "SELECT sum(length(x)) FROM data1;"